[alsa-devel] Getting around initial sample loss with intel HDMI

Takashi Iwai tiwai at suse.de
Mon Jul 27 08:07:40 CEST 2009


At Sun, 26 Jul 2009 10:32:10 -0700,
Shane W wrote:
> 
> On Sun, Jul 26, 2009 at 10:52:01AM +0200, Takashi Iwai wrote:
> > > It's a known issue that Intel HDMI audio loses the first
> > > half second or so of audio when opening the device. Using
> > > the dmix interface, I've been able to get around that by
> > > writing a quick app to hold the device open so the HDMI
> > > stays live. However, with the recent asound.conf posted
> > > here which uses the route plugin to fix the multichannel
> > > order, I can't do that as dmix isn't in the picture. I'd
> > > rather not use dmix anyway since it can bugger with the
> > > sample rate so I am wondering if there's another way to get
> > > around this.
> > 
> > It's possible to combine with dmix.
> > You set up dmix with 8 channels, put route plugin over it.
> 
> This has a few problems.
> 
> It doesn't seem to handle varying sample rates. IE if I
> play a 96khz stream at 6 channels, sound is terrible.

This is rather a problem of Nvidia HDMI codec driver...

> Also,
> streaming DTS or AC3 no longer works since the streams are
> being upmixed to 6ch.

This has to be sent anyway exclusively without dmix, so you'll need
another PCM definition.

> I did some digging in the drivers to try and find the
> source of this problem. Note that I am really not familiar
> with this stuff.  It appears to be here:
> hda_codec.c
> void snd_hda_codec_setup_stream(...)
> ...
> snd_hda_codec_write(codec, nid, 0,
> AC_VERB_SET_CHANNEL_STREAMID,
> 
> Introducing a delay after this point fixes the issue but
> it's around a full second so that's obviously not a
> solution. Could we not cache the current format and only do
> this when the format changes rather than on every device
> open?

The format itself is kept.  But the stream tag and channel assignment
are assigned dynamically at each open.  Thus, this call has to be
reset at each open, at least.

> For testing, I tried doing this though and disabling
> the set_streamid, 0 call in snd_codec_cleanup() but it
> still missed those first samples. Is there somewhere else I
> need to be looking?

Does it happen without dmix, too?

The reset part can be a bit more optimized.  But, this is really a
sensitive part, which can easily break the I/O status without
knowing...


Takashi


More information about the Alsa-devel mailing list