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
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) &&
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);
_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;
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;
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 |
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;
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;