mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
pcm: fix a bug to copy silent samples aligned to 64
bits for 24 bit sample cases A function of 'snd_pcm_area_silence()' has a fast path to copy silent data efficiently. However, the fast path works well just for a case that target buffer consists of data samples for which unit of data alignment is divisors of 64 bits. At present, the fast path handles sample data aligned to 24 bit. In this case, the buffer can includes extra 8 bits. This has no issue for 'signed' case because silent data is zero, however it has an issue for 'unsigned' case. This commit fixes the bug by skipping cases of sample data of 24 bit. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
e24dc73bd6
commit
36decd209f
1 changed files with 5 additions and 1 deletions
|
|
@ -2947,7 +2947,11 @@ int snd_pcm_area_silence(const snd_pcm_channel_area_t *dst_area, snd_pcm_uframes
|
|||
dst = snd_pcm_channel_area_addr(dst_area, dst_offset);
|
||||
width = snd_pcm_format_physical_width(format);
|
||||
silence = snd_pcm_format_silence_64(format);
|
||||
if (dst_area->step == (unsigned int) width) {
|
||||
/*
|
||||
* Iterate copying silent sample for sample data aligned to 64 bit.
|
||||
* This is a fast path.
|
||||
*/
|
||||
if (dst_area->step == (unsigned int) width && (64 % width) == 0) {
|
||||
unsigned int dwords = samples * width / 64;
|
||||
uint64_t *dstp = (uint64_t *)dst;
|
||||
samples -= dwords * 64 / width;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue