Discussion:
Usb audio - unsuported sampling rates
Gordon Dilan
2012-07-10 05:25:31 UTC
Permalink
Hello,

I'm using an usb mic which(according to it's producer should support up to
48kHz sampling rate). The problem is ALSA allows me to use only 16 kHz for
this device. I do not want to resample the data, I want to sample it at
48kHz in order to be able to record some high pitch sounds 18-20kHz.

I would want to try to do any modifications necessary in order to try
support 48kHz, but I'm not sure where to start.

Some information:

cat /proc/asound/modules
...
1 snd_usb_audio

arecord --list-devices
**** List of CAPTURE Hardware Devices ****
....
card 1: CameraB409241 [USB Camera-B4.09.24.1], device 0: USB Audio [USB
Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0


when I try to use: arecord -v -D hw:1,0 -f S16_LE -c 4 -r 48000 gigi.wav
I get this:

Recording WAVE 'gigi.wav' : Signed 16 bit Little Endian, Rate 48000 Hz,
Channels 4
Warning: rate is not accurate (requested = 48000Hz, got = 16000Hz)
please, try the plug plugin
Hardware PCM card 1 'USB Camera-B4.09.24.1' device 0 subdevice 0
Its setup is:
stream : CAPTURE
access : RW_INTERLEAVED
format : S16_LE
subformat : STD
channels : 4
rate : 16000
exact rate : 16000 (16000/1)
msbits : 16
buffer_size : 8000
period_size : 2000
period_time : 125000
tstamp_mode : NONE
period_step : 1
avail_min : 2000
period_event : 0
start_threshold : 1
stop_threshold : 8000
silence_threshold: 0
silence_size : 0
boundary : 2097152000
appl_ptr : 0
hw_ptr : 0


Any sampling rate I would try higher or lower than 16kHz, I will always get
16000 kHz.

Some more information:
lsusb
Bus 001 Device 007: ID 1415:2000 Nam Tai E&E Products Ltd. or OmniVision
Technologies, Inc. Sony Playstation Eye

lsusb -t

/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M
|__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
|__ Port 2: Dev 7, If 0, Class=vend., Driver=ov534, 480M
|__ Port 2: Dev 7, If 1, Class=audio, Driver=snd-usb-audio, 480M
|__ Port 2: Dev 7, If 2, Class=audio, Driver=snd-usb-audio, 480M


At the moment I'm looking inside ALSA's source code to try to see from
where this limitation of 16000kHz for my device appears, but I have to
admit that I'm kind of lost.
Any pointers on what direction should I go to try make my desired rate
supported would be greatly appreciated!

Thank you and best regards,
Gordon
Daniel Mack
2012-07-10 06:53:54 UTC
Permalink
Hi,
Post by Gordon Dilan
I'm using an usb mic which(according to it's producer should support up to
48kHz sampling rate). The problem is ALSA allows me to use only 16 kHz for
this device. I do not want to resample the data, I want to sample it at
48kHz in order to be able to record some high pitch sounds 18-20kHz.
I would want to try to do any modifications necessary in order to try
support 48kHz, but I'm not sure where to start.
[...]
Post by Gordon Dilan
lsusb
Bus 001 Device 007: ID 1415:2000 Nam Tai E&E Products Ltd. or OmniVision
Technologies, Inc. Sony Playstation Eye
lsusb -t
Please also provide the output of 'lsusb -v'.
Post by Gordon Dilan
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M
|__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
|__ Port 2: Dev 7, If 0, Class=vend., Driver=ov534, 480M
|__ Port 2: Dev 7, If 1, Class=audio, Driver=snd-usb-audio, 480M
|__ Port 2: Dev 7, If 2, Class=audio, Driver=snd-usb-audio, 480M
At the moment I'm looking inside ALSA's source code to try to see from
where this limitation of 16000kHz for my device appears, but I have to
admit that I'm kind of lost.
Any pointers on what direction should I go to try make my desired rate
supported would be greatly appreciated!
The device is queried for its supported sample rates during probe using
class-specific commands. If it doesn't return all rates that are
actually supported, we need to add a quirk and override this list.

The list of known sample rates is included in
/proc/asound/card1/stream0. What does that show for you?



Daniel
Gordon Dilan
2012-07-10 18:57:38 UTC
Permalink
Hello Daniel,

Thank you very much for your reply !!!

