]> git.alsa-project.org Git - alsa-lib.git/commitdiff
rate plugin: fix boundary calculations
authorClemens Ladisch <clemens@ladisch.de>
Wed, 27 Sep 2006 09:11:29 +0000 (11:11 +0200)
committerClemens Ladisch <clemens@ladisch.de>
Wed, 27 Sep 2006 09:11:29 +0000 (11:11 +0200)
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

index 90c21f1339daad53cb76eabf69f27bd9d781dd69..63168407d4aa2ca279f4fb456ab4bbf1171d0cf6 100644 (file)
@@ -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);
 }