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;
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;
}
{
snd_pcm_hw_params_t sparams;
int err;
+ unsigned int cmask, changed;
err = cprepare(pcm, params);
if (err < 0)
return err;
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;
}