The PCM route plugin can assign the destination value from average of
multiple sources with attenuation. This requires the read of each
channel value, sums and writes the resultant value in the requested
format.
Currently, get_labels is used for reading source values while
put32_labels is used for writing the dest value. This is, however,
a buggy implementation; get_labels gives the value as is only with
endianness and signedness conversions, but put32_labels assumes that
the value is normalized to 32bit int and it shifts down to the dest
format. In addition, the current code lacks get_labels entries for
the 24bit formats, as Shengjiu Wang spotted out.
For fixing these bugs, this patch replaces the read with
get32_labels and use always 64bit int for sum. This simplifies the
code a lot and drops many lines.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
In the put conversion, the support for 3-byte formats was missing.
This resulted in inaudible volume with rate plugin & co.
Typos fixed by Mark Hills <mark@pogo.org.uk>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
By doing this we move them from the .data section to .rodata setion,
or from .data.rel to .data.rel.ro.
The .rodata section is mapped directly from the on-disk file, which is
always a save, while .data.rel.ro is mapped directly when using
prelink, which is a save in a lot of cases.
Signed-off-by: Diego E. 'Flameeyes' Pettenò <flameeyes@gmail.com>
The rounding done when converting to smaller sample widths fails for
saturated positive samples; in this case, the sample value overflows and
becomes negative. We are better off without rounding, even if we then
have quantization noise (of at most half the resolution of the least
significant bit).
ALSA bug#3360; Debian #437827; GNOME #436192; LP #116990; Mandriva #33908
Improve the sample conversion in plug layer for the sample bits
reduction. Use round instead of truncating, which introduces
more quantization noise.
Original patch by Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>