From 20b70b6d1951b1447d78397fa7cef46969ca1643 Mon Sep 17 00:00:00 2001 From: Abramo Bagnara Date: Sun, 21 Jan 2001 17:03:53 +0000 Subject: [PATCH] Fixed refinement --- src/pcm/pcm_multi.c | 33 +++++++++++++++++++-------------- src/pcm/pcm_params.c | 37 +++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/pcm/pcm_multi.c b/src/pcm/pcm_multi.c index 121014e3..1b8e6274 100644 --- a/src/pcm/pcm_multi.c +++ b/src/pcm/pcm_multi.c @@ -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; } diff --git a/src/pcm/pcm_params.c b/src/pcm/pcm_params.c index d3a83a04..7b37fcac 100644 --- a/src/pcm/pcm_params.c +++ b/src/pcm/pcm_params.c @@ -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; } -- 2.47.1