[alsa-devel] GIT: Regarding the issue we are facing in the commit 37728639ae05de702825d96bd1d42e24ae772248
vanitha.channaiah at in.bosch.com
vanitha.channaiah at in.bosch.com
Mon Jul 1 12:28:11 CEST 2019
This mail is regarding the fix at below:
commit 37728639ae05de702825d96bd1d42e24ae772248
Author: Jaroslav Kysela <perex at perex.cz>
Date: Sat Feb 7 15:01:31 2004 +00
The commit has following changes :
******************************* code *****************************************
static int snd_pcm_rate_hw_refine_cchange(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
snd_pcm_hw_params_t *sparams)
{
+ buffer_size = snd_pcm_hw_param_get_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE);
+ /*
+ * this condition probably needs more work:
+ * in case when the buffer_size is known and we are looking
+ * for best period_size, we should prefer situation when
+ * (buffer_size / period_size) * period_size == buffer_size
+ */
+ if (snd_interval_single(buffer_size) && buffer_size->integer) {
+ snd_interval_t *period_size;
+ period_size = (snd_interval_t *)snd_pcm_hw_param_get_interval(params, SND_PCM_HW_PARAM_PERIOD_SIZE);
+ if (!snd_interval_checkempty(period_size) &&
+ period_size->openmin && period_size->openmax &&
+ period_size->min + 1 == period_size->max) {
+ if ((buffer_size->min / period_size->min) * period_size->min == buffer_size->min) {
+ snd_interval_set_value(period_size, period_size->min);
+ } else if ((buffer_size->max / period_size->max) * period_size->max == buffer_size->max) {
+ snd_interval_set_value(period_size, period_size->max);
+ }
+ }
+ }
}
******************************* code ****************************************
Update rate depending on period_size and period_time.
Issue found in Hardware :
a. RCAR salvator-xs which supports 2 channel.
b. IMX which supports 8 channel.
1. Usecase which is PASSED without the mentioned commit and FAILED with the commit.
For the usecase with below command : rate = 11025 channel = 6
$aplay -Dentertainment_main -r11025 -c6 -fS16_LE /dev/urandom
a. With the commit:
In the calculation of RATE at Rule 7:
RATE=11025
dependent parameters are:
PERIOD_SIZE=88 PERIOD_TIME=8000
parameters min max open_min open_max interval
PERIOD_SIZE 88 88 0 0 0
PERIO_TIME 8000 8000 0 0 0
RATE 11025 11000 0 0 1
RATE values are calculated in snd_interval_refine()
Return value: INVALID as rate_min > rate_max
This is because, dependent parameter âperiod_sizeâ is rounded to 88 in ârate pluginâ in snd_pcm_rate_hw_refine_cchange()
Since, the below condition gets satisfied(buffer_size = 352 aligned to period_size = 88), period_size gets rounded to 88.
if ((buffer_size->min / period_size->min) * period_size->min == buffer_size->min) {
This commit changes causing the issue to get rate_min > rate_max.
The flow of code execution is as follows:
- snd_pcm_hw_refine_slave()
- Enters snd_pcm_rate_hw_refine_cchange(), rounding of period_size to 88.
- snd_pcm_rate_hw_refine_cchange() exit.
- snd_pcm_hw_refine_soft() is called, here exists params->rmask to evaluate for SAMPLE_BITS, FRAME_BITS, PERIOD_BYTES, BUFFER_BYTES
- execution of RULES calculation.
At RULE 7 rate calculation INVALID error is observed.
b. Without the commit:
In the case if period_size doesnât get rounded off to 88, the usecase would get PASSED.
Rate calculation goes fine with period_size open interval (88, 89)
parameters min max open_min open_max interval
PERIOD_SIZE 88 89 0 0 0
PERIOD_TIME 8000 8000 0 0 0
RATE 11025 11025 0 0 1
Here, there is no issue of rate_min > rate_max.
****************************************************************************************************************************************************************
Now, I just have one scenario where with/without commit, rate calculation goes fine.
2. Usecase which is PASSED with and without above commit.
For the usecase with below command : rate =11025 channel=2
$aplay -Dentertainment_main -r11025 -c2 -fS16_LE /dev/urandom
a. Including the above commit code:
Below is the calculation that goes:
The flow of code execution is as follows:
- snd_pcm_hw_refine_slave()
- Enters snd_pcm_rate_hw_refine_cchange() , rounding of period_size to 88.
- snd_pcm_rate_hw_refine_cchange() exit.
- snd_pcm_hw_refine_soft() is called, here params->rmask is 0.
- RULES calculation doesnt occur.
b. Without the commit:
In the case if period_size doesnât get rounded off to 88.
Rate calculation goes fine with period_size open interval (88, 89)
Is there any dependency for the commit ? If yes, can you please suggest the corner case
which fails without the commit ?
Can we revert the changes ?
More information about the Alsa-devel
mailing list