* USB dB data
@ 2017-08-30 19:48 Jack Bates
2017-09-01 7:34 ` Takashi Iwai
0 siblings, 1 reply; 5+ messages in thread
From: Jack Bates @ 2017-08-30 19:48 UTC (permalink / raw)
To: alsa-devel
I confirmed with Wireshark that my USB sound card responds to GET_MIN
with 0x0000 and GET_MAX with 0x6300 .. The audio device class definition
[1] says the units are 1/256 dB (section 5.2.2.2.3: Mixer Control) ...
So by my calculation, the min and max are 0 and 99 dB (0x6300 / 256 ==
99) ... Why then does alsactl print:
> range '0 - 99'
> dbmin 0
> dbmax 38
(/usr/sbin/aslactl -f - store)
I originally asked about this on the pulseaudio-discuss list [2] because
it uses "dB data" [3].
The "0 - 99" makes sense -- it lines up with my calculation ... Where
does the 38 come from? (I expect it's obvious, I just haven't found the
explanation?)
Background: I just got a Bose SoundLink Revolve ... When I connect it
with USB, the volume is silent from 0 to 99% and deafening at 100%
(using PulseAudio). Directly adjusting the volume with alsamixer works
properly: It increases smoothly from 0 to 100% -- changes that are
reflected in the PulseAudio volume as fine adjustments in between 99 and
100% (64587 to 65536 PulseAudio volume).
From what I've read there's a common problem where especially USB
devices report the wrong dB data (don't follow the spec [4]) -- this has
previously been handled by patching the USB audio driver [5] ... However
I haven't figured out how my device deviates from the spec (0x0000 to
0x6300 or 0 to 99 dB seem plausible) -- my understanding is incomplete:
I haven't figured out where the value 38 comes from ...
[1] http://www.usb.org/developers/docs/devclass_docs/audio10.pdf
[2]
https://lists.freedesktop.org/archives/pulseaudio-discuss/2017-August/028600.html
[3] http://0pointer.de/blog/projects/decibel-data
[4] https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/637066
[5] https://bugs.freedesktop.org/show_bug.cgi?id=93193#c14
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: USB dB data
2017-08-30 19:48 USB dB data Jack Bates
@ 2017-09-01 7:34 ` Takashi Iwai
2017-09-05 23:55 ` Jack Bates
0 siblings, 1 reply; 5+ messages in thread
From: Takashi Iwai @ 2017-09-01 7:34 UTC (permalink / raw)
To: Jack Bates; +Cc: alsa-devel
On Wed, 30 Aug 2017 21:48:58 +0200,
Jack Bates wrote:
>
> I confirmed with Wireshark that my USB sound card responds to GET_MIN
> with 0x0000 and GET_MAX with 0x6300 .. The audio device class
> definition [1] says the units are 1/256 dB (section 5.2.2.2.3: Mixer
> Control) ... So by my calculation, the min and max are 0 and 99 dB
> (0x6300 / 256 == 99) ... Why then does alsactl print:
>
> > range '0 - 99'
> > dbmin 0
> > dbmax 38
>
> (/usr/sbin/aslactl -f - store)
>
> I originally asked about this on the pulseaudio-discuss list [2]
> because it uses "dB data" [3].
>
> The "0 - 99" makes sense -- it lines up with my calculation ... Where
> does the 38 come from? (I expect it's obvious, I just haven't found
> the explanation?)
Hm, what shows /proc/asound/card*/usbmixer proc file?
It contains some raw data.
Basically the driver simply interprets the USB descriptor min/max
unless there are overriding mappings by quirk list.
Takashi
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: USB dB data
2017-09-01 7:34 ` Takashi Iwai
@ 2017-09-05 23:55 ` Jack Bates
2017-09-06 6:04 ` Takashi Iwai
0 siblings, 1 reply; 5+ messages in thread
From: Jack Bates @ 2017-09-05 23:55 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel
On 01/09/17 12:34 AM, Takashi Iwai wrote:
> On Wed, 30 Aug 2017 21:48:58 +0200,
> Jack Bates wrote:
>>
>> I confirmed with Wireshark that my USB sound card responds to GET_MIN
>> with 0x0000 and GET_MAX with 0x6300 .. The audio device class
>> definition [1] says the units are 1/256 dB (section 5.2.2.2.3: Mixer
>> Control) ... So by my calculation, the min and max are 0 and 99 dB
>> (0x6300 / 256 == 99) ... Why then does alsactl print:
>>
>>> range '0 - 99'
>>> dbmin 0
>>> dbmax 38
>>
>> (/usr/sbin/aslactl -f - store)
>>
>> I originally asked about this on the pulseaudio-discuss list [2]
>> because it uses "dB data" [3].
>>
>> The "0 - 99" makes sense -- it lines up with my calculation ... Where
>> does the 38 come from? (I expect it's obvious, I just haven't found
>> the explanation?)
>
> Hm, what shows /proc/asound/card*/usbmixer proc file?
> It contains some raw data.
It also shows dBmax=38 (it matches alsactl):
> nottheoilrig@debian:~$ cat /proc/asound/card2/usbmixer
> USB Mixer: usb_id=0x05a740fa, ctrlif=0, ctlerr=0
> Card: Bose Corporation Bose Revolve SoundLink at usb-0000:00:14.0-1, full speed
> Unit: 2
> Control: name="PCM Playback Volume", index=0
> Info: id=2, control=2, cmask=0x0, channels=1, type="S16"
> Volume: min=0, max=99, dBmin=0, dBmax=38
> Unit: 2
> Control: name="PCM Playback Switch", index=0
> Info: id=2, control=1, cmask=0x0, channels=1, type="INV_BOOLEAN"
> Volume: min=0, max=1, dBmin=0, dBmax=0
> nottheoilrig@debian:~$
> Basically the driver simply interprets the USB descriptor min/max
> unless there are overriding mappings by quirk list.
How can I inspect the device's USB descriptor min/max (to confirm that
38 *is* what's advertised)? I was using Wireshark to capture the GET_MAX
request and response ([1] section 5.2.2.2.2: Get Mixer Unit Control
Request) -- in which case the response data is 0x6300 ...
If the source behind the usbmixer proc file/dB data is the GET_MAX
response, then how does 0x6300 turn into 38 dB? I haven't spotted any
obvious quirks for usb_id=0x05a740fa (although I haven't read all of
mixer.c) ... get_min_max_with_quirks() would seem to interpret it as
1/256 dB [2] (as per the spec) but 0x6300 / 256 != 38 ...
[1] http://www.usb.org/developers/docs/devclass_docs/audio10.pdf
[2]
https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git/tree/sound/usb/mixer.c#n1046
Here's the lsusb output:
> Bus 001 Device 008: ID 05a7:40fa Bose Corp.
> Device Descriptor:
> bLength 18
> bDescriptorType 1
> bcdUSB 2.00
> bDeviceClass 239 Miscellaneous Device
> bDeviceSubClass 2 ?
> bDeviceProtocol 1 Interface Association
> bMaxPacketSize0 64
> idVendor 0x05a7 Bose Corp.
> idProduct 0x40fa
> bcdDevice 1.00
> iManufacturer 1
> iProduct 2
> iSerial 3
> bNumConfigurations 1
> Configuration Descriptor:
> bLength 9
> bDescriptorType 2
> wTotalLength 156
> bNumInterfaces 3
> bConfigurationValue 1
> iConfiguration 0
> bmAttributes 0xc0
> Self Powered
> MaxPower 500mA
> Interface Association:
> bLength 8
> bDescriptorType 11
> bFirstInterface 0
> bInterfaceCount 2
> bFunctionClass 1 Audio
> bFunctionSubClass 1 Control Device
> bFunctionProtocol 0
> iFunction 0
> Interface Descriptor:
> bLength 9
> bDescriptorType 4
> bInterfaceNumber 0
> 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 43
> bInCollection 1
> baInterfaceNr( 0) 1
> AudioControl Interface Descriptor:
> bLength 12
> bDescriptorType 36
> bDescriptorSubtype 2 (INPUT_TERMINAL)
> bTerminalID 1
> wTerminalType 0x0101 USB Streaming
> bAssocTerminal 0
> bNrChannels 2
> wChannelConfig 0x0003
> Left Front (L)
> Right Front (R)
> iChannelNames 0
> iTerminal 0
> AudioControl Interface Descriptor:
> bLength 13
> bDescriptorType 36
> bDescriptorSubtype 6 (FEATURE_UNIT)
> bUnitID 2
> bSourceID 1
> bControlSize 2
> bmaControls( 0) 0x03
> bmaControls( 0) 0x00
> Mute Control
> Volume Control
> bmaControls( 1) 0x00
> bmaControls( 1) 0x00
> bmaControls( 2) 0x00
> bmaControls( 2) 0x00
> iFeature 0
> AudioControl Interface Descriptor:
> bLength 9
> bDescriptorType 36
> bDescriptorSubtype 3 (OUTPUT_TERMINAL)
> bTerminalID 3
> wTerminalType 0x0301 Speaker
> bAssocTerminal 0
> bSourceID 2
> iTerminal 0
> Interface Descriptor:
> bLength 9
> bDescriptorType 4
> bInterfaceNumber 1
> bAlternateSetting 0
> bNumEndpoints 0
> bInterfaceClass 1 Audio
> bInterfaceSubClass 2 Streaming
> bInterfaceProtocol 0
> iInterface 0
> Interface Descriptor:
> bLength 9
> bDescriptorType 4
> bInterfaceNumber 1
> 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 1
> bDelay 0 frames
> wFormatTag 1 PCM
> AudioStreaming Interface Descriptor:
> bLength 14
> bDescriptorType 36
> bDescriptorSubtype 2 (FORMAT_TYPE)
> bFormatType 1 (FORMAT_TYPE_I)
> bNrChannels 2
> bSubframeSize 2
> bBitResolution 16
> bSamFreqType 2 Discrete
> tSamFreq[ 0] 48000
> tSamFreq[ 1] 44100
> AudioControl Endpoint Descriptor:
> bLength 7
> bDescriptorType 37
> bDescriptorSubtype 1 (EP_GENERAL)
> bmAttributes 0x81
> Sampling Frequency
> MaxPacketsOnly
> bLockDelayUnits 0 Undefined
> wLockDelay 0 Undefined
> Endpoint Descriptor:
> bLength 9
> bDescriptorType 5
> bEndpointAddress 0x03 EP 3 OUT
> bmAttributes 1
> Transfer Type Isochronous
> Synch Type None
> Usage Type Data
> wMaxPacketSize 0x00c0 1x 192 bytes
> bInterval 1
> bRefresh 0
> bSynchAddress 0
> Interface Descriptor:
> bLength 9
> bDescriptorType 4
> bInterfaceNumber 2
> bAlternateSetting 0
> bNumEndpoints 2
> bInterfaceClass 3 Human Interface Device
> bInterfaceSubClass 0 No Subclass
> bInterfaceProtocol 0 None
> iInterface 0
> HID Device Descriptor:
> bLength 9
> bDescriptorType 33
> bcdHID 1.11
> bCountryCode 0 Not supported
> bNumDescriptors 1
> bDescriptorType 34 Report
> wDescriptorLength 126
> Report Descriptors:
> ** UNAVAILABLE **
> Endpoint Descriptor:
> bLength 7
> bDescriptorType 5
> bEndpointAddress 0x81 EP 1 IN
> bmAttributes 3
> Transfer Type Interrupt
> Synch Type None
> Usage Type Data
> wMaxPacketSize 0x0040 1x 64 bytes
> bInterval 1
> Endpoint Descriptor:
> bLength 7
> bDescriptorType 5
> bEndpointAddress 0x02 EP 2 OUT
> bmAttributes 3
> Transfer Type Interrupt
> Synch Type None
> Usage Type Data
> wMaxPacketSize 0x0040 1x 64 bytes
> bInterval 1
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: USB dB data
2017-09-05 23:55 ` Jack Bates
@ 2017-09-06 6:04 ` Takashi Iwai
0 siblings, 0 replies; 5+ messages in thread
From: Takashi Iwai @ 2017-09-06 6:04 UTC (permalink / raw)
To: Jack Bates; +Cc: alsa-devel
On Wed, 06 Sep 2017 01:55:51 +0200,
Jack Bates wrote:
>
> On 01/09/17 12:34 AM, Takashi Iwai wrote:
> > On Wed, 30 Aug 2017 21:48:58 +0200,
> > Jack Bates wrote:
> >>
> >> I confirmed with Wireshark that my USB sound card responds to GET_MIN
> >> with 0x0000 and GET_MAX with 0x6300 .. The audio device class
> >> definition [1] says the units are 1/256 dB (section 5.2.2.2.3: Mixer
> >> Control) ... So by my calculation, the min and max are 0 and 99 dB
> >> (0x6300 / 256 == 99) ... Why then does alsactl print:
> >>
> >>> range '0 - 99'
> >>> dbmin 0
> >>> dbmax 38
> >>
> >> (/usr/sbin/aslactl -f - store)
> >>
> >> I originally asked about this on the pulseaudio-discuss list [2]
> >> because it uses "dB data" [3].
> >>
> >> The "0 - 99" makes sense -- it lines up with my calculation ... Where
> >> does the 38 come from? (I expect it's obvious, I just haven't found
> >> the explanation?)
> >
> > Hm, what shows /proc/asound/card*/usbmixer proc file?
> > It contains some raw data.
>
> It also shows dBmax=38 (it matches alsactl):
>
> > nottheoilrig@debian:~$ cat /proc/asound/card2/usbmixer
> > USB Mixer: usb_id=0x05a740fa, ctrlif=0, ctlerr=0
> > Card: Bose Corporation Bose Revolve SoundLink at usb-0000:00:14.0-1, full speed
> > Unit: 2
> > Control: name="PCM Playback Volume", index=0
> > Info: id=2, control=2, cmask=0x0, channels=1, type="S16"
> > Volume: min=0, max=99, dBmin=0, dBmax=38
> > Unit: 2
> > Control: name="PCM Playback Switch", index=0
> > Info: id=2, control=1, cmask=0x0, channels=1, type="INV_BOOLEAN"
> > Volume: min=0, max=1, dBmin=0, dBmax=0
> > nottheoilrig@debian:~$
>
> > Basically the driver simply interprets the USB descriptor min/max
> > unless there are overriding mappings by quirk list.
>
> How can I inspect the device's USB descriptor min/max (to confirm that
> 38 *is* what's advertised)? I was using Wireshark to capture the
> GET_MAX request and response ([1] section 5.2.2.2.2: Get Mixer Unit
> Control Request) -- in which case the response data is 0x6300 ...
>
> If the source behind the usbmixer proc file/dB data is the GET_MAX
> response, then how does 0x6300 turn into 38 dB? I haven't spotted any
> obvious quirks for usb_id=0x05a740fa (although I haven't read all of
> mixer.c) ... get_min_max_with_quirks() would seem to interpret it as
> 1/256 dB [2] (as per the spec) but 0x6300 / 256 != 38 ...
I also see no special code doing wrong, could you check via an
old-good way, e.g. just adding some debug prints?
thanks,
Takashi
^ permalink raw reply [flat|nested] 5+ messages in thread
* USB dB data
@ 2017-08-30 19:53 Jack Bates
0 siblings, 0 replies; 5+ messages in thread
From: Jack Bates @ 2017-08-30 19:53 UTC (permalink / raw)
To: alsa-devel
I confirmed with Wireshark that my USB sound card responds to GET_MIN
with 0x0000 and GET_MAX with 0x6300 .. The audio device class definition
[1] says the units are 1/256 dB (section 5.2.2.2.3: Mixer Control) ...
So by my calculation, the min and max are 0 and 99 dB (0x6300 / 256 ==
99) ... Why then does alsactl print:
> range '0 - 99'
> dbmin 0
> dbmax 38
(/usr/sbin/aslactl -f - store)
I originally asked about this on the pulseaudio-discuss list [2] because
it uses "dB data" [3].
The "0 - 99" makes sense -- it lines up with my calculation ... Where
does the 38 come from? (I expect it's obvious, I just haven't found the
explanation?)
Background: I just got a Bose SoundLink Revolve ... When I connect it
with USB, the volume is silent from 0 to 99% and deafening at 100%
(using PulseAudio). Directly adjusting the volume with alsamixer works
properly: It increases smoothly from 0 to 100% -- changes that are
reflected in the PulseAudio volume as fine adjustments in between 99 and
100% (64587 to 65536 PulseAudio volume).
From what I've read there's a common problem where especially USB
devices report the wrong dB data (don't follow the spec [4]) -- this has
previously been handled by patching the USB audio driver [5] ... However
I haven't figured out how my device deviates from the spec (0x0000 to
0x6300 or 0 to 99 dB seem plausible) -- my understanding is incomplete:
I haven't figured out where the value 38 comes from ...
[1] http://www.usb.org/developers/docs/devclass_docs/audio10.pdf
[2]
https://lists.freedesktop.org/archives/pulseaudio-discuss/2017-August/028600.html
[3] http://0pointer.de/blog/projects/decibel-data
[4] https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/637066
[5] https://bugs.freedesktop.org/show_bug.cgi?id=93193#c14
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-09-06 6:04 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-30 19:48 USB dB data Jack Bates
2017-09-01 7:34 ` Takashi Iwai
2017-09-05 23:55 ` Jack Bates
2017-09-06 6:04 ` Takashi Iwai
2017-08-30 19:53 Jack Bates
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.