pcm: rate - rewrite the may_wait_for_avail_min callback for the rate plugin

Shuffle the code to avoid special conditions using the plugin type
in the generic plugin code. The rate plugin has the own
may_wait_for_avail_min callback implementation now.

Fixes: d21e0e01 ("pcm: plugin - fix avail_min calculation on rate plugin")
Fixes: https://github.com/alsa-project/alsa-lib/pull/218
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2022-05-20 10:47:43 +02:00
parent d21e0e01c6
commit d9dbb57b94
4 changed files with 43 additions and 28 deletions

View file

@ -1282,6 +1282,32 @@ static int snd_pcm_rate_close(snd_pcm_t *pcm)
return snd_pcm_generic_close(pcm);
}
/**
* \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
*/
static 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 int snd_pcm_rate_may_wait_for_avail_min(snd_pcm_t *pcm,
snd_pcm_uframes_t avail)
{
return snd_pcm_plugin_may_wait_for_avail_min_conv(pcm, avail,
snd_pcm_rate_slave_frames);
}
static const snd_pcm_fast_ops_t snd_pcm_rate_fast_ops = {
.status = snd_pcm_rate_status,
.state = snd_pcm_rate_state,
@ -1308,7 +1334,7 @@ static const snd_pcm_fast_ops_t snd_pcm_rate_fast_ops = {
.poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
.poll_descriptors = snd_pcm_generic_poll_descriptors,
.poll_revents = snd_pcm_rate_poll_revents,
.may_wait_for_avail_min = snd_pcm_plugin_may_wait_for_avail_min,
.may_wait_for_avail_min = snd_pcm_rate_may_wait_for_avail_min,
};
static const snd_pcm_ops_t snd_pcm_rate_ops = {
@ -1343,25 +1369,6 @@ 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)