[alsa-devel] [PATCH 0/4] Yet another patchset for LPE audio refactoring

Takashi Iwai tiwai at suse.de
Mon Feb 6 22:45:30 CET 2017


On Mon, 06 Feb 2017 22:16:22 +0100,
Pierre-Louis Bossart wrote:
> 
> On 2/6/17 1:07 PM, Takashi Iwai wrote:
> > On Fri, 03 Feb 2017 17:43:56 +0100,
> > Takashi Iwai wrote:
> >>
> >> Hi,
> >>
> >> this is the final part of my cleanup / refactoring patchsets for Intel
> >> LPE audio.  Now the PCM stream engine has been rewritten.  It supports
> >> more flexible configuration, not only fixed 4 periods, for example,
> >> yet with a lot of code reduction.
> >>
> >> As usual, the patches are found in topic/intel-lpe-audio-cleanup
> >> branch.
> >
> > So far, from my side, now most of changes have been submitted /
> > merged.  But I still have some unclear things in the code.
> >
> > - The PCM format: the code contains the handling of S16_LE, but it
> >   doesn't seem work when I enabled the info bit.  What's missing?
> >   Also U24_LE format is ever supported...?  How?
> 
> In the initial version the samples were assumed to be using the 24 lsb
> of a 32-bit word. 16-bit data can be supported as long as it was
> left-shifted before being written to the ring buffer.
>
> For stereo the channels are assumed to be interleaved in Layout 0
> (left, right). For more than 2ch, all channels for the same sample are
> inserted consecutively (ie. no blocks of channels). In the initial
> version the number of channels is assumed to be even and one bogus
> channel had to be inserted for odd number of channels.
> 
> in more recent versions the samples could also be represented as using
> the 24 msb and the requirement for the bogus channel was removed but I
> never worked on this personally and the documentation is far from
> clear.

OK, that's interesting.  So we may support even  S32_LE format, too.

The odd channel restriction isn't seen in the current code, indeed.
It's worth to try 3 channels tomorrow :)

> At any rate, here's what I see in the description of the
> STREAM_X_LPE_AUD_CONFIG registers for CHT:
> 
> Bit 15:
> 1: DP mode
> 0: HDMI (default)
> 
> Bit14:
> 1: no bogus sample for odd channels
> 0: bogus sample for off channels (default)
> 
> Bit13:
> 1: MSB is bit 31 of 32-bit container
> 0: MSB is bit 23 of 32-bit container (default)
> 
> Bit 12:
> 1: 16-bit container
> 0: 32-bit container (default)
> 
> Bit 11:
> 1: send silence stream
> 0: send null packets (default)

So this corresponds to the hw_silence stuff you mentioned?


> I see no evidence that unsigned data is supported.

Yeah, and I really doubt whether unsigned format is supported at all.
Better to drop it.

> I would really take all these configurations with caution, it's not
> clear to me if the documentation reflects the actual implementation.

Sure, it's just for fun for now.

> Note that the hardware can swap channels, I don't remember if this is
> currently enabled.

We have the following code:

#define SWAP_LFE_CENTER		0x00fac4c8

	/*
	 * Program channel mapping in following order:
	 * FL, FR, C, LFE, RL, RR
	 */

	had_write_register(intelhaddata, AUD_BUF_CH_SWAP, SWAP_LFE_CENTER);

0x00fac4c8 is octal 74543210, so it's jus a plain order.

But this reminds me that I didn't check the correctness of chmap order
in the current driver.  Another thing to try tomorrow.

> 
> >
> > - The behavior in had_process_buffer_underrun() isn't clear enough.
> >   Or, more exactly, the behavior of AUD_HDMI_STATUS reg and AUD_CONFIG
> >   reg look complex, and need a bit more description for readers
> >   (including me).
> >
> > Can you guys enlighten a bit?
> 
> For the LPE_AUDIO_Buffer_config register (65020h), there is one
> important field
> 10:8: DMA Fifo watermark. The audio unit has 8x64 bytes, this register
> define when to fetch data. Bottom line it'd be wise to avoid rewinding
> below that FIFO size...

Right, this may be needed to be exposed.


> There are two possible interrupt sources in the
> STREAM_X_LPE_AUD_HDMI_STATUS (65064h)
> Bit 31: sample buffer underrun. HDMI audio unit did not have enough
> samples to insert in video frame (cleared by writing a one)
> Bit 29: buffer done status, write 1 to clear
> Bit 15: sample buffer underrun interrupt enable

OK, then the current code seems naming the function wrongly.
It names had_enable_audio_int() but actually this should be named as
had_clear_interrupts() or such.

> 
> Hope this helps

Very appreciated, thank you for prompt answer!


Takashi


More information about the Alsa-devel mailing list