From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: trigger problems. Date: Wed, 14 Jul 2004 15:28:21 +0200 Sender: alsa-devel-admin@lists.sourceforge.net Message-ID: References: <40F52C9D.60704@superbug.demon.co.uk> Mime-Version: 1.0 (generated by SEMI 1.14.5 - "Awara-Onsen") Content-Type: text/plain; charset=US-ASCII Return-path: In-Reply-To: <40F52C9D.60704@superbug.demon.co.uk> Errors-To: alsa-devel-admin@lists.sourceforge.net List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , List-Archive: To: James Courtier-Dutton Cc: alsa-devel List-Id: alsa-devel@alsa-project.org At Wed, 14 Jul 2004 13:52:45 +0100, James Courtier-Dutton wrote: > > I am writing a alsa driver for the audigyls and p16v. > The output on these sound cards can work in 1 of two ways. > 1) 1 substream with 8 channels, and one interrupt request per period. > For 5.1 output, we just use alsa.conf to map the user's application > channels into the correct channels of the 8 channel substream. > 2) 4 substreams with 2 channels each. > For 5.1 output, we just use 3 substreams, front, rear, center_lfe. > The problem with this is that we then have a separate interrupt per > substream, resulting in 3 times more interrupts. The substreams are also > not in sample sync with each other, because the trigger for each > substream is executed one after the other, instead of in one go. > > I don't know why exactly, maybe some audio experts can help, but (1) > sounds a lot better than (2). I would not think that loosing sample sync > would make so much difference, but that is the only thing that I see > different between (1) and (2). > > So, because of this, I have a feature request for alsa-driver. > If a user app opens the sound device in such a way that a single stream > from the app gets converted into multiple substreams to the same sound > card hardware, can we have a single trigger call for all substreams. > > If we could have a single trigger call, I could start all the hardware > substreams at the same time with a single outl() call. > > To achieve this, I suggest we change the current: > static int snd_pcm_trigger_playback( > snd_pcm_substream_t *substream, > int cmd) > to > static int snd_pcm_trigger_playback( > snd_pcm_substream_t **substream, > int number_of_substreams, > int cmd) > > > Any comments ? We can do it with linked substreams. For example, see ice1724 driver (snc_ice1724_pcm_trigger). Basically, the trigger callback checks each substream belonging to the called substream via snd_pcm_group_for_each(). If it's one of yours, stamp it via snd_pcm_trigger_done(), so that the trigger callback to this substream will be skipped. BTW, both two cases above can coexist. ice1724 drivers has two PCM devices, one for multi-channel up to 8 and another for three indepdent 2ch-stereo streams. Takashi ------------------------------------------------------- This SF.Net email sponsored by Black Hat Briefings & Training. Attend Black Hat Briefings & Training, Las Vegas July 24-29 - digital self defense, top technical experts, no vendor pitches, unmatched networking opportunities. Visit www.blackhat.com