dmix optimization

Geraldo Nascimento geraldogabriel at gmail.com
Mon Aug 2 18:27:09 CEST 2021


Hello Giuliano,

My suggestion is to repost your question with Cc: to Jaroslav Kysela
and Takashi Iwai.

I *think* Takashi Iwai deals more with kernelspace and Jaroslav Kysela
is the one that can help you with alsa-lib.

This is a high volume list and sometimes mail will get ignored.

But Cc: the Maintainers and they will take notice and hopefully you'll
have your optimization feedback.

Thanks,
Geraldo Nascimento


On Mon, Aug 2, 2021 at 9:26 AM Giuliano Zannetti - ART S.p.A.
<giuliano.zannetti at artgroup-spa.com> wrote:
>
> Hi,
>
> I'm trying to optimize the dmix because I'm working with a big number of channels (up to 16) and in this case the dmix has not a negligible impact on performance.
>
> I'm working with ALSA 1.1.9. I gave my first look to the generic_mix_areas_16_native function (https://github.com/alsa-project/alsa-lib/blob/v1.1.9/src/pcm/pcm_dmix_generic.c#L130).
>
> I would ask you if I can avoid to check, for each loop iteration, if the current dst sample is not 0.
>
>     for (;;) {
>         sample = *src;
>         if (! *dst) {
>             *sum = sample;
>             *dst = *src;
>         } else {
>             sample += *sum;
>             *sum = sample;
>             if (sample > 0x7fff)
>                 sample = 0x7fff;
>             else if (sample < -0x8000)
>                 sample = -0x8000;
>             *dst = sample;
>         }
>         if (!--size)
>             return;
>         src = (signed short *) ((char *)src + src_step);
>         dst = (signed short *) ((char *)dst + dst_step);
>         sum = (signed int *)   ((char *)sum + sum_step);
>     }
>
> Could it be possible check for the first sample of the period only, as reported in the code below? My assumption is that if dst[0] is 0 also dst[1] ... dst[period-1] will be 0, and I don't need to check every time. This is already an optimization, but it could be also a starting point for other optimization based on my HW. But, first of all, I would ask to you if my assumption is right.
>
>     if (! *dst) {
>         for (;;) {
>             sample = *src;
>             *sum = sample;
>             *dst = *src;
>
>             if (!--size)
>                 return;
>
>             src = (signed short *) ((char *)src + src_step);
>             dst = (signed short *) ((char *)dst + dst_step);
>             sum = (signed int *)   ((char *)sum + sum_step);
>         }
>
>     } else {
>         for (;;) {
>             sample = *src;
>             sample += *sum;
>             *sum = sample;
>
>             if (sample > 0x7fff)
>                 sample = 0x7fff;
>             else if (sample < -0x8000)
>                 sample = -0x8000;
>             *dst = sample;
>
>             if (!--size)
>                 return;
>
>             src = (signed short *) ((char *)src + src_step);
>             dst = (signed short *) ((char *)dst + dst_step);
>             sum = (signed int *)   ((char *)sum + sum_step);
>         }
>     }
>
> Thank you!
>
> Best Regards,
> Giuliano


More information about the Alsa-devel mailing list