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