[alsa-devel] 6-channel output and i2s
tiwai at suse.de
Wed Apr 29 16:52:17 CEST 2009
At Wed, 29 Apr 2009 10:37:17 -0400,
Jon Smirl wrote:
> On Wed, Apr 29, 2009 at 10:35 AM, Jon Smirl <jonsmirl at gmail.com> wrote:
> > On Wed, Apr 29, 2009 at 9:04 AM, Takashi Iwai <tiwai at 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.
More information about the Alsa-devel