From 1b41de0653b0b197d18da3c8a5ff522ea5b29eea Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 27 Jan 2003 11:34:50 +0000 Subject: [PATCH] - fixed the rate selection in the plug layer: the multiples of the given rate is chosen if available. the nearest rate is selected as usual if not available. --- src/pcm/pcm_local.h | 4 ++++ src/pcm/pcm_params.c | 21 +++++++++++++++++++++ src/pcm/pcm_plug.c | 4 ++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h index fa8e4cce..d949d305 100644 --- a/src/pcm/pcm_local.h +++ b/src/pcm/pcm_local.h @@ -488,6 +488,10 @@ void snd_pcm_hw_param_refine_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_hw_param_t var, const snd_pcm_hw_params_t *src); +void snd_pcm_hw_param_refine_multiple(snd_pcm_t *pcm, + snd_pcm_hw_params_t *params, + snd_pcm_hw_param_t var, + const snd_pcm_hw_params_t *src); int snd_pcm_hw_param_empty(const snd_pcm_hw_params_t *params, snd_pcm_hw_param_t var); int snd_pcm_hw_param_always_eq(const snd_pcm_hw_params_t *params, diff --git a/src/pcm/pcm_params.c b/src/pcm/pcm_params.c index 3881e32a..234edfda 100644 --- a/src/pcm/pcm_params.c +++ b/src/pcm/pcm_params.c @@ -931,6 +931,27 @@ void snd_pcm_hw_param_refine_near(snd_pcm_t *pcm, min, &mindir, max, &maxdir); } +void snd_pcm_hw_param_refine_multiple(snd_pcm_t *pcm, + snd_pcm_hw_params_t *params, + snd_pcm_hw_param_t var, + const snd_pcm_hw_params_t *src) +{ + const snd_interval_t *it = hw_param_interval_c(src, var); + const snd_interval_t *st = hw_param_interval_c(params, var); + if (snd_interval_single(it)) { + unsigned int best = snd_interval_min(it), cur; + for (cur = best; ; cur += best) { + if (st->max < cur || (st->max == cur && st->openmax)) + break; + if (it->min > cur || (it->min == cur && st->openmin)) + continue; + if (! snd_pcm_hw_param_set(pcm, params, SND_TRY, var, cur, 0)) + return; /* ok */ + } + } + snd_pcm_hw_param_refine_near(pcm, params, var, src); +} + /* ---- end of refinement functions ---- */ int snd_pcm_hw_param_empty(const snd_pcm_hw_params_t *params, diff --git a/src/pcm/pcm_plug.c b/src/pcm/pcm_plug.c index 1798b6ff..f9ae5e14 100644 --- a/src/pcm/pcm_plug.c +++ b/src/pcm/pcm_plug.c @@ -652,8 +652,8 @@ static int snd_pcm_plug_hw_refine_schange(snd_pcm_t *pcm, snd_pcm_hw_params_t *p if (plug->srate == -2) links |= SND_PCM_HW_PARBIT_RATE; else { - snd_pcm_hw_param_refine_near(slave, sparams, SND_PCM_HW_PARAM_RATE, - params); + snd_pcm_hw_param_refine_multiple(slave, sparams, SND_PCM_HW_PARAM_RATE, + params); } if (plug->schannels == -2) -- 2.47.1