]> git.alsa-project.org Git - alsa-lib.git/commitdiff
- fixed the rate selection in the plug layer:
authorTakashi Iwai <tiwai@suse.de>
Mon, 27 Jan 2003 11:34:50 +0000 (11:34 +0000)
committerTakashi Iwai <tiwai@suse.de>
Mon, 27 Jan 2003 11:34:50 +0000 (11:34 +0000)
  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
src/pcm/pcm_params.c
src/pcm/pcm_plug.c

index fa8e4cce61adb12326a5a7d8102c56d216140b17..d949d3053b7479a764b1cc47a65e0e6c5178dc83 100644 (file)
@@ -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,
index 3881e32ab70b47d5602444a726a9e5e4785b590e..234edfda1f5efa7465a16833406b7b6b6095d4aa 100644 (file)
@@ -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,
index 1798b6ff8835876b792b0ac38e2dd9178e566ea1..f9ae5e14089233a7d05dace437faa1cacf25e747 100644 (file)
@@ -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)