pcm: plugin - fix avail_min calculation on rate plugin

commit 88e4ae27, ff1f669d introduced a dynamic recalculation of the slave's
avail_min value.
The calculated avail_min setting did not take into account, that the avail_min value
depends on the used sampling rate and must be adapted accordingly
if the slave is using a different sampling rate.
That leads to too large/too small calculated avail_min settings and inaccurate
period wake-up events if a rate converter plugin is used.

This patch is adapting the avail_min calculation to consider a different
sampling rate between actual pcm and it's slave.

Fixes: https://github.com/alsa-project/alsa-lib/pull/218
Signed-off-by: Andreas Pape <apape@de.adit-jv.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Andreas Pape 2022-03-22 12:45:37 +01:00 committed by Jaroslav Kysela
parent ea15c83525
commit d21e0e01c6
3 changed files with 31 additions and 0 deletions

View file

@ -1343,6 +1343,25 @@ const snd_config_t *snd_pcm_rate_get_default_converter(snd_config_t *root)
return NULL;
}
/**
* \brief Convert rate pcm frames to corresponding rate slave pcm frames
* \param pcm PCM handle
* \param frames Frames to be converted to slave frames
* \retval Corresponding slave frames
*/
snd_pcm_uframes_t snd_pcm_rate_slave_frames(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
{
snd_pcm_uframes_t sframes;
snd_pcm_rate_t *rate = pcm->private_data;
if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
sframes = rate->ops.output_frames(rate->obj, frames);
else
sframes = rate->ops.input_frames(rate->obj, frames);
return sframes;
}
static void rate_initial_setup(snd_pcm_rate_t *rate)
{
if (rate->plugin_version == SND_PCM_RATE_PLUGIN_VERSION)