[alsa-devel] 6-channel output and i2s

Takashi Iwai 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.


Takashi


More information about the Alsa-devel mailing list