Support for NUX MG-300 USB interface
I recently got a NUX MG-300 USB guitar fx interface with high hopes that it would work in Linux. It is supposed to be class-compliant, and works in iOS and macOS without a driver.
Unfortunately, while it is recognized as a USB audio device by Linux, it is not working.
The core issue seems to be that "stream0" reports no playback rates. dmesg also shows errors, including "__uac_clock_find_source(): selector reported illegal value".
Any help identifying the issue would be much appreciated. I have some experience troubleshooting the USB audio kernel code and am happy to try doing so if I can get a nudge in the right direction.
Output from "stream0", dmesg, and lsusb follows.
Thanks!
Mike
"stream0" --- NUX NUX MG-300 AUDIO at usb-0000:00:1a.7-1.3, high speed : USB Audio
Playback: Status: Stop Interface 1 Altset 1 Format: S32_LE Channels: 2 Endpoint: 0x01 (1 OUT) (ASYNC) Rates: Data packet interval: 1000 us Bits: 24 Channel map: FL FR Sync Endpoint: 0x81 (1 IN) Sync EP Interface: 1 Sync EP Altset: 1 Implicit Feedback Mode: No
Capture: Status: Stop Interface 2 Altset 1 Format: S32_LE Channels: 2 Endpoint: 0x82 (2 IN) (ASYNC) Rates: Data packet interval: 1000 us Bits: 24 Channel map: FL FR ---
dmesg log: --- [ 141.265806] usb 3-1.3: new high-speed USB device number 9 using ehci-pci [ 141.374351] usb 3-1.3: config 1 interface 3 altsetting 0 bulk endpoint 0x4 has invalid maxpacket 256 [ 141.374370] usb 3-1.3: config 1 interface 3 altsetting 0 bulk endpoint 0x83 has invalid maxpacket 256 [ 141.375373] usb 3-1.3: New USB device found, idVendor=1fc9, idProduct=8260, bcdDevice= 1.00 [ 141.375389] usb 3-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 141.375396] usb 3-1.3: Product: NUX MG-300 AUDIO [ 141.375401] usb 3-1.3: Manufacturer: NUX [ 141.375405] usb 3-1.3: SerialNumber: 2008101346 [ 141.468523] usb 3-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 141.468531] usb 3-1.3: parse_audio_format_rates_v2v3(): unable to find clock source (clock -22) [ 141.468771] usb 3-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 141.468897] usb 3-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 141.469274] usb 3-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 141.469279] usb 3-1.3: parse_audio_format_rates_v2v3(): unable to find clock source (clock -22) [ 141.469521] usb 3-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 141.469646] usb 3-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 141.472645] usbcore: registered new interface driver snd-usb-audio ---
lsusb output: --- Bus 003 Device 009: ID 1fc9:8260 NXP Semiconductors Couldn't open device, some information will be missing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x1fc9 NXP Semiconductors idProduct 0x8260 bcdDevice 1.00 iManufacturer 1 iProduct 2 iSerial 3 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x013e bNumInterfaces 4 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Self Powered MaxPower 2mA Interface Association: bLength 8 bDescriptorType 11 bFirstInterface 0 bInterfaceCount 3 bFunctionClass 1 Audio bFunctionSubClass 0 bFunctionProtocol 32 iFunction 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 1 Audio bInterfaceSubClass 1 Control Device bInterfaceProtocol 32 iInterface 0 AudioControl Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 1 (HEADER) bcdADC 2.00 bCategory 8 wTotalLength 0x0065 bmControls 0x00 AudioControl Interface Descriptor: bLength 8 bDescriptorType 36 bDescriptorSubtype 10 (CLOCK_SOURCE) bClockID 41 bmAttributes 3 Internal programmable clock bmControls 0x07 Clock Frequency Control (read/write) Clock Validity Control (read-only) bAssocTerminal 0 iClockSource 0 AudioControl Interface Descriptor: bLength 8 bDescriptorType 36 bDescriptorSubtype 11 (CLOCK_SELECTOR) bClockID 40 bNrInPins 1 baCSourceID(0) 41 bmControls 0x03 Clock Selector Control (read/write) iClockSelector 0 AudioControl Interface Descriptor: bLength 17 bDescriptorType 36 bDescriptorSubtype 2 (INPUT_TERMINAL) bTerminalID 2 wTerminalType 0x0101 USB Streaming bAssocTerminal 0 bCSourceID 40 bNrChannels 2 bmChannelConfig 0x00000000 iChannelNames 0 bmControls 0x0000 iTerminal 0 AudioControl Interface Descriptor: bLength 18 bDescriptorType 36 bDescriptorSubtype 6 (FEATURE_UNIT) bUnitID 10 bSourceID 2 bmaControls(0) 0x0000000f Mute Control (read/write) Volume Control (read/write) bmaControls(1) 0x0000000f Mute Control (read/write) Volume Control (read/write) bmaControls(2) 0x0000000f Mute Control (read/write) Volume Control (read/write) iFeature 0 AudioControl Interface Descriptor: bLength 12 bDescriptorType 36 bDescriptorSubtype 3 (OUTPUT_TERMINAL) bTerminalID 20 wTerminalType 0x0301 Speaker bAssocTerminal 0 bSourceID 10 bCSourceID 40 bmControls 0x0000 iTerminal 0 AudioControl Interface Descriptor: bLength 17 bDescriptorType 36 bDescriptorSubtype 2 (INPUT_TERMINAL) bTerminalID 1 wTerminalType 0x0201 Microphone bAssocTerminal 0 bCSourceID 40 bNrChannels 2 bmChannelConfig 0x00000000 iChannelNames 0 bmControls 0x0000 iTerminal 0 AudioControl Interface Descriptor: bLength 12 bDescriptorType 36 bDescriptorSubtype 3 (OUTPUT_TERMINAL) bTerminalID 22 wTerminalType 0x0101 USB Streaming bAssocTerminal 0 bSourceID 2 bCSourceID 40 bmControls 0x0000 iTerminal 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 32 iInterface 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 1 bNumEndpoints 2 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 32 iInterface 0 AudioStreaming Interface Descriptor: bLength 16 bDescriptorType 36 bDescriptorSubtype 1 (AS_GENERAL) bTerminalLink 2 bmControls 0x00 bFormatType 1 bmFormats 0x00000001 PCM bNrChannels 2 bmChannelConfig 0x00000000 iChannelNames 0 AudioStreaming Interface Descriptor: bLength 6 bDescriptorType 36 bDescriptorSubtype 2 (FORMAT_TYPE) bFormatType 1 (FORMAT_TYPE_I) bSubslotSize 4 bBitResolution 24 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x0258 1x 600 bytes bInterval 4 AudioStreaming Endpoint Descriptor: bLength 8 bDescriptorType 37 bDescriptorSubtype 1 (EP_GENERAL) bmAttributes 0x00 bmControls 0x00 bLockDelayUnits 0 Undefined wLockDelay 0x0000 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 17 Transfer Type Isochronous Synch Type None Usage Type Feedback wMaxPacketSize 0x0004 1x 4 bytes bInterval 4 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 32 iInterface 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 1 bNumEndpoints 1 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 32 iInterface 0 AudioStreaming Interface Descriptor: bLength 16 bDescriptorType 36 bDescriptorSubtype 1 (AS_GENERAL) bTerminalLink 22 bmControls 0x00 bFormatType 1 bmFormats 0x00000001 PCM bNrChannels 2 bmChannelConfig 0x00000000 iChannelNames 0 AudioStreaming Interface Descriptor: bLength 6 bDescriptorType 36 bDescriptorSubtype 2 (FORMAT_TYPE) bFormatType 1 (FORMAT_TYPE_I) bSubslotSize 4 bBitResolution 24 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x0258 1x 600 bytes bInterval 4 AudioStreaming Endpoint Descriptor: bLength 8 bDescriptorType 37 bDescriptorSubtype 1 (EP_GENERAL) bmAttributes 0x00 bmControls 0x00 bLockDelayUnits 0 Undefined wLockDelay 0x0000 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 3 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 1 Audio bInterfaceSubClass 3 MIDI Streaming bInterfaceProtocol 0 iInterface 4 MIDIStreaming Interface Descriptor: bLength 7 bDescriptorType 36 bDescriptorSubtype 1 (HEADER) bcdADC 1.00 wTotalLength 0x0041 MIDIStreaming Interface Descriptor: bLength 6 bDescriptorType 36 bDescriptorSubtype 2 (MIDI_IN_JACK) bJackType 1 Embedded bJackID 1 iJack 0 MIDIStreaming Interface Descriptor: bLength 6 bDescriptorType 36 bDescriptorSubtype 2 (MIDI_IN_JACK) bJackType 2 External bJackID 2 iJack 0 MIDIStreaming Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 3 (MIDI_OUT_JACK) bJackType 1 Embedded bJackID 3 bNrInputPins 1 baSourceID( 0) 2 BaSourcePin( 0) 1 iJack 0 MIDIStreaming Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 3 (MIDI_OUT_JACK) bJackType 2 External bJackID 4 bNrInputPins 1 baSourceID( 0) 1 BaSourcePin( 0) 1 iJack 0 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0100 1x 256 bytes bInterval 0 bRefresh 0 bSynchAddress 0 MIDIStreaming Endpoint Descriptor: bLength 5 bDescriptorType 37 bDescriptorSubtype 1 (GENERAL) bNumEmbMIDIJack 1 baAssocJackID( 0) 1 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0100 1x 256 bytes bInterval 0 bRefresh 0 bSynchAddress 0 MIDIStreaming Endpoint Descriptor: bLength 5 bDescriptorType 37 bDescriptorSubtype 1 (GENERAL) bNumEmbMIDIJack 1 baAssocJackID( 0) 3 ---
On Sun, 17 Jan 2021 19:56:01 +0100, Mike Oliphant wrote:
I recently got a NUX MG-300 USB guitar fx interface with high hopes that it would work in Linux. It is supposed to be class-compliant, and works in iOS and macOS without a driver.
Unfortunately, while it is recognized as a USB audio device by Linux, it is not working.
The core issue seems to be that "stream0" reports no playback rates. dmesg also shows errors, including "__uac_clock_find_source(): selector reported illegal value".
Any help identifying the issue would be much appreciated. I have some experience troubleshooting the USB audio kernel code and am happy to try doing so if I can get a nudge in the right direction.
Output from "stream0", dmesg, and lsusb follows.
Did you try the latest 5.11-rc kernel? There have been lots of changes in USB-audio and this might work better there.
If it still doesn't work with 5.11-rc, please try to enable the debug option, e.g. boot with snd_usb_audio.dyndbg=+p boot option, plug the device, and get the kernel logs (at plugging and during the audio operations).
thanks,
Takashi
Thanks for the response. I'm running a very recent build of the master kernel tree (~ 5.11-rc2).
I'll give dyndbg a try.
Mike
On Sun, Jan 17, 2021 at 11:43 PM Takashi Iwai tiwai@suse.de wrote:
On Sun, 17 Jan 2021 19:56:01 +0100, Mike Oliphant wrote:
I recently got a NUX MG-300 USB guitar fx interface with high hopes that
it
would work in Linux. It is supposed to be class-compliant, and works in
iOS
and macOS without a driver.
Unfortunately, while it is recognized as a USB audio device by Linux, it
is
not working.
The core issue seems to be that "stream0" reports no playback rates.
dmesg
also shows errors, including "__uac_clock_find_source(): selector
reported
illegal value".
Any help identifying the issue would be much appreciated. I have some experience troubleshooting the USB audio kernel code and am happy to try doing so if I can get a nudge in the right direction.
Output from "stream0", dmesg, and lsusb follows.
Did you try the latest 5.11-rc kernel? There have been lots of changes in USB-audio and this might work better there.
If it still doesn't work with 5.11-rc, please try to enable the debug option, e.g. boot with snd_usb_audio.dyndbg=+p boot option, plug the device, and get the kernel logs (at plugging and during the audio operations).
thanks,
Takashi
Here is the dmesg output with dyndbg enabled. It looks like it is failing to find the clock source, and hence cannot obtain the valid sample rates.
It looks like it is finding the clock selector (id: 40), but "uac_clock_selector_get_val()" is returning zero, and it never gets the clock source (id: 41).
[ 229.641481] usb 2-1.3: new high-speed USB device number 9 using ehci-pci [ 229.750316] usb 2-1.3: config 1 interface 3 altsetting 0 bulk endpoint 0x4 has invalid maxpacket 256 [ 229.750335] usb 2-1.3: config 1 interface 3 altsetting 0 bulk endpoint 0x83 has invalid maxpacket 256 [ 229.751432] usb 2-1.3: New USB device found, idVendor=1fc9, idProduct=8260, bcdDevice= 1.00 [ 229.751452] usb 2-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 229.751459] usb 2-1.3: Product: NUX MG-300 AUDIO [ 229.751464] usb 2-1.3: Manufacturer: NUX [ 229.751468] usb 2-1.3: SerialNumber: 2008101346 [ 230.170840] usb 2-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 230.170860] usb 2-1.3: parse_audio_format_rates_v2v3(): unable to find clock source (clock -22) [ 230.170871] usb 2-1.3: 1:1: found sync_ep=0x81, iface=1, alt=1, implicit_fb=0 [ 230.170879] usb 2-1.3: 1:1: add audio endpoint 0x1 [ 230.170907] usb 2-1.3: Creating new data endpoint #1 [ 230.170915] usb 2-1.3: Creating new sync endpoint #81 [ 230.171181] usb 2-1.3: 1:1 Set sample rate 0, clock 40 [ 230.171408] usb 2-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 230.171657] usb 2-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 230.172463] usb 2-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 230.172480] usb 2-1.3: parse_audio_format_rates_v2v3(): unable to find clock source (clock -22) [ 230.172490] usb 2-1.3: 2:1: add audio endpoint 0x82 [ 230.172512] usb 2-1.3: Creating new data endpoint #82 [ 230.172707] usb 2-1.3: 2:1 Set sample rate 0, clock 40 [ 230.172832] usb 2-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 230.173079] usb 2-1.3: __uac_clock_find_source(): selector reported illegal value, id 40, ret 0 [ 230.173442] usb 2-1.3: [10] FU [PCM Playback Switch] ch = 2, val = 0/1/1 [ 230.173450] usb 2-1.3: [10] FU [PCM Playback Switch] ch = 1, val = 0/1/1 [ 230.173949] usb 2-1.3: RANGE setting not yet supported [ 230.174700] usb 2-1.3: [10] FU [PCM Playback Volume] ch = 2, val = -16384/0/256 [ 230.175074] usb 2-1.3: RANGE setting not yet supported [ 230.175823] usb 2-1.3: [10] FU [PCM Playback Volume] ch = 1, val = -16384/0/256 [ 230.176631] usbcore: registered new interface driver snd-usb-audio
On Mon, Jan 18, 2021 at 8:33 AM Mike Oliphant oliphant@nostatic.org wrote:
Thanks for the response. I'm running a very recent build of the master kernel tree (~ 5.11-rc2).
I'll give dyndbg a try.
Mike
On Sun, Jan 17, 2021 at 11:43 PM Takashi Iwai tiwai@suse.de wrote:
On Sun, 17 Jan 2021 19:56:01 +0100, Mike Oliphant wrote:
I recently got a NUX MG-300 USB guitar fx interface with high hopes
that it
would work in Linux. It is supposed to be class-compliant, and works in
iOS
and macOS without a driver.
Unfortunately, while it is recognized as a USB audio device by Linux,
it is
not working.
The core issue seems to be that "stream0" reports no playback rates.
dmesg
also shows errors, including "__uac_clock_find_source(): selector
reported
illegal value".
Any help identifying the issue would be much appreciated. I have some experience troubleshooting the USB audio kernel code and am happy to try doing so if I can get a nudge in the right direction.
Output from "stream0", dmesg, and lsusb follows.
Did you try the latest 5.11-rc kernel? There have been lots of changes in USB-audio and this might work better there.
If it still doesn't work with 5.11-rc, please try to enable the debug option, e.g. boot with snd_usb_audio.dyndbg=+p boot option, plug the device, and get the kernel logs (at plugging and during the audio operations).
thanks,
Takashi
On Mon, 18 Jan 2021 18:54:57 +0100, Mike Oliphant wrote:
Here is the dmesg output with dyndbg enabled. It looks like it is failing to find the clock source, and hence cannot obtain the valid sample rates.
It looks like it is finding the clock selector (id: 40), but "uac_clock_selector_get_val()" is returning zero, and it never gets the clock source (id: 41).
Aha. Maybe the firmware doesn't expect it being asked as it's the single connection.
Does the patch below help anything?
Takashi
--- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -298,6 +298,11 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, if (selector) { int ret, i, cur;
+ if (selector->bNrInPins == 1) { + ret = 1; + goto find_source; + } + /* the entity ID we are looking for is a selector. * find out what it currently selects */ ret = uac_clock_selector_get_val(chip, selector->bClockID); @@ -314,6 +319,7 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, return -EINVAL; }
+ find_source: cur = ret; ret = __uac_clock_find_source(chip, fmt, selector->baCSourceID[ret - 1],
Progress - thanks for the patch!
That got rid of the clock errors, and the the device now reports a 48000 sample rate, which is correct.
Unfortunately, it still isn't working properly. Playback doesn't seem to work at all. Capture kind of works - it does record, but the audio is extremely noisy.
Here is the current dmesg output when the device is connected.
Notable is the error "No valid sample rate available for 1:1, assuming a firmware bug".
Also notable is "1:1 Set sample rate 48000, clock 40" - where "40" is the id of the clock selector - "41" is the id of the actual clock source. So maybe something is still getting wired up wrong?
[ 418.366449] usb 3-1.2: new high-speed USB device number 6 using ehci-pci [ 418.479099] usb 3-1.2: config 1 interface 3 altsetting 0 bulk endpoint 0x4 has invalid maxpacket 256 [ 418.479118] usb 3-1.2: config 1 interface 3 altsetting 0 bulk endpoint 0x83 has invalid maxpacket 256 [ 418.480085] usb 3-1.2: New USB device found, idVendor=1fc9, idProduct=8260, bcdDevice= 1.00 [ 418.480100] usb 3-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 418.480107] usb 3-1.2: Product: NUX MG-300 AUDIO [ 418.480112] usb 3-1.2: Manufacturer: NUX [ 418.480117] usb 3-1.2: SerialNumber: 2008101346 [ 418.482025] usb 3-1.2: No valid sample rate available for 1:1, assuming a firmware bug [ 418.482041] usb 3-1.2: 1:1: found sync_ep=0x81, iface=1, alt=1, implicit_fb=0 [ 418.482049] usb 3-1.2: 1:1: add audio endpoint 0x1 [ 418.482078] usb 3-1.2: Creating new data endpoint #1 [ 418.482086] usb 3-1.2: Creating new sync endpoint #81 [ 418.482666] usb 3-1.2: 1:1 Set sample rate 48000, clock 40 [ 418.484525] usb 3-1.2: No valid sample rate available for 2:1, assuming a firmware bug [ 418.484545] usb 3-1.2: 2:1: add audio endpoint 0x82 [ 418.484584] usb 3-1.2: Creating new data endpoint #82 [ 418.484899] usb 3-1.2: 2:1 Set sample rate 48000, clock 40 [ 418.485800] usb 3-1.2: [10] FU [PCM Playback Switch] ch = 2, val = 0/1/1 [ 418.485822] usb 3-1.2: [10] FU [PCM Playback Switch] ch = 1, val = 0/1/1 [ 418.486484] usb 3-1.2: RANGE setting not yet supported [ 418.487402] usb 3-1.2: [10] FU [PCM Playback Volume] ch = 2, val = -16384/0/256 [ 418.487899] usb 3-1.2: RANGE setting not yet supported [ 418.488774] usb 3-1.2: [10] FU [PCM Playback Volume] ch = 1, val = -16384/0/256 [ 418.541357] usb 3-1.2: Open EP 0x82, iface=2:1, idx=0 [ 418.541363] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.541367] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.541524] usb 3-1.2: 2:1 Set sample rate 48000, clock 40 [ 418.542000] usb 3-1.2: Setting params for data EP 0x82, pipe 0x10680 [ 418.542007] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.542009] usb 3-1.2: Setting usb interface 2:1 for EP 0x82 [ 418.545012] usb 3-1.2: Closing EP 0x82 (count 1) [ 418.545018] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.545157] usb 3-1.2: EP 0x82 closed [ 418.545620] usb 3-1.2: Open EP 0x82, iface=2:1, idx=0 [ 418.545624] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.545627] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.545893] usb 3-1.2: 2:1 Set sample rate 48000, clock 40 [ 418.546257] usb 3-1.2: Setting params for data EP 0x82, pipe 0x10680 [ 418.546263] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.546266] usb 3-1.2: Setting usb interface 2:1 for EP 0x82 [ 418.546841] usb 3-1.2: Closing EP 0x82 (count 1) [ 418.546845] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.547052] usb 3-1.2: EP 0x82 closed [ 418.547467] usb 3-1.2: Open EP 0x1, iface=1:1, idx=0 [ 418.547470] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.547473] usb 3-1.2: Open EP 0x81, iface=1:1, idx=1 [ 418.547476] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.547478] usb 3-1.2: Setting usb interface 1:0 for EP 0x1 [ 418.547643] usb 3-1.2: 1:1 Set sample rate 48000, clock 40 [ 418.548129] usb 3-1.2: Setting params for data EP 0x1, pipe 0x8600 [ 418.548143] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.548146] usb 3-1.2: Setting usb interface 1:1 for EP 0x1 [ 418.548420] usb 3-1.2: Setting params for sync EP 0x81, pipe 0x8680 [ 418.548425] usb 3-1.2: Set up 4 URBS, ret=0 [ 418.548443] usb 3-1.2: Starting data EP 0x1 (running 0) [ 418.548474] usb 3-1.2: 12 URBs submitted for EP 0x1 [ 418.548477] usb 3-1.2: Starting sync EP 0x81 (running 0) [ 418.548487] usb 3-1.2: 4 URBs submitted for EP 0x81 [ 418.549724] usb 3-1.2: Open EP 0x82, iface=2:1, idx=0 [ 418.549729] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.549732] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.549888] usb 3-1.2: 2:1 Set sample rate 48000, clock 40 [ 418.550256] usb 3-1.2: Setting params for data EP 0x82, pipe 0x10680 [ 418.550259] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.550261] usb 3-1.2: Setting usb interface 2:1 for EP 0x82 [ 418.550455] usb 3-1.2: Closing EP 0x82 (count 1) [ 418.550460] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.550659] usb 3-1.2: EP 0x82 closed [ 418.551298] usb 3-1.2: Open EP 0x82, iface=2:1, idx=0 [ 418.551303] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.551307] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.551528] usb 3-1.2: 2:1 Set sample rate 48000, clock 40 [ 418.552021] usb 3-1.2: Setting params for data EP 0x82, pipe 0x10680 [ 418.552028] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.552031] usb 3-1.2: Setting usb interface 2:1 for EP 0x82 [ 418.552168] usb 3-1.2: Stopping sync EP 0x81 (running 1) [ 418.552174] usb 3-1.2: Stopping data EP 0x1 (running 1) [ 418.566466] usb 3-1.2: Closing EP 0x1 (count 1) [ 418.566472] usb 3-1.2: Setting usb interface 1:0 for EP 0x1 [ 418.566772] usb 3-1.2: EP 0x1 closed [ 418.566775] usb 3-1.2: Closing EP 0x81 (count 1) [ 418.566777] usb 3-1.2: Setting usb interface 1:0 for EP 0x81 [ 418.566954] usb 3-1.2: EP 0x81 closed [ 418.567038] usb 3-1.2: Closing EP 0x82 (count 1) [ 418.567040] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.567257] usb 3-1.2: EP 0x82 closed [ 418.573720] usb 3-1.2: Open EP 0x1, iface=1:1, idx=0 [ 418.573724] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.573727] usb 3-1.2: Open EP 0x81, iface=1:1, idx=1 [ 418.573729] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.573732] usb 3-1.2: Setting usb interface 1:0 for EP 0x1 [ 418.573927] usb 3-1.2: 1:1 Set sample rate 48000, clock 40 [ 418.574564] usb 3-1.2: Setting params for data EP 0x1, pipe 0x8600 [ 418.574570] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.574572] usb 3-1.2: Setting usb interface 1:1 for EP 0x1 [ 418.574659] usb 3-1.2: Setting params for sync EP 0x81, pipe 0x8680 [ 418.574662] usb 3-1.2: Set up 4 URBS, ret=0 [ 418.574676] usb 3-1.2: Starting data EP 0x1 (running 0) [ 418.574700] usb 3-1.2: 12 URBs submitted for EP 0x1 [ 418.574701] usb 3-1.2: Starting sync EP 0x81 (running 0) [ 418.574709] usb 3-1.2: 4 URBs submitted for EP 0x81 [ 418.575117] usb 3-1.2: Open EP 0x82, iface=2:1, idx=0 [ 418.575120] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.575123] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.575384] usb 3-1.2: 2:1 Set sample rate 48000, clock 40 [ 418.575916] usb 3-1.2: Setting params for data EP 0x82, pipe 0x10680 [ 418.575926] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.575928] usb 3-1.2: Setting usb interface 2:1 for EP 0x82 [ 418.576065] usb 3-1.2: Closing EP 0x82 (count 1) [ 418.576069] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.576171] usb 3-1.2: EP 0x82 closed [ 418.576574] usb 3-1.2: Open EP 0x82, iface=2:1, idx=0 [ 418.576578] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=9592, periods=4, implicit_fb=0 [ 418.576581] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.576632] usb 3-1.2: 2:1 Set sample rate 48000, clock 40 [ 418.577128] usb 3-1.2: Setting params for data EP 0x82, pipe 0x10680 [ 418.577132] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.577134] usb 3-1.2: Setting usb interface 2:1 for EP 0x82 [ 418.577404] usb 3-1.2: Stopping sync EP 0x81 (running 1) [ 418.577408] usb 3-1.2: Stopping data EP 0x1 (running 1) [ 418.594462] usb 3-1.2: Closing EP 0x1 (count 1) [ 418.594469] usb 3-1.2: Setting usb interface 1:0 for EP 0x1 [ 418.594806] usb 3-1.2: EP 0x1 closed [ 418.594810] usb 3-1.2: Closing EP 0x81 (count 1) [ 418.594812] usb 3-1.2: Setting usb interface 1:0 for EP 0x81 [ 418.595093] usb 3-1.2: EP 0x81 closed [ 418.595187] usb 3-1.2: Closing EP 0x82 (count 1) [ 418.595189] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.595520] usb 3-1.2: EP 0x82 closed [ 418.610935] usb 3-1.2: Open EP 0x1, iface=1:1, idx=0 [ 418.610943] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=384000, periods=2, implicit_fb=0 [ 418.610946] usb 3-1.2: Open EP 0x81, iface=1:1, idx=1 [ 418.610949] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=384000, periods=2, implicit_fb=0 [ 418.610952] usb 3-1.2: Setting usb interface 1:0 for EP 0x1 [ 418.611223] usb 3-1.2: 1:1 Set sample rate 48000, clock 40 [ 418.611990] usb 3-1.2: Setting params for data EP 0x1, pipe 0x8600 [ 418.612013] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.612020] usb 3-1.2: Setting usb interface 1:1 for EP 0x1 [ 418.612281] usb 3-1.2: Setting params for sync EP 0x81, pipe 0x8680 [ 418.612285] usb 3-1.2: Set up 4 URBS, ret=0 [ 418.612363] usb 3-1.2: Starting data EP 0x1 (running 0) [ 418.612389] usb 3-1.2: 12 URBs submitted for EP 0x1 [ 418.612390] usb 3-1.2: Starting sync EP 0x81 (running 0) [ 418.612397] usb 3-1.2: 4 URBs submitted for EP 0x81 [ 418.613337] usb 3-1.2: 1:1 Start Playback PCM [ 418.613810] usb 3-1.2: Open EP 0x82, iface=2:1, idx=0 [ 418.613813] usb 3-1.2: channels=2, rate=48000, format=S32_LE, period_bytes=384000, periods=2, implicit_fb=0 [ 418.613815] usb 3-1.2: Setting usb interface 2:0 for EP 0x82 [ 418.614078] usb 3-1.2: 2:1 Set sample rate 48000, clock 40 [ 418.614639] usb 3-1.2: Setting params for data EP 0x82, pipe 0x10680 [ 418.614648] usb 3-1.2: Set up 12 URBS, ret=0 [ 418.614653] usb 3-1.2: Setting usb interface 2:1 for EP 0x82 [ 418.615844] usb 3-1.2: Starting data EP 0x82 (running 0) [ 418.615879] usb 3-1.2: 12 URBs submitted for EP 0x82 [ 418.615882] usb 3-1.2: 2:1 Start Capture PCM
On Mon, Jan 18, 2021 at 11:19 AM Takashi Iwai tiwai@suse.de wrote:
On Mon, 18 Jan 2021 18:54:57 +0100, Mike Oliphant wrote:
Here is the dmesg output with dyndbg enabled. It looks like it is failing to find the clock source, and hence cannot obtain the valid sample rates.
It looks like it is finding the clock selector (id: 40), but "uac_clock_selector_get_val()" is returning zero, and it never gets the clock source (id: 41).
Aha. Maybe the firmware doesn't expect it being asked as it's the single connection.
Does the patch below help anything?
Takashi
--- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -298,6 +298,11 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, if (selector) { int ret, i, cur;
if (selector->bNrInPins == 1) {
ret = 1;
goto find_source;
}
/* the entity ID we are looking for is a selector. * find out what it currently selects */ ret = uac_clock_selector_get_val(chip, selector->bClockID);
@@ -314,6 +319,7 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, return -EINVAL; }
find_source: cur = ret; ret = __uac_clock_find_source(chip, fmt, selector->baCSourceID[ret -
1],
On Mon, 18 Jan 2021 22:15:26 +0100, Mike Oliphant wrote:
Progress - thanks for the patch!
That got rid of the clock errors, and the the device now reports a 48000 sample rate, which is correct.
Unfortunately, it still isn't working properly. Playback doesn't seem to work at all. Capture kind of works - it does record, but the audio is extremely noisy.
Here is the current dmesg output when the device is connected.
Notable is the error "No valid sample rate available for 1:1, assuming a firmware bug".
Also notable is "1:1 Set sample rate 48000, clock 40" - where "40" is the id of the clock selector - "41" is the id of the actual clock source. So maybe something is still getting wired up wrong?
OK, how about the one below instead?
Takashi
--- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -298,6 +298,12 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, if (selector) { int ret, i, cur;
+ if (selector->bNrInPins == 1) { + uac_clock_selector_set_val(chip, selector->bClockID, 1); + ret = 1; + goto find_source; + } + /* the entity ID we are looking for is a selector. * find out what it currently selects */ ret = uac_clock_selector_get_val(chip, selector->bClockID); @@ -314,6 +320,7 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, return -EINVAL; }
+ find_source: cur = ret; ret = __uac_clock_find_source(chip, fmt, selector->baCSourceID[ret - 1],
Unfortunately, the "uac_clock_selector_set_val()" call does not seem to change anything.
From doing some more testing, I think that the references to clock id "40"
are ok - it has "40" stored in fmt->clock, but when it uses it, "__uac_clock_find_source()" gets called and it resolved to the actual clock source - "41".
Not sure about the "No valid sample rate available for 1:1, assuming a firmware bug" error, but I suspect it is spurious. "check_valid_altsetting_v2v3()" is failing for some reason, but it is ignoring the error.
Playback is completely silent, but the system seems to think it is working. No apparent errors, and a play operation seems to take the correct amount of time. Just no audio.
Maybe it is a mixer issue? mixer.c is putting out "RANGE setting not yet supported" errors on startup.
Here is a sample of dmesg output for a playback session:
[ 4748.260975] usb 1-1.3: Open EP 0x1, iface=1:1, idx=0 [ 4748.260983] usb 1-1.3: channels=2, rate=48000, format=S32_LE, period_bytes=48000, periods=4, implicit_fb=0 [ 4748.260988] usb 1-1.3: Open EP 0x81, iface=1:1, idx=1 [ 4748.260992] usb 1-1.3: channels=2, rate=48000, format=S32_LE, period_bytes=48000, periods=4, implicit_fb=0 [ 4748.260996] usb 1-1.3: Setting usb interface 1:0 for EP 0x1 [ 4748.261320] usb 1-1.3: 1:1 Set sample rate 48000, clock 40 [ 4748.261873] usb 1-1.3: Setting params for data EP 0x1, pipe 0x9d00 [ 4748.261890] usb 1-1.3: Set up 12 URBS, ret=0 [ 4748.261897] usb 1-1.3: Setting usb interface 1:1 for EP 0x1 [ 4748.262097] usb 1-1.3: Setting params for sync EP 0x81, pipe 0x9d80 [ 4748.262105] usb 1-1.3: Set up 4 URBS, ret=0 [ 4748.262147] usb 1-1.3: Starting data EP 0x1 (running 0) [ 4748.262180] usb 1-1.3: 12 URBs submitted for EP 0x1 [ 4748.262183] usb 1-1.3: Starting sync EP 0x81 (running 0) [ 4748.262193] usb 1-1.3: 4 URBs submitted for EP 0x81 [ 4748.262311] usb 1-1.3: 1:1 Start Playback PCM [ 4762.887812] usb 1-1.3: Stopping sync EP 0x81 (running 1) [ 4762.887836] usb 1-1.3: Stopping data EP 0x1 (running 1) [ 4762.887849] usb 1-1.3: 1:1 Stop Playback PCM [ 4762.902542] usb 1-1.3: Closing EP 0x1 (count 1) [ 4762.902549] usb 1-1.3: Setting usb interface 1:0 for EP 0x1 [ 4762.902915] usb 1-1.3: EP 0x1 closed [ 4762.902928] usb 1-1.3: Closing EP 0x81 (count 1) [ 4762.902935] usb 1-1.3: Setting usb interface 1:0 for EP 0x81 [ 4762.903179] usb 1-1.3: EP 0x81 closed
On Mon, Jan 18, 2021 at 1:59 PM Takashi Iwai tiwai@suse.de wrote:
On Mon, 18 Jan 2021 22:15:26 +0100, Mike Oliphant wrote:
Progress - thanks for the patch!
That got rid of the clock errors, and the the device now reports a 48000 sample rate, which is correct.
Unfortunately, it still isn't working properly. Playback doesn't seem to
work
at all. Capture kind of works - it does record, but the audio is
extremely
noisy.
Here is the current dmesg output when the device is connected.
Notable is the error "No valid sample rate available for 1:1, assuming a firmware bug".
Also notable is "1:1 Set sample rate 48000, clock 40" - where "40" is
the id
of the clock selector - "41" is the id of the actual clock source. So
maybe
something is still getting wired up wrong?
OK, how about the one below instead?
Takashi
--- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -298,6 +298,12 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, if (selector) { int ret, i, cur;
if (selector->bNrInPins == 1) {
uac_clock_selector_set_val(chip,
selector->bClockID, 1);
ret = 1;
goto find_source;
}
/* the entity ID we are looking for is a selector. * find out what it currently selects */ ret = uac_clock_selector_get_val(chip, selector->bClockID);
@@ -314,6 +320,7 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, return -EINVAL; }
find_source: cur = ret; ret = __uac_clock_find_source(chip, fmt, selector->baCSourceID[ret -
1],
On Tue, 19 Jan 2021 01:26:51 +0100, Mike Oliphant wrote:
Unfortunately, the "uac_clock_selector_set_val()" call does not seem to change anything.
OK,
From doing some more testing, I think that the references to clock id "40"
are ok - it has "40" stored in fmt->clock, but when it uses it, "__uac_clock_find_source()" gets called and it resolved to the actual clock source - "41".
Not sure about the "No valid sample rate available for 1:1, assuming a firmware bug" error, but I suspect it is spurious. "check_valid_altsetting_v2v3()" is failing for some reason, but it is ignoring the error.
Yes, that's the part where verifying the altsetting for the given rate. The UAC2 device must return the valid altsetting bit mask for the current rate in the request, but your device didn't seem returning it. The code is there for devices like MOTU that have multiple altsets where each one has one sample rate exclusively.
Playback is completely silent, but the system seems to think it is working. No apparent errors, and a play operation seems to take the correct amount of time. Just no audio.
Check the status in /proc/asound/card*/pcm*/sub*/status. If the pointer moves forward and the position is expected, at least the data feed is done, and the problem must be something else.
What about the capture? Do you get also only silence?
Maybe it is a mixer issue? mixer.c is putting out "RANGE setting not yet supported" errors on startup.
That's probably no problem, I guess it comes from the code trying to get the resolution. The patch below may paper over it.
Here is a sample of dmesg output for a playback session:
[ 4748.260975] usb 1-1.3: Open EP 0x1, iface=1:1, idx=0 [ 4748.260983] usb 1-1.3: channels=2, rate=48000, format=S32_LE, period_bytes=48000, periods=4, implicit_fb=0 [ 4748.260988] usb 1-1.3: Open EP 0x81, iface=1:1, idx=1 [ 4748.260992] usb 1-1.3: channels=2, rate=48000, format=S32_LE, period_bytes=48000, periods=4, implicit_fb=0 [ 4748.260996] usb 1-1.3: Setting usb interface 1:0 for EP 0x1 [ 4748.261320] usb 1-1.3: 1:1 Set sample rate 48000, clock 40 [ 4748.261873] usb 1-1.3: Setting params for data EP 0x1, pipe 0x9d00 [ 4748.261890] usb 1-1.3: Set up 12 URBS, ret=0 [ 4748.261897] usb 1-1.3: Setting usb interface 1:1 for EP 0x1 [ 4748.262097] usb 1-1.3: Setting params for sync EP 0x81, pipe 0x9d80 [ 4748.262105] usb 1-1.3: Set up 4 URBS, ret=0 [ 4748.262147] usb 1-1.3: Starting data EP 0x1 (running 0) [ 4748.262180] usb 1-1.3: 12 URBs submitted for EP 0x1 [ 4748.262183] usb 1-1.3: Starting sync EP 0x81 (running 0) [ 4748.262193] usb 1-1.3: 4 URBs submitted for EP 0x81 [ 4748.262311] usb 1-1.3: 1:1 Start Playback PCM [ 4762.887812] usb 1-1.3: Stopping sync EP 0x81 (running 1) [ 4762.887836] usb 1-1.3: Stopping data EP 0x1 (running 1) [ 4762.887849] usb 1-1.3: 1:1 Stop Playback PCM [ 4762.902542] usb 1-1.3: Closing EP 0x1 (count 1) [ 4762.902549] usb 1-1.3: Setting usb interface 1:0 for EP 0x1 [ 4762.902915] usb 1-1.3: EP 0x1 closed [ 4762.902928] usb 1-1.3: Closing EP 0x81 (count 1) [ 4762.902935] usb 1-1.3: Setting usb interface 1:0 for EP 0x81 [ 4762.903179] usb 1-1.3: EP 0x81 closed
The flow looks good judging from this log, at least.
The device is configured with the dedicated sync endpoint, but it's not with the implicit feedback mode. It's interesting whether the device behaves differently if you load snd-usb-audio module with implicit_fb=1 boot option. I don't expect it working better, but anyway...
Takashi
--- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -1238,7 +1238,7 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval, (cval->control << 8) | minchn, &cval->res) < 0) { cval->res = 1; - } else { + } else if (cval->head.mixer->protocol == UAC_VERSION_1) { int last_valid_res = cval->res;
while (cval->res > 1) {
Your mixer.c patch does get rid of the RANGE errors. No change to behavior, though.
I'd already tried setting "implicit_fb=1" even though I didn't expect it to work, since there is a separate feedback endpoint. I just tried it again - it doesn't seem to hurt anything, but it doesn't help either.
Capture seems to be working perfectly with the clock patch - I'm not sure why I was initially getting noisy input.
I checked "/proc/asound/card*/pcm*/sub*/status" during playback, and the pointer seems to be moving forward as it should. All indications are that the system thinks playback is working fine.
One interesting piece of information - alsamixer shows two stereo outputs ("pcm" and "pcm1"). Not sure why there are two - maybe output is going to the wrong one?
Here is the output from "/proc/asound/AUDIO/usbmixer":
USB Mixer: usb_id=0x1fc98260, ctrlif=0, ctlerr=0 Card: NUX NUX MG-300 AUDIO at usb-0000:00:1a.7-1.3, high speed Unit: 10 Control: name="PCM Playback Volume", index=1 Info: id=10, control=2, cmask=0x0, channels=1, type="S16" Volume: min=-16384, max=0, dBmin=-6400, dBmax=0 Unit: 10 Control: name="PCM Playback Volume", index=0 Info: id=10, control=2, cmask=0x3, channels=2, type="S16" Volume: min=-16384, max=0, dBmin=-6400, dBmax=0 Unit: 10 Control: name="PCM Playback Switch", index=1 Info: id=10, control=1, cmask=0x0, channels=1, type="INV_BOOLEAN" Volume: min=0, max=1, dBmin=0, dBmax=0 Unit: 10 Control: name="PCM Playback Switch", index=0 Info: id=10, control=1, cmask=0x3, channels=2, type="INV_BOOLEAN" Volume: min=0, max=1, dBmin=0, dBmax=0 Unit: 41 Control: name="Clock Source 41 Validity", index=0 Info: id=41, control=2, cmask=0x0, channels=1, type="BOOLEAN" Volume: min=0, max=1, dBmin=0, dBmax=0
Mike
On Tue, Jan 19, 2021 at 1:05 AM Takashi Iwai tiwai@suse.de wrote:
On Tue, 19 Jan 2021 01:26:51 +0100, Mike Oliphant wrote:
Unfortunately, the "uac_clock_selector_set_val()" call does not seem to change anything.
OK,
From doing some more testing, I think that the references to clock id
"40"
are ok - it has "40" stored in fmt->clock, but when it uses it, "__uac_clock_find_source()" gets called and it resolved to the actual
clock
source - "41".
Not sure about the "No valid sample rate available for 1:1, assuming a firmware bug" error, but I suspect it is spurious. "check_valid_altsetting_v2v3()" is failing for some reason, but it is ignoring the error.
Yes, that's the part where verifying the altsetting for the given rate. The UAC2 device must return the valid altsetting bit mask for the current rate in the request, but your device didn't seem returning it. The code is there for devices like MOTU that have multiple altsets where each one has one sample rate exclusively.
Playback is completely silent, but the system seems to think it is
working.
No apparent errors, and a play operation seems to take the correct amount of time. Just no audio.
Check the status in /proc/asound/card*/pcm*/sub*/status. If the pointer moves forward and the position is expected, at least the data feed is done, and the problem must be something else.
What about the capture? Do you get also only silence?
Maybe it is a mixer issue? mixer.c is putting out "RANGE setting not yet supported" errors on startup.
That's probably no problem, I guess it comes from the code trying to get the resolution. The patch below may paper over it.
Here is a sample of dmesg output for a playback session:
[ 4748.260975] usb 1-1.3: Open EP 0x1, iface=1:1, idx=0 [ 4748.260983] usb 1-1.3: channels=2, rate=48000, format=S32_LE, period_bytes=48000, periods=4, implicit_fb=0 [ 4748.260988] usb 1-1.3: Open EP 0x81, iface=1:1, idx=1 [ 4748.260992] usb 1-1.3: channels=2, rate=48000, format=S32_LE, period_bytes=48000, periods=4, implicit_fb=0 [ 4748.260996] usb 1-1.3: Setting usb interface 1:0 for EP 0x1 [ 4748.261320] usb 1-1.3: 1:1 Set sample rate 48000, clock 40 [ 4748.261873] usb 1-1.3: Setting params for data EP 0x1, pipe 0x9d00 [ 4748.261890] usb 1-1.3: Set up 12 URBS, ret=0 [ 4748.261897] usb 1-1.3: Setting usb interface 1:1 for EP 0x1 [ 4748.262097] usb 1-1.3: Setting params for sync EP 0x81, pipe 0x9d80 [ 4748.262105] usb 1-1.3: Set up 4 URBS, ret=0 [ 4748.262147] usb 1-1.3: Starting data EP 0x1 (running 0) [ 4748.262180] usb 1-1.3: 12 URBs submitted for EP 0x1 [ 4748.262183] usb 1-1.3: Starting sync EP 0x81 (running 0) [ 4748.262193] usb 1-1.3: 4 URBs submitted for EP 0x81 [ 4748.262311] usb 1-1.3: 1:1 Start Playback PCM [ 4762.887812] usb 1-1.3: Stopping sync EP 0x81 (running 1) [ 4762.887836] usb 1-1.3: Stopping data EP 0x1 (running 1) [ 4762.887849] usb 1-1.3: 1:1 Stop Playback PCM [ 4762.902542] usb 1-1.3: Closing EP 0x1 (count 1) [ 4762.902549] usb 1-1.3: Setting usb interface 1:0 for EP 0x1 [ 4762.902915] usb 1-1.3: EP 0x1 closed [ 4762.902928] usb 1-1.3: Closing EP 0x81 (count 1) [ 4762.902935] usb 1-1.3: Setting usb interface 1:0 for EP 0x81 [ 4762.903179] usb 1-1.3: EP 0x81 closed
The flow looks good judging from this log, at least.
The device is configured with the dedicated sync endpoint, but it's not with the implicit feedback mode. It's interesting whether the device behaves differently if you load snd-usb-audio module with implicit_fb=1 boot option. I don't expect it working better, but anyway...
Takashi
--- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -1238,7 +1238,7 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval, (cval->control << 8) | minchn, &cval->res) < 0) { cval->res = 1;
} else {
} else if (cval->head.mixer->protocol == UAC_VERSION_1) { int last_valid_res = cval->res; while (cval->res > 1) {
On Tue, 19 Jan 2021 18:40:04 +0100, Mike Oliphant wrote:
Your mixer.c patch does get rid of the RANGE errors. No change to behavior, though.
I'd already tried setting "implicit_fb=1" even though I didn't expect it to work, since there is a separate feedback endpoint. I just tried it again - it doesn't seem to hurt anything, but it doesn't help either.
Capture seems to be working perfectly with the clock patch - I'm not sure why I was initially getting noisy input.
I checked "/proc/asound/card*/pcm*/sub*/status" during playback, and the pointer seems to be moving forward as it should. All indications are that the system thinks playback is working fine.
One interesting piece of information - alsamixer shows two stereo outputs ("pcm" and "pcm1"). Not sure why there are two - maybe output is going to the wrong one?
You might need to unmute and increase both. The first one should be a master volume/switch while the second one is for the stereo channels.
Naming the mixer elements properly for USB-audio is a really tough task. Many firmware don't set the right strings and a guess work doesn't fit to all. But certainly there are some rooms for improvements there.
Takashi
I spent a fair bit of time debugging the code setting/getting mixer control values, and I can't see anything that seems to be operating incorrectly.
Unless you have any other suggestions, I'm going to admit defeat and return the audio interface.
It is probably worth committing the clock selector patch - it at least made capture work, and it may help with other audio interfaces.
Thanks for your help,
Mike
On Wed, Jan 20, 2021 at 6:33 AM Takashi Iwai tiwai@suse.de wrote:
On Tue, 19 Jan 2021 18:40:04 +0100, Mike Oliphant wrote:
Your mixer.c patch does get rid of the RANGE errors. No change to
behavior,
though.
I'd already tried setting "implicit_fb=1" even though I didn't expect it
to
work, since there is a separate feedback endpoint. I just tried it again
- it
doesn't seem to hurt anything, but it doesn't help either.
Capture seems to be working perfectly with the clock patch - I'm not
sure why
I was initially getting noisy input.
I checked "/proc/asound/card*/pcm*/sub*/status" during playback, and the pointer seems to be moving forward as it should. All indications are
that the
system thinks playback is working fine.
One interesting piece of information - alsamixer shows two stereo outputs ("pcm" and "pcm1"). Not sure why there are two - maybe output is going
to the
wrong one?
You might need to unmute and increase both. The first one should be a master volume/switch while the second one is for the stereo channels.
Naming the mixer elements properly for USB-audio is a really tough task. Many firmware don't set the right strings and a guess work doesn't fit to all. But certainly there are some rooms for improvements there.
Takashi
On Wed, 20 Jan 2021 22:17:35 +0100, Mike Oliphant wrote:
I spent a fair bit of time debugging the code setting/getting mixer control values, and I can't see anything that seems to be operating incorrectly.
So, even if you unmute and raise both mixers, it didn't help, right? I took a look at the lsusb output, but I couldn't find anything else suspicious.
Unless you have any other suggestions, I'm going to admit defeat and return the audio interface.
It is probably worth committing the clock selector patch - it at least made capture work, and it may help with other audio interfaces.
OK, I'll submit two fix patches.
thanks,
Takashi
Yeah, I tried every possible permutation of mute/volumes on the mixer controls.
Thanks for submitting the patches. Maybe someone else will have better luck down the road.
Mike
On Wed, Jan 20, 2021 at 1:38 PM Takashi Iwai tiwai@suse.de wrote:
On Wed, 20 Jan 2021 22:17:35 +0100, Mike Oliphant wrote:
I spent a fair bit of time debugging the code setting/getting mixer
control
values, and I can't see anything that seems to be operating incorrectly.
So, even if you unmute and raise both mixers, it didn't help, right? I took a look at the lsusb output, but I couldn't find anything else suspicious.
Unless you have any other suggestions, I'm going to admit defeat and
return
the audio interface.
It is probably worth committing the clock selector patch - it at least
made
capture work, and it may help with other audio interfaces.
OK, I'll submit two fix patches.
thanks,
Takashi
As a last ditch effort before returning the device, I tried the clock patch on a Raspberry Pi 4 running an older kernel, and... it works.
The kernel version is "Linux raspberrypi 4.19.89-v7l+" and is from late February 2020.
Maybe a change between then and now broke something? I know there have been a *lot* of changes since then, though...
Mike
On Wed, Jan 20, 2021 at 1:47 PM Mike Oliphant oliphant@nostatic.org wrote:
Yeah, I tried every possible permutation of mute/volumes on the mixer controls.
Thanks for submitting the patches. Maybe someone else will have better luck down the road.
Mike
On Wed, Jan 20, 2021 at 1:38 PM Takashi Iwai tiwai@suse.de wrote:
On Wed, 20 Jan 2021 22:17:35 +0100, Mike Oliphant wrote:
I spent a fair bit of time debugging the code setting/getting mixer
control
values, and I can't see anything that seems to be operating incorrectly.
So, even if you unmute and raise both mixers, it didn't help, right? I took a look at the lsusb output, but I couldn't find anything else suspicious.
Unless you have any other suggestions, I'm going to admit defeat and
return
the audio interface.
It is probably worth committing the clock selector patch - it at least
made
capture work, and it may help with other audio interfaces.
OK, I'll submit two fix patches.
thanks,
Takashi
After some more testing, it seems to be working inconsistently on my Raspberry Pi. Sometimes it works perfectly, sometimes only capture works, and sometimes only playback works.
The behavior seems reminiscent of some of the problems with implicit feedback devices which have now been fixed.
Mike
On Thu, Jan 21, 2021 at 11:04 AM Mike Oliphant oliphant@nostatic.org wrote:
As a last ditch effort before returning the device, I tried the clock patch on a Raspberry Pi 4 running an older kernel, and... it works.
The kernel version is "Linux raspberrypi 4.19.89-v7l+" and is from late February 2020.
Maybe a change between then and now broke something? I know there have been a *lot* of changes since then, though...
Mike
On Wed, Jan 20, 2021 at 1:47 PM Mike Oliphant oliphant@nostatic.org wrote:
Yeah, I tried every possible permutation of mute/volumes on the mixer controls.
Thanks for submitting the patches. Maybe someone else will have better luck down the road.
Mike
On Wed, Jan 20, 2021 at 1:38 PM Takashi Iwai tiwai@suse.de wrote:
On Wed, 20 Jan 2021 22:17:35 +0100, Mike Oliphant wrote:
I spent a fair bit of time debugging the code setting/getting mixer
control
values, and I can't see anything that seems to be operating
incorrectly.
So, even if you unmute and raise both mixers, it didn't help, right? I took a look at the lsusb output, but I couldn't find anything else suspicious.
Unless you have any other suggestions, I'm going to admit defeat and
return
the audio interface.
It is probably worth committing the clock selector patch - it at least
made
capture work, and it may help with other audio interfaces.
OK, I'll submit two fix patches.
thanks,
Takashi
participants (2)
-
Mike Oliphant
-
Takashi Iwai