From 436b003173430a45a5fe66376fa27ab92728507b Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Wed, 27 Sep 2006 11:11:29 +0200 Subject: [PATCH] rate plugin: fix boundary calculations Make sure that the rate plugin does not try to change the slave's boundary value when setting software parameters; such a change wouldn't affect the slave pcm. Furthermore, the stop_threshold conversion code used the wrong boundary value, and the silence_size conversion code did not take into account the boundary value at all. --- src/pcm/pcm_rate.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c index 90c21f13..63168407 100644 --- a/src/pcm/pcm_rate.c +++ b/src/pcm/pcm_rate.c @@ -364,10 +364,15 @@ static int snd_pcm_rate_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params) snd_pcm_rate_t *rate = pcm->private_data; snd_pcm_t *slave = rate->gen.slave; snd_pcm_sw_params_t *sparams; - snd_pcm_uframes_t boundary1, boundary2; + snd_pcm_uframes_t boundary1, boundary2, sboundary; + int err; - rate->sw_params = *params; sparams = &rate->sw_params; + err = snd_pcm_sw_params_current(slave, sparams); + if (err < 0) + return err; + sboundary = sparams->boundary; + *sparams = *params; boundary1 = pcm->buffer_size; boundary2 = slave->buffer_size; while (boundary1 * 2 <= LONG_MAX - pcm->buffer_size && @@ -376,7 +381,7 @@ static int snd_pcm_rate_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params) boundary2 *= 2; } params->boundary = boundary1; - sparams->boundary = boundary2; + sparams->boundary = sboundary; if (rate->ops.adjust_pitch) rate->ops.adjust_pitch(rate->obj, &rate->info); @@ -393,13 +398,17 @@ static int snd_pcm_rate_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params) if (sparams->start_threshold > (slave->buffer_size / sparams->xfer_align) * sparams->xfer_align) sparams->start_threshold = (slave->buffer_size / sparams->xfer_align) * sparams->xfer_align; } - if (sparams->stop_threshold >= sparams->boundary) { + if (sparams->stop_threshold >= params->boundary) { sparams->stop_threshold = sparams->boundary; } else { recalc(pcm, &sparams->stop_threshold); } recalc(pcm, &sparams->silence_threshold); - recalc(pcm, &sparams->silence_size); + if (sparams->silence_size >= params->boundary) { + sparams->silence_size = sparams->boundary; + } else { + recalc(pcm, &sparams->silence_size); + } return snd_pcm_sw_params(slave, sparams); } -- 2.47.1