mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-12-17 08:56:45 -05:00
buffer_size weak link fixed
This commit is contained in:
parent
d41c210493
commit
199452ae8b
4 changed files with 31 additions and 15 deletions
|
|
@ -34,7 +34,8 @@ int interval_min(const interval_t *i);
|
||||||
int interval_max(const interval_t *i);
|
int interval_max(const interval_t *i);
|
||||||
int interval_test(const interval_t *i, unsigned int val);
|
int interval_test(const interval_t *i, unsigned int val);
|
||||||
void interval_copy(interval_t *dst, const interval_t *src);
|
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_always_eq(const interval_t *i1, const interval_t *i2);
|
||||||
int interval_never_eq(const interval_t *i1, const interval_t *i2);
|
int interval_never_eq(const interval_t *i1, const interval_t *i2);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -97,15 +97,32 @@ INLINE int interval_setinteger(interval_t *i)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE void interval_round(interval_t *i)
|
INLINE void interval_floor(interval_t *i)
|
||||||
{
|
{
|
||||||
if (i->integer || interval_empty(i))
|
if (i->integer || interval_empty(i))
|
||||||
return;
|
return;
|
||||||
i->openmin = 0;
|
i->openmin = 0;
|
||||||
i->openmax = 0;
|
if (i->openmax) {
|
||||||
|
i->max--;
|
||||||
|
i->openmax = 0;
|
||||||
|
}
|
||||||
i->integer = 1;
|
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)
|
INLINE int interval_always_eq(const interval_t *i1, const interval_t *i2)
|
||||||
{
|
{
|
||||||
return interval_single(i1) && interval_single(i2) &&
|
return interval_single(i1) && interval_single(i2) &&
|
||||||
|
|
|
||||||
|
|
@ -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());
|
mask_t *sfmt_mask = alloca(mask_sizeof());
|
||||||
int err;
|
int err;
|
||||||
unsigned int format;
|
unsigned int format;
|
||||||
interval_t t;
|
interval_t t, buffer_size;
|
||||||
const interval_t *buffer_size;
|
|
||||||
const interval_t *srate, *crate;
|
const interval_t *srate, *crate;
|
||||||
snd_pcm_hw_param_refine_near(slave, sparams, SND_PCM_HW_PARAM_RATE,
|
snd_pcm_hw_param_refine_near(slave, sparams, SND_PCM_HW_PARAM_RATE,
|
||||||
params);
|
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,
|
_snd_pcm_hw_param_mask(sparams, SND_PCM_HW_PARAM_ACCESS,
|
||||||
access_mask);
|
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);
|
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);
|
srate = snd_pcm_hw_param_value_interval(sparams, SND_PCM_HW_PARAM_RATE);
|
||||||
interval_muldiv(buffer_size, srate, crate, &t);
|
interval_muldiv(&buffer_size, srate, crate, &t);
|
||||||
interval_round(&t);
|
|
||||||
err = _snd_pcm_hw_param_refine_interval(sparams, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
|
err = _snd_pcm_hw_param_refine_interval(sparams, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
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);
|
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);
|
srate = snd_pcm_hw_param_value_interval(sparams, SND_PCM_HW_PARAM_RATE);
|
||||||
interval_muldiv(sbuffer_size, crate, srate, &t);
|
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);
|
err = _snd_pcm_hw_param_refine_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
|
||||||
|
|
@ -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_hw_params_t *sparams)
|
||||||
{
|
{
|
||||||
snd_pcm_rate_t *rate = pcm->private;
|
snd_pcm_rate_t *rate = pcm->private;
|
||||||
interval_t t;
|
interval_t t, buffer_size;
|
||||||
const interval_t *buffer_size;
|
|
||||||
const interval_t *srate, *crate;
|
const interval_t *srate, *crate;
|
||||||
int err;
|
int err;
|
||||||
unsigned int links = (SND_PCM_HW_PARBIT_CHANNELS |
|
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_SUBFORMAT |
|
||||||
SND_PCM_HW_PARBIT_SAMPLE_BITS |
|
SND_PCM_HW_PARBIT_SAMPLE_BITS |
|
||||||
SND_PCM_HW_PARBIT_FRAME_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);
|
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);
|
srate = snd_pcm_hw_param_value_interval(sparams, SND_PCM_HW_PARAM_RATE);
|
||||||
interval_muldiv(buffer_size, srate, crate, &t);
|
interval_muldiv(&buffer_size, srate, crate, &t);
|
||||||
interval_round(&t);
|
|
||||||
err = _snd_pcm_hw_param_refine_interval(sparams, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
|
err = _snd_pcm_hw_param_refine_interval(sparams, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
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);
|
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);
|
srate = snd_pcm_hw_param_value_interval(sparams, SND_PCM_HW_PARAM_RATE);
|
||||||
interval_muldiv(sbuffer_size, crate, srate, &t);
|
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);
|
err = _snd_pcm_hw_param_refine_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE, &t);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue