At Wed, 29 Apr 2009 10:37:17 -0400, Jon Smirl wrote:
On Wed, Apr 29, 2009 at 10:35 AM, Jon Smirl jonsmirl@gmail.com wrote:
On Wed, Apr 29, 2009 at 9:04 AM, Takashi Iwai tiwai@suse.de wrote:
At Wed, 29 Apr 2009 08:58:52 -0400, Jon Smirl wrote:
My hardware was has three stereo i2s lines. These three lines are all tied to the same external clock so they are synchronized. Because there are three i2s lines, each with it's own DMA queue and FIFO, I need three independent output buffers. What is the correct way to set this up in ALSA?
So I suppose it's three streams of 2-ch interleaved format?
Yes
If so, an easier way would be to provide three substreams in a PCM, and bind 6 channels with alsa-lib plugin.
How does ALSA start the streams synchronously?
I can start the streams synchronously at the low level by waiting for the frame clock and then enabling the three DMA channels.
If the hardware supports the simultaneous triggering of multiple streams, add the sync support to the driver. Namely, - Add SNDRV_PCM_INFO_SYNC_START flag to PCM info field - Call snd_pcm_set_sync(substream) at each open callback - In the trigger callback, check all bundled streams via snd_pcm_group_for_each_entry(). Mark all the streams but the current one via snd_pcm_trigger_done(). Then start all streams at once. Ditto for stop and pause.
Takashi