At Wed, 12 Dec 2012 21:57:56 -0800, Devin Anderson wrote:
Hi all,
On the jack-devel list, we've been having a discussion about the ALSA PCM multi plugin:
http://thread.gmane.org/gmane.comp.audio.jackit/26571/focus=26571
I've been having some issues with setting up my 2 Echo Layla 3Gs as a PCM multi. In particular, I've found that there are times when polling the file descriptors of the multi when poll() returns, but there isn't actually a period of data available for capture/playback, even though the poll descriptors indicate that the data should be available. After some debugging and learning about the PCM multi driver:
1.) The PCM multi driver only returns poll descriptors for one of the devices that makes up the multi 2.) When this happens, the device that's actually being polled *does* have data available 3.) When this happens, the device that's not being polled does not yet have a period's worth of data available
After making sure that I had word clock enabled and that my word clock cable was working properly, I started delving into the problem some more. From what I can gather, the PCM multi device uses the function `snd_pcm_link()` to sync its devices, and, for start, stop, drain, pause, suspend, resume, reset, and prepare operations, this appears to work fine; however, I can't find any evidence that a PCM device checks to make sure that all of its linked slave devices have their poll descriptors ready with events before indicating that events are available.
Questions:
1.) Should `snd_pcm_link` make I/O availability indication dependent on I/O availability of its linked slave devices?
The PCM stream link has nothing to do with the poll descriptors. It's basically only for performing the synchronized trigger.
2.) If not, how should this operation be handled? I'm sure it *can* be handled in userspace by bypassing the multi and polling the file descriptors of all sound cards directly, but duplicating this code for each application that wants to poll multiple sound cards seems wrong.
Actually there were multiple poll descriptors for multi plugin in the early version of alsa-lib. But this was changed to a single fd by some reason I don't remember. I thought there were too many broken apps doing wrong for multiple fds.
Maybe as a compromised solution, we'd need to introduce a config option to multi plugin for allowing multiple fds.
Takashi