Please see below.
Post by Daniel Mack
Hi,
Post by Gordon Dilan
I'm using an usb mic which(according to it's producer should support up
to
Post by Gordon Dilan
48kHz sampling rate). The problem is ALSA allows me to use only 16 kHz
for
Post by Gordon Dilan
this device. I do not want to resample the data, I want to sample it at
48kHz in order to be able to record some high pitch sounds 18-20kHz.
I would want to try to do any modifications necessary in order to try
support 48kHz, but I'm not sure where to start.
[...]
Post by Gordon Dilan
lsusb
Bus 001 Device 007: ID 1415:2000 Nam Tai E&E Products Ltd. or OmniVision
Technologies, Inc. Sony Playstation Eye
lsusb -t
Please also provide the output of 'lsusb -v'.
I've appended the output at the end of this mail.
Since the output is long, I've also put it on pastebin:
http://pastebin.com/tpY1thht
Post by Daniel Mack
Post by Gordon Dilan
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M
|__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
|__ Port 2: Dev 7, If 0, Class=vend., Driver=ov534, 480M
|__ Port 2: Dev 7, If 1, Class=audio, Driver=snd-usb-audio, 480M
|__ Port 2: Dev 7, If 2, Class=audio, Driver=snd-usb-audio, 480M
At the moment I'm looking inside ALSA's source code to try to see from
where this limitation of 16000kHz for my device appears, but I have to
admit that I'm kind of lost.
Any pointers on what direction should I go to try make my desired rate
supported would be greatly appreciated!
The device is queried for its supported sample rates during probe using
class-specific commands. If it doesn't return all rates that are
actually supported, we need to add a quirk and override this list.
The list of known sample rates is included in
/proc/asound/card1/stream0. What does that show for you?
cat /proc/asound/card1/stream0
OmniVision Technologies, Inc. USB Camera-B4.09.24.1 at
usb-0000:00:1a.0-1.2, hi : USB Audio

Capture:
Status: Stop
Interface 2
Altset 1
Format: S16_LE
Channels: 4
Endpoint: 4 IN (ASYNC)
Rates: 16000
Data packet interval: 1000 us
Post by Daniel Mack
Daniel
I mention that while trying to record using arecord I see in
/var/logs/messages: "kernel: [20914.414286] ALSA clock.c:242 current rate
177346 is different from the runtime rate 16000"
The current rate reported here varies for each call of arecord. Eg it can
be: 676371, 508390, 139882 etc. The values reported are too high to be
real.

lsusb -v

Bus 001 Device 008: ID 1415:2000 Nam Tai E&E Products Ltd. or OmniVision
Technologies, Inc. Sony Playstation Eye
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x1415 Nam Tai E&E Products Ltd. or OmniVision
Technologies, Inc.
idProduct 0x2000 Sony Playstation Eye
bcdDevice 2.00
iManufacturer 1 OmniVision Technologies, Inc.
iProduct 2 USB Camera-B4.09.24.1
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 142
bNumInterfaces 3
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 1 Audio
bInterfaceSubClass 1 Control Device
bInterfaceProtocol 0
iInterface 0
AudioControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 1 (HEADER)
bcdADC 1.00
wTotalLength 42
bInCollection 1
baInterfaceNr( 0) 2
AudioControl Interface Descriptor:
bLength 12
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 1
wTerminalType 0x0201 Microphone
bAssocTerminal 2
bNrChannels 4
wChannelConfig 0x0000
iChannelNames 0
iTerminal 0
AudioControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 3 (OUTPUT_TERMINAL)
bTerminalID 2
wTerminalType 0x0101 USB Streaming
bAssocTerminal 1
bSourceID 3
iTerminal 0
AudioControl Interface Descriptor:
bLength 12
bDescriptorType 36
bDescriptorSubtype 6 (FEATURE_UNIT)
bUnitID 3
bSourceID 1
bControlSize 1
bmaControls( 0) 0x00
bmaControls( 1) 0x02
Volume Control
bmaControls( 2) 0x02
Volume Control
bmaControls( 3) 0x02
Volume Control
bmaControls( 4) 0x02
Volume Control
iFeature 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 0
AudioStreaming Interface Descriptor:
bLength 7
bDescriptorType 36
bDescriptorSubtype 1 (AS_GENERAL)
bTerminalLink 2
bDelay 1 frames
wFormatTag 1 PCM
AudioStreaming Interface Descriptor:
bLength 11
bDescriptorType 36
bDescriptorSubtype 2 (FORMAT_TYPE)
bFormatType 1 (FORMAT_TYPE_I)
bNrChannels 4
bSubframeSize 2
bBitResolution 16
bSamFreqType 1 Discrete
tSamFreq[ 0] 16000
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x84 EP 4 IN
bmAttributes 5
Transfer Type Isochronous
Synch Type Asynchronous
Usage Type Data
wMaxPacketSize 0x0300 1x 768 bytes
bInterval 4
bRefresh 0
bSynchAddress 0
AudioControl Endpoint Descriptor:
bLength 7
bDescriptorType 37
bDescriptorSubtype 1 (EP_GENERAL)
bmAttributes 0x01
Sampling Frequency
bLockDelayUnits 0 Undefined
wLockDelay 0 Undefined
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0000
(Bus Powered)



