tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Proposal: new audio framework
Hello,
On Tue, 02 Apr 2019 16:10:58 +0900
Tetsuya Isaki <isaki%pastel-flower.jp@localhost> wrote:
> At Mon, 1 Apr 2019 03:24:15 -0400,
> Michael wrote:
> > > There is one thing I'm worried about. AUDIO2 requires more strict
> > > blocksize and buffersize for hardware drivers. It will be a hard
> > > work if there are any hardware that does not satisfy the requirements.
> > > # Although I believe there are no such hardware...
> >
> > What exactly are those requirements? IIRC dbri has a rather weird
> > maximum block size:
> > static int
> > dbri_round_blocksize(void *hdl, int bs, int mode,
> > const audio_params_t *param)
> > {
> >
> > /*
> > * DBRI DMA segment size can be up to 0x1fff, sizes that are not powers
> > * of two seem to confuse the upper audio layer so we're going with
> > * 0x1000 here
> > */
> > return 0x1000;
> > }
> >
> > That said, I'll take care of potential fallout with the dbri driver.
>
> Thank you.
>
> If your hardware can accept arbitrary size up to 0x1fff as in the
> comment, please rewrite it as follows:
>
> dbri_round_blocksize(..., int bs, ...)
> {
> if (bs > 0x1fff)
> return 0x1fff;
> return bs;
> }
Will do.
> In dbri, slinear/16bit/2ch/48000Hz looks like the largest case.
> The blocksize at this case is
> 2(16bits) * 2(channels) * 48000(Hz) * 0.04 (40msec block in default)
> = 7680 bytes. It is less than 0x1fff and it will work.
Ok.
> Here is details:
>
> On -current, as you know, blocksize are decided as follows:
> 1. audio layer selects some size and ask it to hardawre driver.
> This is round_blocksize interface.
> 2. if hardware driver cannot accept the size (for example, DMA
> restrictions), hardware driver returns desired new size.
> 3. audio layer accepts it unconditionally.
>
> Due to Step3's behavior and rumors (or obsoleted restriction?) that
> block size must be a power of two, many drivers return the different
> size even if proposed size is acceptable.
The power-of-two thing was my guess, it used to return 0x1ffc so each
block would contain only whole 16bit/stereo samples. Not sure if the
hardware ( specifically, the codec ) actually needs that, the docs are
kinda fuzzy and the chip is primarily an ISDN controller. When things
changed the last time around this stopped working, 0x1000 did work, so
I left it at that.
> AUDIO2 internal takes a block-oriented strategy, not a bytestream-
> oriented, for performance and simplicity.
> So, AUDIO2 changed it as follows:
> a1. audio layer calculates suitable blocksize from its hardware
> precision(stride), channels, frequency and blk_ms (= block
> length in msec) parameters.
> a2. and then ask it to hardware driver. It's round_blocksize.
> a3. But if the hardware driver returns the other size, audio layer
> cannot accept it because proposed size was calculated from
> hardware encoding.
> At the moment, I have no good idea for this case. :(
Thanks for the explanation, I will adapt and report back.
have fun
Michael
Home |
Main Index |
Thread Index |
Old Index