[alsa-devel] alsa-lib: Rate conversion broken for non-S16?
Mark Hills
mark at pogo.org.uk
Sun Aug 1 23:43:31 CEST 2010
I have a device (snd-usb-caiaq) whose native sample format is S24_3BE.
When sample rate conversion is used, the audio becomes near silent,
distorted, and only in the left channel.
It is reproducable with aplay (see example below). Recording is not
affected. Playback is correct if only format conversion is used.
It looks something is causing the incorrect put function to be used by the
rate conversion.
I traced it to linear_expand() and others, alsa-lib-src/pcm_rate_linear.c.
Forcing the function to put S16 format into the destination buffer allows,
suprisingly, the sound to be heard correctly and at full volume from both
aplay and xwax:
if (rate->put_idx == 10)
rate->put_idx = 6
I suspected that linear_init() is looking in the wrong place to choose the
attributes for the rate conversion. After some time spent I cannot see it.
But is there any reason that the output buffer for the rate conversion
would not be in S24_3BE? And for the rate conversion to be misinformed?
$ uname -s -r -v -p -i -m
Linux 2.6.34.1-mh #83 SMP PREEMPT Wed Jul 21 23:25:33 BST 2010 i686 pentium4 i386
$ alsacap
Card 0, ID `Audio8DJ', name `Audio 8 DJ'
Device 0, ID `Audio 8 DJ', name `Audio 8 DJ', 4 subdevices (4 available)
2 channels, sampling rate 44100..96000 Hz
Sample formats: S24_3BE
Subdevice 0, name `subdevice #0'
Subdevice 1, name `subdevice #1'
Subdevice 2, name `subdevice #2'
Subdevice 3, name `subdevice #3'
$ aplay -v -D plughw:Audio8DJ,0,0 halcyon-24000.wav
Playing WAVE 'halcyon-24000.wav' : Signed 16 bit Little Endian, Rate 24000 Hz, Stereo
Plug PCM: Rate conversion PCM (48000, sformat=S24_3BE)
Converter: linear-interpolation
Protocol version: 10002
Its setup is:
stream : PLAYBACK
access : RW_INTERLEAVED
format : S16_LE
subformat : STD
channels : 2
rate : 24000
exact rate : 24000 (24000/1)
msbits : 16
buffer_size : 10922
period_size : 2730
period_time : 113770
tstamp_mode : NONE
period_step : 1
avail_min : 2730
period_event : 0
start_threshold : 10922
stop_threshold : 10922
silence_threshold: 0
silence_size : 0
boundary : 715784192
Slave: Hardware PCM card 0 'Audio 8 DJ' device 0 subdevice 0
Its setup is:
stream : PLAYBACK
access : MMAP_INTERLEAVED
format : S24_3BE
subformat : STD
channels : 2
rate : 48000
exact rate : 48000 (48000/1)
msbits : 24
buffer_size : 21845
period_size : 5461
period_time : 113770
tstamp_mode : NONE
period_step : 1
avail_min : 5461
period_event : 0
start_threshold : 21844
stop_threshold : 21845
silence_threshold: 0
silence_size : 0
boundary : 1431633920
appl_ptr : 0
hw_ptr : 0
--
Mark
More information about the Alsa-devel
mailing list