[Sound-open-firmware] Mixer doubts
Liam Girdwood
liam.r.girdwood at linux.intel.com
Tue Jul 17 11:45:55 CEST 2018
On Tue, 2018-07-17 at 08:45 +0200, slawomir.blauciak at linux.intel.com wrote:
> Hello, everyone.
>
> I’ve been reading through the mixer code and there’s one part which leaves me
> somewhat doubtful:
>
> /* mix N PCM source streams to one sink stream */
> static void mix_n(struct comp_dev *dev, struct comp_buffer *sink,
> struct comp_buffer **sources, uint32_t num_sources, uint32_t frames)
> {
> int32_t *src;
> int32_t *dest = sink->w_ptr;
> int32_t count;
> int64_t val[2];
> int i;
> int j;
>
> count = frames * dev->params.channels;
>
> for (i = 0; i < count; i += 2) {
> val[0] = 0;
> val[1] = 0;
> for (j = 0; j < num_sources; j++) {
> src = sources[j]->r_ptr;
>
> /* TODO: clamp */
> val[0] += src[i];
> val[1] += src[i + 1];
> }
>
> /* TODO: best place for attenuation ? */
> dest[i] = (val[0] >> (num_sources >> 1));
> dest[i + 1] = (val[1] >> (num_sources >> 1));
> }
> }
>
>
> More specifically:
> dest[i] = (val[0] >> (num_sources >> 1));
> dest[i + 1] = (val[1] >> (num_sources >> 1));
>
> Going back in the history of the file I found it was supposed to be an
> average.
> However, it will only be an average if num_sources is power of 2, because
> otherwise such bitwise operations will yield different results from what I
> take should be an optimized way for division.
>
> For example, suppose we have 2 cases:
> • We have 2 sources, thus num_sources >> 1 will equal 1, valid right bitshift,
> same as division by the number of sources, which is 2
> • We have 3 sources, thus num_sources >> 1 will equal 1 once again, no longer
> valid, because it will yield the same result as division by 2, instead of 3.
>
> There’s one more “problem”, by averaging the samples like that we will end up
> with quieter output for when we have 1 source completely silent. Is that
> intentional?
>
> Whether it’s all deliberate or not, or simply whether I misunderstood the
> code, I hope you can help me clear this up.
>
The intention is we have a generic optimised version that is easy to vectorize
for 2,4,8 channels (on any architecture). We will need to have a separate
generic mixer for 1,3,5,6 etc.
We should also have architecture specific mixing too like we have for xtensa
HiFi3 volume.
Liam
> Thank you,
> Sławomir Błauciak
>
> _______________________________________________
> Sound-open-firmware mailing list
> Sound-open-firmware at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/sound-open-firmware
More information about the Sound-open-firmware
mailing list