From: Abramo Bagnara Date: Fri, 19 Jan 2001 18:28:50 +0000 (+0000) Subject: buffer_size weak link fixed X-Git-Tag: v1.0.3~1013 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=199452ae8b2266a12e8d5ecb0953a65017dbf552;p=alsa-lib.git buffer_size weak link fixed --- diff --git a/src/pcm/interval.h b/src/pcm/interval.h index 751cd11d..d78fe4e5 100644 --- a/src/pcm/interval.h +++ b/src/pcm/interval.h @@ -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 diff --git a/src/pcm/interval_inline.h b/src/pcm/interval_inline.h index d3aeb5ce..a26d8837 100644 --- a/src/pcm/interval_inline.h +++ b/src/pcm/interval_inline.h @@ -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) && diff --git a/src/pcm/pcm_plug.c b/src/pcm/pcm_plug.c index 34bb36e5..cd2b8237 100644 --- a/src/pcm/pcm_plug.c +++ b/src/pcm/pcm_plug.c @@ -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; diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c index c0186786..786c49cb 100644 --- a/src/pcm/pcm_rate.c +++ b/src/pcm/pcm_rate.c @@ -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;