Dne 25. 07. 19 v 11:59 eleven xiang napsal(a):
Dear,
Currently, for Audio Echo Cancellation process, we combined both mic signal and reference signal into one pcm with the multi plug. And both the mic and ref signal are hw pcm devices, and they lived in the same sound card in driver.
Here is the issue:
- the master slave pcm device is already for read;
- the second salve pcm is not ready for read, which means no data;
- under this situation, snd_pcm_read_areas function will be stuck in busy
loop as below:
avail = snd_pcm_avail_update(pcm); * // here always return avail=0,
due to the second salve pcm device wasn't ready* if (avail < 0) { err = avail; goto _end; } if (avail == 0) { if (state == SND_PCM_STATE_DRAINING) goto _end; if (pcm->mode & SND_PCM_NONBLOCK) { err = -EAGAIN; goto _end; }
err = snd_pcm_wait(pcm, -1); * // return immediately, due to
the master slave pcm was ready for read.* if (err < 0) break; goto _again; *// stuck in busy loop !! again and again until the second pcm data was ready !!!*
}
it seemed that the root cause is that the two devices have obvious interrupt period gap , and we also found that this issue can be easily reproduced on our device under low memory case.
Currently we monitor this gap and return error to up layer to close-and-reopen device to fix this issue. So I wonder if there is any good solution ?
I tried to resolve this sync in my latest pcm_multi updates (all are in 1.1.9 already). Could you trace, why snd_pcm_wait() does not really wait for the slave when avail == 0? There should not be the busy loop. The snd_pcm_multi_may_wait_for_avail_min() callback should be called inside the multi plugin.
Jaroslav