]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Fixed refinement
authorAbramo Bagnara <abramo@alsa-project.org>
Sun, 21 Jan 2001 17:03:53 +0000 (17:03 +0000)
committerAbramo Bagnara <abramo@alsa-project.org>
Sun, 21 Jan 2001 17:03:53 +0000 (17:03 +0000)
src/pcm/pcm_multi.c
src/pcm/pcm_params.c

index 121014e3e55b91bbe3ac0a2651e83371b1083938..1b8e6274e340dce7546ebe2f35a00cc057fa27f4 100644 (file)
@@ -216,6 +216,7 @@ static int snd_pcm_multi_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
        unsigned int k;
        snd_pcm_hw_params_t sparams[multi->slaves_count];
        int err;
+       unsigned int cmask, changed;
        err = snd_pcm_multi_hw_refine_cprepare(pcm, params);
        if (err < 0)
                return err;
@@ -226,23 +227,27 @@ static int snd_pcm_multi_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
                        return err;
                }
        }
-       /* FIXME: loop begin? */
-       for (k = 0; k < multi->slaves_count; ++k) {
-               err = snd_pcm_multi_hw_refine_schange(pcm, k, params, &sparams[k]);
-               if (err >= 0)
-                       err = snd_pcm_multi_hw_refine_slave(pcm, k, &sparams[k]);
-               if (err < 0) {
-                       snd_pcm_multi_hw_refine_cchange(pcm, k, params, &sparams[k]);
-                       return err;
+       do {
+               cmask = params->cmask;
+               params->cmask = 0;
+               for (k = 0; k < multi->slaves_count; ++k) {
+                       err = snd_pcm_multi_hw_refine_schange(pcm, k, params, &sparams[k]);
+                       if (err >= 0)
+                               err = snd_pcm_multi_hw_refine_slave(pcm, k, &sparams[k]);
+                       if (err < 0) {
+                               snd_pcm_multi_hw_refine_cchange(pcm, k, params, &sparams[k]);
+                               return err;
+                       }
+                       err = snd_pcm_multi_hw_refine_cchange(pcm, k, params, &sparams[k]);
+                       if (err < 0)
+                               return err;
                }
-               err = snd_pcm_multi_hw_refine_cchange(pcm, k, params, &sparams[k]);
+               err = snd_pcm_hw_refine_soft(pcm, params);
+               changed = params->cmask;
+               params->cmask |= cmask;
                if (err < 0)
                        return err;
-       }
-       err = snd_pcm_hw_refine_soft(pcm, params);
-       if (err < 0)
-               return err;
-       /* FIXME: do we need to loop? */
+       } while (changed);
        return 0;
 }
 
index d3a83a0455540ffe8b89b3db4bc9122a9d7161fb..7b37fcac65ccbc99e897e7034322d523b980eca6 100644 (file)
@@ -2002,6 +2002,7 @@ int snd_pcm_hw_refine_slave(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
 {
        snd_pcm_hw_params_t sparams;
        int err;
+       unsigned int cmask, changed;
        err = cprepare(pcm, params);
        if (err < 0)
                return err;
@@ -2010,22 +2011,26 @@ int snd_pcm_hw_refine_slave(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
                ERR("Slave PCM not useable");
                return err;
        }
-       /* FIXME: loop begin? */
-       err = schange(pcm, params, &sparams);
-       if (err >= 0) {
-               err = srefine(pcm, &sparams);
-       }
-       if (err < 0) {
-               cchange(pcm, params, &sparams);
-               return err;
-       }
-       err = cchange(pcm, params, &sparams);
-       if (err < 0)
-               return err;
-       err = snd_pcm_hw_refine_soft(pcm, params);
-       if (err < 0)
-               return err;
-       /* FIXME: do we need to loop? */
+       do {
+               cmask = params->cmask;
+               params->cmask = 0;
+               err = schange(pcm, params, &sparams);
+               if (err >= 0) {
+                       err = srefine(pcm, &sparams);
+               }
+               if (err < 0) {
+                       cchange(pcm, params, &sparams);
+                       return err;
+               }
+               err = cchange(pcm, params, &sparams);
+               if (err < 0)
+                       return err;
+               err = snd_pcm_hw_refine_soft(pcm, params);
+               changed = params->cmask;
+               params->cmask |= cmask;
+               if (err < 0)
+                       return err;
+       } while (changed);
        return 0;
 }