]> git.alsa-project.org Git - alsa-lib.git/commitdiff
buffer_size weak link fixed
authorAbramo Bagnara <abramo@alsa-project.org>
Fri, 19 Jan 2001 18:28:50 +0000 (18:28 +0000)
committerAbramo Bagnara <abramo@alsa-project.org>
Fri, 19 Jan 2001 18:28:50 +0000 (18:28 +0000)
src/pcm/interval.h
src/pcm/interval_inline.h
src/pcm/pcm_plug.c
src/pcm/pcm_rate.c

index 751cd11ddbd47d8669f9fd99135fd4c4880b7a03..d78fe4e5f54f4db1741ff2fb4b8d55297e33e9b8 100644 (file)
@@ -34,7 +34,8 @@ int interval_min(const interval_t *i);
 int interval_max(const interval_t *i);
 int interval_test(const interval_t *i, unsigned int val);
 void interval_copy(interval_t *dst, const interval_t *src);
-void interval_round(interval_t *i);
+void interval_floor(interval_t *i);
+void interval_unfloor(interval_t *i);
 int interval_always_eq(const interval_t *i1, const interval_t *i2);
 int interval_never_eq(const interval_t *i1, const interval_t *i2);
 #endif
index d3aeb5ce4041755a56d9e35dbe963ec06c86f4a7..a26d8837c10d4feacd2b6198db41fc2256c28113 100644 (file)
@@ -97,15 +97,32 @@ INLINE int interval_setinteger(interval_t *i)
        return 1;
 }
 
-INLINE void interval_round(interval_t *i)
+INLINE void interval_floor(interval_t *i)
 {
        if (i->integer || interval_empty(i))
                return;
        i->openmin = 0;
-       i->openmax = 0;
+       if (i->openmax) {
+               i->max--;
+               i->openmax = 0;
+       }
        i->integer = 1;
 }
 
+INLINE void interval_unfloor(interval_t *i)
+{
+       if (interval_empty(i))
+               return;
+       if (i->max == UINT_MAX)
+               return;
+       if (i->openmax)
+               return;
+       i->max++;
+       i->openmax = 1;
+       i->integer = 0;
+}
+
+
 INLINE int interval_always_eq(const interval_t *i1, const interval_t *i2)
 {
        return interval_single(i1) && interval_single(i2) &&
index 34bb36e537acb74e215b0f25a3f56d4d36984f00..cd2b8237658cb609415b919b037065c14f50abfa 100644 (file)
@@ -423,8 +423,7 @@ static int snd_pcm_plug_hw_refine_schange(snd_pcm_t *pcm, snd_pcm_hw_params_t *p
        mask_t *sfmt_mask = alloca(mask_sizeof());
        int err;
        unsigned int format;
-       interval_t t;
-       const interval_t *buffer_size;
+       interval_t t, buffer_size;
        const interval_t *srate, *crate;
        snd_pcm_hw_param_refine_near(slave, sparams, SND_PCM_HW_PARAM_RATE,
                                     params);
@@ -462,11 +461,11 @@ static int snd_pcm_plug_hw_refine_schange(snd_pcm_t *pcm, snd_pcm_hw_params_t *p
                _snd_pcm_hw_param_mask(sparams, SND_PCM_HW_PARAM_ACCESS,
                                       access_mask);
        }
-       buffer_size = snd_pcm_hw_param_value_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE);
+       interval_copy(&buffer_size, snd_pcm_hw_param_value_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE));
+       interval_unfloor(&buffer_size);
        crate = snd_pcm_hw_param_value_interval(params, SND_PCM_HW_PARAM_RATE);
        srate = snd_pcm_hw_param_value_interval(sparams, SND_PCM_HW_PARAM_RATE);
-       interval_muldiv(buffer_size, srate, crate, &t);
-       interval_round(&t);
+       interval_muldiv(&buffer_size, srate, crate, &t);
        err = _snd_pcm_hw_param_refine_interval(sparams, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
        if (err < 0)
                return err;
@@ -517,7 +516,7 @@ static int snd_pcm_plug_hw_refine_cchange(snd_pcm_t *pcm ATTRIBUTE_UNUSED,
        crate = snd_pcm_hw_param_value_interval(params, SND_PCM_HW_PARAM_RATE);
        srate = snd_pcm_hw_param_value_interval(sparams, SND_PCM_HW_PARAM_RATE);
        interval_muldiv(sbuffer_size, crate, srate, &t);
-       interval_round(&t);
+       interval_floor(&t);
        err = _snd_pcm_hw_param_refine_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
        if (err < 0)
                return err;
index c018678661be28ebb94f4f9de856041dd70b8b88..786c49cb5b12962eb20a55b1c18a7d016656ef6f 100644 (file)
@@ -276,8 +276,7 @@ static int snd_pcm_rate_hw_refine_schange(snd_pcm_t *pcm, snd_pcm_hw_params_t *p
                                          snd_pcm_hw_params_t *sparams)
 {
        snd_pcm_rate_t *rate = pcm->private;
-       interval_t t;
-       const interval_t *buffer_size;
+       interval_t t, buffer_size;
        const interval_t *srate, *crate;
        int err;
        unsigned int links = (SND_PCM_HW_PARBIT_CHANNELS |
@@ -288,11 +287,11 @@ static int snd_pcm_rate_hw_refine_schange(snd_pcm_t *pcm, snd_pcm_hw_params_t *p
                          SND_PCM_HW_PARBIT_SUBFORMAT |
                          SND_PCM_HW_PARBIT_SAMPLE_BITS |
                          SND_PCM_HW_PARBIT_FRAME_BITS);
-       buffer_size = snd_pcm_hw_param_value_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE);
+       interval_copy(&buffer_size, snd_pcm_hw_param_value_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE));
+       interval_unfloor(&buffer_size);
        crate = snd_pcm_hw_param_value_interval(params, SND_PCM_HW_PARAM_RATE);
        srate = snd_pcm_hw_param_value_interval(sparams, SND_PCM_HW_PARAM_RATE);
-       interval_muldiv(buffer_size, srate, crate, &t);
-       interval_round(&t);
+       interval_muldiv(&buffer_size, srate, crate, &t);
        err = _snd_pcm_hw_param_refine_interval(sparams, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
        if (err < 0)
                return err;
@@ -322,7 +321,7 @@ static int snd_pcm_rate_hw_refine_cchange(snd_pcm_t *pcm, snd_pcm_hw_params_t *p
        crate = snd_pcm_hw_param_value_interval(params, SND_PCM_HW_PARAM_RATE);
        srate = snd_pcm_hw_param_value_interval(sparams, SND_PCM_HW_PARAM_RATE);
        interval_muldiv(sbuffer_size, crate, srate, &t);
-       interval_round(&t);
+       interval_floor(&t);
        err = _snd_pcm_hw_param_refine_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
        if (err < 0)
                return err;