* snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near @ 2015-07-21 8:52 Martin Geier 2015-07-23 7:19 ` Raymond Yau 2015-07-23 8:11 ` Takashi Iwai 0 siblings, 2 replies; 10+ messages in thread From: Martin Geier @ 2015-07-21 8:52 UTC (permalink / raw) To: alsa-devel [-- Attachment #1: Type: text/plain, Size: 2346 bytes --] Hallo, I tried to configure alsa device with snd_pcm_set_params function, requested parameters was: channel 2, rate: 22050, soft_resample: 1, latency: 50000 Function snd_pcm_hw_params_set_buffer_time_near and snd_pcm_hw_param_set_near is called with: min: 50000, max: 50000, mindir: 0, maxdir: -1 and input params was: ACCESS: RW_INTERLEAVED FORMAT: S16_LE SUBFORMAT: STD SAMPLE_BITS: 16 FRAME_BITS: 32 CHANNELS: 2 RATE: 22050 PERIOD_TIME: (362 743039) PERIOD_SIZE: [8 16384] PERIOD_BYTES: [32 65536] PERIODS: [2 19] BUFFER_TIME: (725 1486078) BUFFER_SIZE: [16 32768] BUFFER_BYTES: [64 131072] TICK_TIME: ALL unfortunately, this function fails, on function snd_pcm_hw_param_set_first: ALSA ERROR hw_params: set_near (BUFFER_TIME) value = 50000 : Invalid argument ACCESS: RW_INTERLEAVED FORMAT: S16_LE SUBFORMAT: STD SAMPLE_BITS: 16 FRAME_BITS: 32 CHANNELS: 2 RATE: 22050 PERIOD_TIME: (4580 5533) PERIOD_SIZE: NONE PERIOD_BYTES: [404 488] PERIODS: 10 BUFFER_TIME: (50022 50023) BUFFER_SIZE: 1103 BUFFER_BYTES: 4412 TICK_TIME: ALL This shouldn't be problem because in snd_pcm_set_params is snd_pcm_hw_params_set_period_time_near called. This function should be called with same params as snd_pcm_hw_params_set_buffer_time_near but the input params are: snd_pcm_hw_param_set_near: min: 12500, max: 12500, mindir: 0, maxdir: -1 hw_params: snd_pcm_hw_param_set_near (PERIOD_TIME) ACCESS: RW_INTERLEAVED FORMAT: S16_LE SUBFORMAT: STD SAMPLE_BITS: 16 FRAME_BITS: 32 CHANNELS: 2 RATE: 22050 PERIOD_TIME: (4580 5533) PERIOD_SIZE: NONE PERIOD_BYTES: [404 488] PERIODS: 10 BUFFER_TIME: (50022 50023) BUFFER_SIZE: 1103 BUFFER_BYTES: 4412 TICK_TIME: ALL because in snd_pcm_hw_param_set_near is if (last) err = snd_pcm_hw_param_set_last(pcm, params, var, val, dir); else err = snd_pcm_hw_param_set_first(pcm, params, var, val, dir); if (err < 0) dump_hw_params(params, "set_near", var, *val, err); return err; and in error part is only debug output and not restore original parameters. Environment: alsa-lib 1.0.27.1 TI AM335x soc Simple fix is attached, but I am not sure if it is correct. BR Martin Geier -- *StreamUnlimited* High Tech Campus Vienna, Gutheil-Schoder-Gasse 10, A-1102 Vienna, Austria Levocska 9, 851 01 Bratislava, Slovakia Email: martin.geier@streamunlimited.com www.streamunlimited.com [-- Attachment #2: 0001-patch-restore-params-if-snd_pcm_hw_param_set_near-met.patch --] [-- Type: text/x-patch, Size: 892 bytes --] >From 6a31c2f854b255b407ce2d52d233db00588d2e40 Mon Sep 17 00:00:00 2001 From: Martin Geier <martin.geier@streamunlimited.com> Date: Mon, 20 Jul 2015 08:59:54 +0200 Subject: [PATCH] restore params if snd_pcm_hw_param_set_near method failed Signed-off-by: Martin Geier <martin.geier@streamunlimited.com> --- pcm_params.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pcm/pcm_params.c b/src/pcm/pcm_params.c index 0b66e8c..57d98d8 100644 --- a/src/pcm/pcm_params.c +++ b/src/pcm/pcm_params.c @@ -872,8 +872,10 @@ int snd_pcm_hw_param_set_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, err = snd_pcm_hw_param_set_last(pcm, params, var, val, dir); else err = snd_pcm_hw_param_set_first(pcm, params, var, val, dir); - if (err < 0) + if (err < 0) { dump_hw_params(params, "set_near", var, *val, err); + *params = save; + } return err; } -- 1.9.1 [-- Attachment #3: Type: text/plain, Size: 0 bytes --] ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near 2015-07-21 8:52 snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near Martin Geier @ 2015-07-23 7:19 ` Raymond Yau 2015-07-23 7:33 ` Martin Geier 2015-07-23 8:11 ` Takashi Iwai 1 sibling, 1 reply; 10+ messages in thread From: Raymond Yau @ 2015-07-23 7:19 UTC (permalink / raw) To: Martin Geier; +Cc: ALSA Development Mailing List > > I tried to configure alsa device with snd_pcm_set_params function, requested > parameters was: > channel 2, rate: 22050, soft_resample: 1, latency: 50000 The function snd_pcm_set_params does not always succed especially you are using 22050Hz which is 20ms increment Which soc driver ? It is quite difficult to find the soutce by chip name https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/tree/sound/soc ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near 2015-07-23 7:19 ` Raymond Yau @ 2015-07-23 7:33 ` Martin Geier 0 siblings, 0 replies; 10+ messages in thread From: Martin Geier @ 2015-07-23 7:33 UTC (permalink / raw) To: Raymond Yau; +Cc: ALSA Development Mailing List I am using 'davinci' soc driver with board specific driver. On 23.07.2015 09:19, Raymond Yau wrote: > > > > > > I tried to configure alsa device with snd_pcm_set_params function, > requested > > parameters was: > > channel 2, rate: 22050, soft_resample: 1, latency: 50000 > > The function snd_pcm_set_params does not always succed especially you > are using 22050Hz which is 20ms increment > > Which soc driver ? It is quite difficult to find the soutce by chip name > > https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/tree/sound/soc > -- *StreamUnlimited* High Tech Campus Vienna, Gutheil-Schoder-Gasse 10, A-1102 Vienna, Austria Levocska 9, 851 01 Bratislava, Slovakia Email: martin.geier@streamunlimited.com www.streamunlimited.com ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near 2015-07-21 8:52 snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near Martin Geier 2015-07-23 7:19 ` Raymond Yau @ 2015-07-23 8:11 ` Takashi Iwai 2015-07-24 7:52 ` Martin Geier 1 sibling, 1 reply; 10+ messages in thread From: Takashi Iwai @ 2015-07-23 8:11 UTC (permalink / raw) To: Martin Geier; +Cc: alsa-devel On Tue, 21 Jul 2015 10:52:01 +0200, Martin Geier wrote: > > Hallo, > > I tried to configure alsa device with snd_pcm_set_params function, > requested > parameters was: > channel 2, rate: 22050, soft_resample: 1, latency: 50000 > > Function snd_pcm_hw_params_set_buffer_time_near and > snd_pcm_hw_param_set_near > is called with: > min: 50000, max: 50000, mindir: 0, maxdir: -1 > > and input params was: > > ACCESS: RW_INTERLEAVED > FORMAT: S16_LE > SUBFORMAT: STD > SAMPLE_BITS: 16 > FRAME_BITS: 32 > CHANNELS: 2 > RATE: 22050 > PERIOD_TIME: (362 743039) > PERIOD_SIZE: [8 16384] > PERIOD_BYTES: [32 65536] > PERIODS: [2 19] > BUFFER_TIME: (725 1486078) > BUFFER_SIZE: [16 32768] > BUFFER_BYTES: [64 131072] > TICK_TIME: ALL > > unfortunately, this function fails, on function snd_pcm_hw_param_set_first: > > ALSA ERROR hw_params: set_near (BUFFER_TIME) > value = 50000 : Invalid argument > ACCESS: RW_INTERLEAVED > FORMAT: S16_LE > SUBFORMAT: STD > SAMPLE_BITS: 16 > FRAME_BITS: 32 > CHANNELS: 2 > RATE: 22050 > PERIOD_TIME: (4580 5533) > PERIOD_SIZE: NONE > PERIOD_BYTES: [404 488] > PERIODS: 10 > BUFFER_TIME: (50022 50023) > BUFFER_SIZE: 1103 > BUFFER_BYTES: 4412 > TICK_TIME: ALL > > This shouldn't be problem because in snd_pcm_set_params is > snd_pcm_hw_params_set_period_time_near called. > This function should be called with same params as > snd_pcm_hw_params_set_buffer_time_near > but the input params are: > > snd_pcm_hw_param_set_near: min: 12500, max: 12500, mindir: 0, maxdir: -1 > hw_params: snd_pcm_hw_param_set_near (PERIOD_TIME) > ACCESS: RW_INTERLEAVED > FORMAT: S16_LE > SUBFORMAT: STD > SAMPLE_BITS: 16 > FRAME_BITS: 32 > CHANNELS: 2 > RATE: 22050 > PERIOD_TIME: (4580 5533) > PERIOD_SIZE: NONE > PERIOD_BYTES: [404 488] > PERIODS: 10 > BUFFER_TIME: (50022 50023) > BUFFER_SIZE: 1103 > BUFFER_BYTES: 4412 > TICK_TIME: ALL > > because in snd_pcm_hw_param_set_near is > > if (last) > err = snd_pcm_hw_param_set_last(pcm, params, var, val, dir); > else > err = snd_pcm_hw_param_set_first(pcm, params, var, val, dir); > if (err < 0) > dump_hw_params(params, "set_near", var, *val, err); > return err; > > and in error part is only debug output and not restore original parameters. > > Environment: > alsa-lib 1.0.27.1 > TI AM335x soc > > Simple fix is attached, but I am not sure if it is correct. Thanks for analysis and patch. It's however rather a bug in snd_pcm_set_params(). There is no guarantee to keep the old value in snd_pcm_set_*(), thus the caller needs to take care of it instead. Takashi ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near 2015-07-23 8:11 ` Takashi Iwai @ 2015-07-24 7:52 ` Martin Geier 2015-07-24 8:21 ` Takashi Iwai 0 siblings, 1 reply; 10+ messages in thread From: Martin Geier @ 2015-07-24 7:52 UTC (permalink / raw) To: Takashi Iwai; +Cc: alsa-devel [-- Attachment #1: Type: text/plain, Size: 3302 bytes --] Thanks for help, in attachment is patch with suggest change. Is the patch acceptable? Martin On 23.07.2015 10:11, Takashi Iwai wrote: > On Tue, 21 Jul 2015 10:52:01 +0200, > Martin Geier wrote: >> Hallo, >> >> I tried to configure alsa device with snd_pcm_set_params function, >> requested >> parameters was: >> channel 2, rate: 22050, soft_resample: 1, latency: 50000 >> >> Function snd_pcm_hw_params_set_buffer_time_near and >> snd_pcm_hw_param_set_near >> is called with: >> min: 50000, max: 50000, mindir: 0, maxdir: -1 >> >> and input params was: >> >> ACCESS: RW_INTERLEAVED >> FORMAT: S16_LE >> SUBFORMAT: STD >> SAMPLE_BITS: 16 >> FRAME_BITS: 32 >> CHANNELS: 2 >> RATE: 22050 >> PERIOD_TIME: (362 743039) >> PERIOD_SIZE: [8 16384] >> PERIOD_BYTES: [32 65536] >> PERIODS: [2 19] >> BUFFER_TIME: (725 1486078) >> BUFFER_SIZE: [16 32768] >> BUFFER_BYTES: [64 131072] >> TICK_TIME: ALL >> >> unfortunately, this function fails, on function snd_pcm_hw_param_set_first: >> >> ALSA ERROR hw_params: set_near (BUFFER_TIME) >> value = 50000 : Invalid argument >> ACCESS: RW_INTERLEAVED >> FORMAT: S16_LE >> SUBFORMAT: STD >> SAMPLE_BITS: 16 >> FRAME_BITS: 32 >> CHANNELS: 2 >> RATE: 22050 >> PERIOD_TIME: (4580 5533) >> PERIOD_SIZE: NONE >> PERIOD_BYTES: [404 488] >> PERIODS: 10 >> BUFFER_TIME: (50022 50023) >> BUFFER_SIZE: 1103 >> BUFFER_BYTES: 4412 >> TICK_TIME: ALL >> >> This shouldn't be problem because in snd_pcm_set_params is >> snd_pcm_hw_params_set_period_time_near called. >> This function should be called with same params as >> snd_pcm_hw_params_set_buffer_time_near >> but the input params are: >> >> snd_pcm_hw_param_set_near: min: 12500, max: 12500, mindir: 0, maxdir: -1 >> hw_params: snd_pcm_hw_param_set_near (PERIOD_TIME) >> ACCESS: RW_INTERLEAVED >> FORMAT: S16_LE >> SUBFORMAT: STD >> SAMPLE_BITS: 16 >> FRAME_BITS: 32 >> CHANNELS: 2 >> RATE: 22050 >> PERIOD_TIME: (4580 5533) >> PERIOD_SIZE: NONE >> PERIOD_BYTES: [404 488] >> PERIODS: 10 >> BUFFER_TIME: (50022 50023) >> BUFFER_SIZE: 1103 >> BUFFER_BYTES: 4412 >> TICK_TIME: ALL >> >> because in snd_pcm_hw_param_set_near is >> >> if (last) >> err = snd_pcm_hw_param_set_last(pcm, params, var, val, dir); >> else >> err = snd_pcm_hw_param_set_first(pcm, params, var, val, dir); >> if (err < 0) >> dump_hw_params(params, "set_near", var, *val, err); >> return err; >> >> and in error part is only debug output and not restore original parameters. >> >> Environment: >> alsa-lib 1.0.27.1 >> TI AM335x soc >> >> Simple fix is attached, but I am not sure if it is correct. > Thanks for analysis and patch. It's however rather a bug in > snd_pcm_set_params(). There is no guarantee to keep the old value in > snd_pcm_set_*(), thus the caller needs to take care of it instead. > > > Takashi > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@alsa-project.org > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel -- *StreamUnlimited* High Tech Campus Vienna, Gutheil-Schoder-Gasse 10, A-1102 Vienna, Austria Levocska 9, 851 01 Bratislava, Slovakia Email: martin.geier@streamunlimited.com www.streamunlimited.com Meet us at: IFA - Berlin, 4-9 September 2015 HK Electronics - Hong Kong, 13-16 October 2015 CEDIA - Dallas, 14-17 October 2015 [-- Attachment #2: 0001-PATCH-restore-hw-params-on-set-rate-failed.patch --] [-- Type: text/x-patch, Size: 1298 bytes --] >From 2d4e94d974678bbd4826b33c59c275d1f34edc20 Mon Sep 17 00:00:00 2001 From: Martin Geier <martin.geier@streamunlimited.com> Date: Fri, 24 Jul 2015 09:30:57 +0200 Subject: [PATCH] restore hw params on set rate failed --- pcm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c index ca4d416..b6de73e 100644 --- a/src/pcm/pcm.c +++ b/src/pcm/pcm.c @@ -7883,7 +7883,7 @@ int snd_pcm_set_params(snd_pcm_t *pcm, int soft_resample, unsigned int latency) { - snd_pcm_hw_params_t *params; + snd_pcm_hw_params_t *params, pparams; snd_pcm_sw_params_t *swparams; const char *s = snd_pcm_stream_name(snd_pcm_stream(pcm)); snd_pcm_uframes_t buffer_size, period_size; @@ -7936,9 +7936,11 @@ int snd_pcm_set_params(snd_pcm_t *pcm, return -EINVAL; } /* set the buffer time */ + pparams = *params; err = INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(pcm, params, &latency, NULL); if (err < 0) { /* error path -> set period size as first */ + *params = pparams; /* set the period time */ period_time = latency / 4; err = INTERNAL(snd_pcm_hw_params_set_period_time_near)(pcm, params, &period_time, NULL); -- 1.9.1 [-- Attachment #3: Type: text/plain, Size: 0 bytes --] ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near 2015-07-24 7:52 ` Martin Geier @ 2015-07-24 8:21 ` Takashi Iwai 2015-07-24 11:16 ` Martin Geier 0 siblings, 1 reply; 10+ messages in thread From: Takashi Iwai @ 2015-07-24 8:21 UTC (permalink / raw) To: Martin Geier; +Cc: alsa-devel On Fri, 24 Jul 2015 09:52:14 +0200, Martin Geier wrote: > > Thanks for help, > > in attachment is patch with suggest change. > Is the patch acceptable? I prefer a bit clearer name like params_saved or such, but yes, it's what I had in my mind, too. Could you tidy it up and resubmit with the more description -- why it's needed and what does it? Last but not least, it'd be helpful if you give also signed-off-by tag. thanks, Takashi > > Martin > > On 23.07.2015 10:11, Takashi Iwai wrote: > > On Tue, 21 Jul 2015 10:52:01 +0200, > > Martin Geier wrote: > >> Hallo, > >> > >> I tried to configure alsa device with snd_pcm_set_params function, > >> requested > >> parameters was: > >> channel 2, rate: 22050, soft_resample: 1, latency: 50000 > >> > >> Function snd_pcm_hw_params_set_buffer_time_near and > >> snd_pcm_hw_param_set_near > >> is called with: > >> min: 50000, max: 50000, mindir: 0, maxdir: -1 > >> > >> and input params was: > >> > >> ACCESS: RW_INTERLEAVED > >> FORMAT: S16_LE > >> SUBFORMAT: STD > >> SAMPLE_BITS: 16 > >> FRAME_BITS: 32 > >> CHANNELS: 2 > >> RATE: 22050 > >> PERIOD_TIME: (362 743039) > >> PERIOD_SIZE: [8 16384] > >> PERIOD_BYTES: [32 65536] > >> PERIODS: [2 19] > >> BUFFER_TIME: (725 1486078) > >> BUFFER_SIZE: [16 32768] > >> BUFFER_BYTES: [64 131072] > >> TICK_TIME: ALL > >> > >> unfortunately, this function fails, on function snd_pcm_hw_param_set_first: > >> > >> ALSA ERROR hw_params: set_near (BUFFER_TIME) > >> value = 50000 : Invalid argument > >> ACCESS: RW_INTERLEAVED > >> FORMAT: S16_LE > >> SUBFORMAT: STD > >> SAMPLE_BITS: 16 > >> FRAME_BITS: 32 > >> CHANNELS: 2 > >> RATE: 22050 > >> PERIOD_TIME: (4580 5533) > >> PERIOD_SIZE: NONE > >> PERIOD_BYTES: [404 488] > >> PERIODS: 10 > >> BUFFER_TIME: (50022 50023) > >> BUFFER_SIZE: 1103 > >> BUFFER_BYTES: 4412 > >> TICK_TIME: ALL > >> > >> This shouldn't be problem because in snd_pcm_set_params is > >> snd_pcm_hw_params_set_period_time_near called. > >> This function should be called with same params as > >> snd_pcm_hw_params_set_buffer_time_near > >> but the input params are: > >> > >> snd_pcm_hw_param_set_near: min: 12500, max: 12500, mindir: 0, maxdir: -1 > >> hw_params: snd_pcm_hw_param_set_near (PERIOD_TIME) > >> ACCESS: RW_INTERLEAVED > >> FORMAT: S16_LE > >> SUBFORMAT: STD > >> SAMPLE_BITS: 16 > >> FRAME_BITS: 32 > >> CHANNELS: 2 > >> RATE: 22050 > >> PERIOD_TIME: (4580 5533) > >> PERIOD_SIZE: NONE > >> PERIOD_BYTES: [404 488] > >> PERIODS: 10 > >> BUFFER_TIME: (50022 50023) > >> BUFFER_SIZE: 1103 > >> BUFFER_BYTES: 4412 > >> TICK_TIME: ALL > >> > >> because in snd_pcm_hw_param_set_near is > >> > >> if (last) > >> err = snd_pcm_hw_param_set_last(pcm, params, var, val, dir); > >> else > >> err = snd_pcm_hw_param_set_first(pcm, params, var, val, dir); > >> if (err < 0) > >> dump_hw_params(params, "set_near", var, *val, err); > >> return err; > >> > >> and in error part is only debug output and not restore original parameters. > >> > >> Environment: > >> alsa-lib 1.0.27.1 > >> TI AM335x soc > >> > >> Simple fix is attached, but I am not sure if it is correct. > > Thanks for analysis and patch. It's however rather a bug in > > snd_pcm_set_params(). There is no guarantee to keep the old value in > > snd_pcm_set_*(), thus the caller needs to take care of it instead. > > > > > > Takashi > > _______________________________________________ > > Alsa-devel mailing list > > Alsa-devel@alsa-project.org > > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel > > -- > *StreamUnlimited* > High Tech Campus Vienna, Gutheil-Schoder-Gasse 10, A-1102 Vienna, Austria > Levocska 9, 851 01 Bratislava, Slovakia > Email: martin.geier@streamunlimited.com > www.streamunlimited.com > > Meet us at: > IFA - Berlin, 4-9 September 2015 > HK Electronics - Hong Kong, 13-16 October 2015 > CEDIA - Dallas, 14-17 October 2015 > [1.2 <text/html; windows-1252 (7bit)>] > > >From 2d4e94d974678bbd4826b33c59c275d1f34edc20 Mon Sep 17 00:00:00 2001 > From: Martin Geier <martin.geier@streamunlimited.com> > Date: Fri, 24 Jul 2015 09:30:57 +0200 > Subject: [PATCH] restore hw params on set rate failed > > --- > pcm.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c > index ca4d416..b6de73e 100644 > --- a/src/pcm/pcm.c > +++ b/src/pcm/pcm.c > @@ -7883,7 +7883,7 @@ int snd_pcm_set_params(snd_pcm_t *pcm, > int soft_resample, > unsigned int latency) > { > - snd_pcm_hw_params_t *params; > + snd_pcm_hw_params_t *params, pparams; > snd_pcm_sw_params_t *swparams; > const char *s = snd_pcm_stream_name(snd_pcm_stream(pcm)); > snd_pcm_uframes_t buffer_size, period_size; > @@ -7936,9 +7936,11 @@ int snd_pcm_set_params(snd_pcm_t *pcm, > return -EINVAL; > } > /* set the buffer time */ > + pparams = *params; > err = INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(pcm, params, &latency, NULL); > if (err < 0) { > /* error path -> set period size as first */ > + *params = pparams; > /* set the period time */ > period_time = latency / 4; > err = INTERNAL(snd_pcm_hw_params_set_period_time_near)(pcm, params, &period_time, NULL); > -- > 1.9.1 > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near 2015-07-24 8:21 ` Takashi Iwai @ 2015-07-24 11:16 ` Martin Geier 2015-07-25 2:01 ` Raymond Yau 0 siblings, 1 reply; 10+ messages in thread From: Martin Geier @ 2015-07-24 11:16 UTC (permalink / raw) To: Takashi Iwai; +Cc: alsa-devel [-- Attachment #1: Type: text/plain, Size: 5813 bytes --] Patch with fixed name and description. Martin On 24.07.2015 10:21, Takashi Iwai wrote: > On Fri, 24 Jul 2015 09:52:14 +0200, > Martin Geier wrote: >> Thanks for help, >> >> in attachment is patch with suggest change. >> Is the patch acceptable? > I prefer a bit clearer name like params_saved or such, but yes, it's > what I had in my mind, too. Could you tidy it up and resubmit with > the more description -- why it's needed and what does it? Last but > not least, it'd be helpful if you give also signed-off-by tag. > > > thanks, > > Takashi > >> Martin >> >> On 23.07.2015 10:11, Takashi Iwai wrote: >>> On Tue, 21 Jul 2015 10:52:01 +0200, >>> Martin Geier wrote: >>>> Hallo, >>>> >>>> I tried to configure alsa device with snd_pcm_set_params function, >>>> requested >>>> parameters was: >>>> channel 2, rate: 22050, soft_resample: 1, latency: 50000 >>>> >>>> Function snd_pcm_hw_params_set_buffer_time_near and >>>> snd_pcm_hw_param_set_near >>>> is called with: >>>> min: 50000, max: 50000, mindir: 0, maxdir: -1 >>>> >>>> and input params was: >>>> >>>> ACCESS: RW_INTERLEAVED >>>> FORMAT: S16_LE >>>> SUBFORMAT: STD >>>> SAMPLE_BITS: 16 >>>> FRAME_BITS: 32 >>>> CHANNELS: 2 >>>> RATE: 22050 >>>> PERIOD_TIME: (362 743039) >>>> PERIOD_SIZE: [8 16384] >>>> PERIOD_BYTES: [32 65536] >>>> PERIODS: [2 19] >>>> BUFFER_TIME: (725 1486078) >>>> BUFFER_SIZE: [16 32768] >>>> BUFFER_BYTES: [64 131072] >>>> TICK_TIME: ALL >>>> >>>> unfortunately, this function fails, on function snd_pcm_hw_param_set_first: >>>> >>>> ALSA ERROR hw_params: set_near (BUFFER_TIME) >>>> value = 50000 : Invalid argument >>>> ACCESS: RW_INTERLEAVED >>>> FORMAT: S16_LE >>>> SUBFORMAT: STD >>>> SAMPLE_BITS: 16 >>>> FRAME_BITS: 32 >>>> CHANNELS: 2 >>>> RATE: 22050 >>>> PERIOD_TIME: (4580 5533) >>>> PERIOD_SIZE: NONE >>>> PERIOD_BYTES: [404 488] >>>> PERIODS: 10 >>>> BUFFER_TIME: (50022 50023) >>>> BUFFER_SIZE: 1103 >>>> BUFFER_BYTES: 4412 >>>> TICK_TIME: ALL >>>> >>>> This shouldn't be problem because in snd_pcm_set_params is >>>> snd_pcm_hw_params_set_period_time_near called. >>>> This function should be called with same params as >>>> snd_pcm_hw_params_set_buffer_time_near >>>> but the input params are: >>>> >>>> snd_pcm_hw_param_set_near: min: 12500, max: 12500, mindir: 0, maxdir: -1 >>>> hw_params: snd_pcm_hw_param_set_near (PERIOD_TIME) >>>> ACCESS: RW_INTERLEAVED >>>> FORMAT: S16_LE >>>> SUBFORMAT: STD >>>> SAMPLE_BITS: 16 >>>> FRAME_BITS: 32 >>>> CHANNELS: 2 >>>> RATE: 22050 >>>> PERIOD_TIME: (4580 5533) >>>> PERIOD_SIZE: NONE >>>> PERIOD_BYTES: [404 488] >>>> PERIODS: 10 >>>> BUFFER_TIME: (50022 50023) >>>> BUFFER_SIZE: 1103 >>>> BUFFER_BYTES: 4412 >>>> TICK_TIME: ALL >>>> >>>> because in snd_pcm_hw_param_set_near is >>>> >>>> if (last) >>>> err = snd_pcm_hw_param_set_last(pcm, params, var, val, dir); >>>> else >>>> err = snd_pcm_hw_param_set_first(pcm, params, var, val, dir); >>>> if (err < 0) >>>> dump_hw_params(params, "set_near", var, *val, err); >>>> return err; >>>> >>>> and in error part is only debug output and not restore original parameters. >>>> >>>> Environment: >>>> alsa-lib 1.0.27.1 >>>> TI AM335x soc >>>> >>>> Simple fix is attached, but I am not sure if it is correct. >>> Thanks for analysis and patch. It's however rather a bug in >>> snd_pcm_set_params(). There is no guarantee to keep the old value in >>> snd_pcm_set_*(), thus the caller needs to take care of it instead. >>> >>> >>> Takashi >>> _______________________________________________ >>> Alsa-devel mailing list >>> Alsa-devel@alsa-project.org >>> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel >> -- >> *StreamUnlimited* >> High Tech Campus Vienna, Gutheil-Schoder-Gasse 10, A-1102 Vienna, Austria >> Levocska 9, 851 01 Bratislava, Slovakia >> Email: martin.geier@streamunlimited.com >> www.streamunlimited.com >> >> Meet us at: >> IFA - Berlin, 4-9 September 2015 >> HK Electronics - Hong Kong, 13-16 October 2015 >> CEDIA - Dallas, 14-17 October 2015 >> [1.2 <text/html; windows-1252 (7bit)>] >> >> >From 2d4e94d974678bbd4826b33c59c275d1f34edc20 Mon Sep 17 00:00:00 2001 >> From: Martin Geier <martin.geier@streamunlimited.com> >> Date: Fri, 24 Jul 2015 09:30:57 +0200 >> Subject: [PATCH] restore hw params on set rate failed >> >> --- >> pcm.c | 4 +++- >> 1 file changed, 3 insertions(+), 1 deletion(-) >> >> diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c >> index ca4d416..b6de73e 100644 >> --- a/src/pcm/pcm.c >> +++ b/src/pcm/pcm.c >> @@ -7883,7 +7883,7 @@ int snd_pcm_set_params(snd_pcm_t *pcm, >> int soft_resample, >> unsigned int latency) >> { >> - snd_pcm_hw_params_t *params; >> + snd_pcm_hw_params_t *params, pparams; >> snd_pcm_sw_params_t *swparams; >> const char *s = snd_pcm_stream_name(snd_pcm_stream(pcm)); >> snd_pcm_uframes_t buffer_size, period_size; >> @@ -7936,9 +7936,11 @@ int snd_pcm_set_params(snd_pcm_t *pcm, >> return -EINVAL; >> } >> /* set the buffer time */ >> + pparams = *params; >> err = INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(pcm, params, &latency, NULL); >> if (err < 0) { >> /* error path -> set period size as first */ >> + *params = pparams; >> /* set the period time */ >> period_time = latency / 4; >> err = INTERNAL(snd_pcm_hw_params_set_period_time_near)(pcm, params, &period_time, NULL); >> -- >> 1.9.1 >> -- *StreamUnlimited* High Tech Campus Vienna, Gutheil-Schoder-Gasse 10, A-1102 Vienna, Austria Levocska 9, 851 01 Bratislava, Slovakia Email: martin.geier@streamunlimited.com www.streamunlimited.com Meet us at: IFA - Berlin, 4-9 September 2015 HK Electronics - Hong Kong, 13-16 October 2015 CEDIA - Dallas, 14-17 October 2015 [-- Attachment #2: 0001-PATCH-restore-hw-params-on-set-latency-failed.patch --] [-- Type: text/x-patch, Size: 1665 bytes --] >From 2d4e94d974678bbd4826b33c59c275d1f34edc20 Mon Sep 17 00:00:00 2001 From: Martin Geier <martin.geier@streamunlimited.com> Date: Fri, 24 Jul 2015 09:30:57 +0200 Subject: [PATCH] restore hw params on set latency failed When method snd_pcm_set_params sets sample rate to 22050 and latency to 50000 to davinci soc driver method snd_pcm_hw_params_set_buffer_time_near fails and variable params is already changed in the method so the next method snd_pcm_hw_params_set_period_time_near fails also. Signed-off-by: Martin Geier <martin.geier@streamunlimited.com> --- src/pcm/pcm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c index ca4d416..b6de73e 100644 --- a/src/pcm/pcm.c +++ b/src/pcm/pcm.c @@ -7883,7 +7883,7 @@ int snd_pcm_set_params(snd_pcm_t *pcm, int soft_resample, unsigned int latency) { - snd_pcm_hw_params_t *params; + snd_pcm_hw_params_t *params, params_saved; snd_pcm_sw_params_t *swparams; const char *s = snd_pcm_stream_name(snd_pcm_stream(pcm)); snd_pcm_uframes_t buffer_size, period_size; @@ -7936,9 +7936,11 @@ int snd_pcm_set_params(snd_pcm_t *pcm, return -EINVAL; } /* set the buffer time */ + params_saved = *params; err = INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(pcm, params, &latency, NULL); if (err < 0) { /* error path -> set period size as first */ + *params = params_saved; /* set the period time */ period_time = latency / 4; err = INTERNAL(snd_pcm_hw_params_set_period_time_near)(pcm, params, &period_time, NULL); -- 1.9.1 [-- Attachment #3: Type: text/plain, Size: 0 bytes --] ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near 2015-07-24 11:16 ` Martin Geier @ 2015-07-25 2:01 ` Raymond Yau 2015-07-27 7:12 ` Martin Geier 0 siblings, 1 reply; 10+ messages in thread From: Raymond Yau @ 2015-07-25 2:01 UTC (permalink / raw) To: Martin Geier; +Cc: Takashi Iwai, ALSA Development Mailing List 2015-07-24 19:16 GMT+08:00 Martin Geier <martin.geier@streamunlimited.com>: > Patch with fixed name and description. > > Martin > > > > On 24.07.2015 10:21, Takashi Iwai wrote: > >> On Fri, 24 Jul 2015 09:52:14 +0200, >> Martin Geier wrote: >> >>> Thanks for help, >>> >>> in attachment is patch with suggest change. >>> Is the patch acceptable? >>> >> I prefer a bit clearer name like params_saved or such, but yes, it's >> what I had in my mind, too. Could you tidy it up and resubmit with >> the more description -- why it's needed and what does it? Last but >> not least, it'd be helpful if you give also signed-off-by tag. >> >> >> thanks, >> >> Takashi >> >> Martin >>> >>> On 23.07.2015 10:11, Takashi Iwai wrote: >>> >>>> On Tue, 21 Jul 2015 10:52:01 +0200, >>>> Martin Geier wrote: >>>> >>>>> Hallo, >>>>> >>>>> I tried to configure alsa device with snd_pcm_set_params function, >>>>> requested >>>>> parameters was: >>>>> channel 2, rate: 22050, soft_resample: 1, latency: 50000 >>>>> >>>>> Function snd_pcm_hw_params_set_buffer_time_near and >>>>> snd_pcm_hw_param_set_near >>>>> is called with: >>>>> min: 50000, max: 50000, mindir: 0, maxdir: -1 >>>>> >>>>> and input params was: >>>>> >>>>> ACCESS: RW_INTERLEAVED >>>>> FORMAT: S16_LE >>>>> SUBFORMAT: STD >>>>> SAMPLE_BITS: 16 >>>>> FRAME_BITS: 32 >>>>> CHANNELS: 2 >>>>> RATE: 22050 >>>>> PERIOD_TIME: (362 743039) >>>>> PERIOD_SIZE: [8 16384] >>>>> PERIOD_BYTES: [32 65536] >>>>> PERIODS: [2 19] >>>>> BUFFER_TIME: (725 1486078) >>>>> BUFFER_SIZE: [16 32768] >>>>> BUFFER_BYTES: [64 131072] >>>>> TICK_TIME: ALL >>>>> >>>>> unfortunately, this function fails, on function >>>>> snd_pcm_hw_param_set_first: >>>>> >>>>> ALSA ERROR hw_params: set_near (BUFFER_TIME) >>>>> value = 50000 : Invalid argument >>>>> ACCESS: RW_INTERLEAVED >>>>> FORMAT: S16_LE >>>>> SUBFORMAT: STD >>>>> SAMPLE_BITS: 16 >>>>> FRAME_BITS: 32 >>>>> CHANNELS: 2 >>>>> RATE: 22050 >>>>> PERIOD_TIME: (4580 5533) >>>>> PERIOD_SIZE: NONE >>>>> PERIOD_BYTES: [404 488] >>>>> PERIODS: 10 >>>>> BUFFER_TIME: (50022 50023) >>>>> BUFFER_SIZE: 1103 >>>>> BUFFER_BYTES: 4412 >>>>> TICK_TIME: ALL >>>>> >>>>> This shouldn't be problem because in snd_pcm_set_params is >>>>> snd_pcm_hw_params_set_period_time_near called. >>>>> This function should be called with same params as >>>>> snd_pcm_hw_params_set_buffer_time_near >>>>> but the input params are: >>>>> >>>>> snd_pcm_hw_param_set_near: min: 12500, max: 12500, mindir: 0, maxdir: >>>>> -1 >>>>> hw_params: snd_pcm_hw_param_set_near (PERIOD_TIME) >>>>> ACCESS: RW_INTERLEAVED >>>>> FORMAT: S16_LE >>>>> SUBFORMAT: STD >>>>> SAMPLE_BITS: 16 >>>>> FRAME_BITS: 32 >>>>> CHANNELS: 2 >>>>> RATE: 22050 >>>>> PERIOD_TIME: (4580 5533) >>>>> PERIOD_SIZE: NONE >>>>> PERIOD_BYTES: [404 488] >>>>> PERIODS: 10 >>>>> BUFFER_TIME: (50022 50023) >>>>> BUFFER_SIZE: 1103 >>>>> BUFFER_BYTES: 4412 >>>>> TICK_TIME: ALL >>>>> >>>> What is the period time and buffer time after applied your patch ? Are latency always <= 50ms ? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near 2015-07-25 2:01 ` Raymond Yau @ 2015-07-27 7:12 ` Martin Geier 2015-07-27 8:36 ` Raymond Yau 0 siblings, 1 reply; 10+ messages in thread From: Martin Geier @ 2015-07-27 7:12 UTC (permalink / raw) To: Raymond Yau; +Cc: Takashi Iwai, ALSA Development Mailing List Hi Raymond, Output parameters with custom logs: set_buffer_time_near: -22 set period time: 12517 get period size: 276 set buffer size: 1104 get buffer size: 1104 ACCESS: RW_INTERLEAVED FORMAT: S16_LE SUBFORMAT: STD SAMPLE_BITS: 16 FRAME_BITS: 32 CHANNELS: 2 RATE: 22050 PERIOD_TIME: (12517 12518) PERIOD_SIZE: 276 PERIOD_BYTES: 1104 PERIODS: 4 BUFFER_TIME: (50068 50069) BUFFER_SIZE: 1104 BUFFER_BYTES: 4416 What do you mean, are latency always <= 50ms? In what cases? Martin On 25.07.2015 04:01, Raymond Yau wrote: > > > 2015-07-24 19:16 GMT+08:00 Martin Geier > <martin.geier@streamunlimited.com > <mailto:martin.geier@streamunlimited.com>>: > > Patch with fixed name and description. > > Martin > > > > On 24.07.2015 10:21, Takashi Iwai wrote: > > On Fri, 24 Jul 2015 09:52:14 +0200, > Martin Geier wrote: > > Thanks for help, > > in attachment is patch with suggest change. > Is the patch acceptable? > > I prefer a bit clearer name like params_saved or such, but > yes, it's > what I had in my mind, too. Could you tidy it up and resubmit > with > the more description -- why it's needed and what does it? > Last but > not least, it'd be helpful if you give also signed-off-by tag. > > > thanks, > > Takashi > > Martin > > On 23.07.2015 10:11, Takashi Iwai wrote: > > On Tue, 21 Jul 2015 10:52:01 +0200, > Martin Geier wrote: > > Hallo, > > I tried to configure alsa device with > snd_pcm_set_params function, > requested > parameters was: > channel 2, rate: 22050, soft_resample: 1, latency: > 50000 > > Function snd_pcm_hw_params_set_buffer_time_near and > snd_pcm_hw_param_set_near > is called with: > min: 50000, max: 50000, mindir: 0, maxdir: -1 > > and input params was: > > ACCESS: RW_INTERLEAVED > FORMAT: S16_LE > SUBFORMAT: STD > SAMPLE_BITS: 16 > FRAME_BITS: 32 > CHANNELS: 2 > RATE: 22050 > PERIOD_TIME: (362 743039) > PERIOD_SIZE: [8 16384] > PERIOD_BYTES: [32 65536] > PERIODS: [2 19] > BUFFER_TIME: (725 1486078) > BUFFER_SIZE: [16 32768] > BUFFER_BYTES: [64 131072] > TICK_TIME: ALL > > unfortunately, this function fails, on function > snd_pcm_hw_param_set_first: > > ALSA ERROR hw_params: set_near (BUFFER_TIME) > value = 50000 : Invalid argument > ACCESS: RW_INTERLEAVED > FORMAT: S16_LE > SUBFORMAT: STD > SAMPLE_BITS: 16 > FRAME_BITS: 32 > CHANNELS: 2 > RATE: 22050 > PERIOD_TIME: (4580 5533) > PERIOD_SIZE: NONE > PERIOD_BYTES: [404 488] > PERIODS: 10 > BUFFER_TIME: (50022 50023) > BUFFER_SIZE: 1103 > BUFFER_BYTES: 4412 > TICK_TIME: ALL > > This shouldn't be problem because in > snd_pcm_set_params is > snd_pcm_hw_params_set_period_time_near called. > This function should be called with same params as > snd_pcm_hw_params_set_buffer_time_near > but the input params are: > > snd_pcm_hw_param_set_near: min: 12500, max: 12500, > mindir: 0, maxdir: -1 > hw_params: snd_pcm_hw_param_set_near (PERIOD_TIME) > ACCESS: RW_INTERLEAVED > FORMAT: S16_LE > SUBFORMAT: STD > SAMPLE_BITS: 16 > FRAME_BITS: 32 > CHANNELS: 2 > RATE: 22050 > PERIOD_TIME: (4580 5533) > PERIOD_SIZE: NONE > PERIOD_BYTES: [404 488] > PERIODS: 10 > BUFFER_TIME: (50022 50023) > BUFFER_SIZE: 1103 > BUFFER_BYTES: 4412 > TICK_TIME: ALL > > > > What is the period time and buffer time after applied your patch ? > > Are latency always <= 50ms ? -- *StreamUnlimited* High Tech Campus Vienna, Gutheil-Schoder-Gasse 10, A-1102 Vienna, Austria Levocska 9, 851 01 Bratislava, Slovakia Email: martin.geier@streamunlimited.com www.streamunlimited.com Meet us at: IFA - Berlin, 4-9 September 2015 HK Electronics - Hong Kong, 13-16 October 2015 CEDIA - Dallas, 14-17 October 2015 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near 2015-07-27 7:12 ` Martin Geier @ 2015-07-27 8:36 ` Raymond Yau 0 siblings, 0 replies; 10+ messages in thread From: Raymond Yau @ 2015-07-27 8:36 UTC (permalink / raw) To: Martin Geier; +Cc: Takashi Iwai, ALSA Development Mailing List 2015-7-27 下午3:12於 "Martin Geier" <martin.geier@streamunlimited.com>寫道: > > Hi Raymond, > > Output parameters with custom logs: > set_buffer_time_near: -22 > set period time: 12517 > get period size: 276 > set buffer size: 1104 > get buffer size: 1104 > > > ACCESS: RW_INTERLEAVED > FORMAT: S16_LE > SUBFORMAT: STD > SAMPLE_BITS: 16 > FRAME_BITS: 32 > CHANNELS: 2 > RATE: 22050 > PERIOD_TIME: (12517 12518) > PERIOD_SIZE: 276 > PERIOD_BYTES: 1104 > PERIODS: 4 > BUFFER_TIME: (50068 50069) > BUFFER_SIZE: 1104 > BUFFER_BYTES: 4416 > > What do you mean, are latency always <= 50ms? In what cases? http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#ga45d50841b307f2156fce1857bfac228c Set the hardware and software parameters in a simple way. Parameters:pcm PCM handle format required PCM format access required PCM access channels required PCM channels rate required sample rate in Hz soft_resample 0 = disallow alsa-lib resample stream, 1 = allow resampling latency required overall latency in us Refer to your result seem latency only close to 50ms _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-07-27 8:36 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-07-21 8:52 snd_pcm_set_params faild on set_buffer_time_near and set_period_time_near Martin Geier 2015-07-23 7:19 ` Raymond Yau 2015-07-23 7:33 ` Martin Geier 2015-07-23 8:11 ` Takashi Iwai 2015-07-24 7:52 ` Martin Geier 2015-07-24 8:21 ` Takashi Iwai 2015-07-24 11:16 ` Martin Geier 2015-07-25 2:01 ` Raymond Yau 2015-07-27 7:12 ` Martin Geier 2015-07-27 8:36 ` Raymond Yau
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.