Once again thank you,
Gordon
Daniel Mack
2012-07-10 21:33:02 UTC
Permalink
Hi Gordon,

On 10.07.2012 20:57, Gordon Dilan wrote:
0
Post by Gordon Dilan
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 0
bLength 7
bDescriptorType 36
bDescriptorSubtype 1 (AS_GENERAL)
bTerminalLink 2
bDelay 1 frames
wFormatTag 1 PCM
bLength 11
bDescriptorType 36
bDescriptorSubtype 2 (FORMAT_TYPE)
bFormatType 1 (FORMAT_TYPE_I)
bNrChannels 4
bSubframeSize 2
bBitResolution 16
bSamFreqType 1 Discrete
tSamFreq[ 0] 16000
The interface only reports this single sample rate. If the vendor claims
that there are in fact more, it would be good to know which ones.

Then we can add a quirk to parse_audio_format_rates_v1() in
sound/usb/format.c - that shouldn't be too hard.


Daniel
Daniel Mack
2012-07-12 07:44:34 UTC
Permalink
Post by Daniel Mack
Hi Gordon,
0
Post by Gordon Dilan
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 0
bLength 7
bDescriptorType 36
bDescriptorSubtype 1 (AS_GENERAL)
bTerminalLink 2
bDelay 1 frames
wFormatTag 1 PCM
bLength 11
bDescriptorType 36
bDescriptorSubtype 2 (FORMAT_TYPE)
bFormatType 1 (FORMAT_TYPE_I)
bNrChannels 4
bSubframeSize 2
bBitResolution 16
bSamFreqType 1 Discrete
tSamFreq[ 0] 16000
The interface only reports this single sample rate. If the vendor claims
that there are in fact more, it would be good to know which ones.
Then we can add a quirk to parse_audio_format_rates_v1() in
sound/usb/format.c - that shouldn't be too hard.
Something like the patch below could help. Can you try this?


Daniel
Gordon Dilan
2012-07-14 09:01:40 UTC
Permalink
Hello Daniel,

Thank you very much for your help and sorry for the late answer. I was
without internet access for the last few days.

I have tried the patch that you sent me(with a minor modification:
fp->rate_max(instead of min) = 48000; ).
If I try to record using 48kHz and then playback, it will playback in "fast
speed", voices being recorded as "chipmunks".
Only at 16000Hz it records at "normal speed".

So it seems that the recording is still done in fact at 16kHz, even though
now the driver appears to support sampling rates between 16000-48000Hz.

Dmesg is also showing me this everytime I try to record using the
microphone(These messages appeared even without the driver modification):
[ 165.364728] ALSA clock.c:242 current rate 175902 is different from the
runtime rate 48000
[ 171.838509] ALSA clock.c:242 current rate 51816 is different from the
runtime rate 48000
[ 206.950822] ALSA clock.c:242 current rate 281039 is different from the
runtime rate 48000
[ 968.713856] ALSA clock.c:242 current rate 6096811 is different from the
runtime rate 48000

Once again, thank you very much for your support!

Best Regards,
Gordon
Post by Daniel Mack
Post by Daniel Mack
Hi Gordon,
0
Post by Gordon Dilan
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 0
bLength 7
bDescriptorType 36
bDescriptorSubtype 1 (AS_GENERAL)
bTerminalLink 2
bDelay 1 frames
wFormatTag 1 PCM
bLength 11
bDescriptorType 36
bDescriptorSubtype 2 (FORMAT_TYPE)
bFormatType 1 (FORMAT_TYPE_I)
bNrChannels 4
bSubframeSize 2
bBitResolution 16
bSamFreqType 1 Discrete
tSamFreq[ 0] 16000
The interface only reports this single sample rate. If the vendor claims
that there are in fact more, it would be good to know which ones.
Then we can add a quirk to parse_audio_format_rates_v1() in
sound/usb/format.c - that shouldn't be too hard.
Something like the patch below could help. Can you try this?
Daniel
Loading...