[alsa-devel] Roland Boutique USB Implicit Feedback Weirdness
Hi,
I've been trying to get some Roland Boutique devices to work with ALSA, and have had some initial success, but I've hit a wall and was wondering if anyone on the list might be able to help point me in the right direction to get it done.
Some background: The Roland Boutique series is a collection of small drum machines and synthesizers from Roland that include a compposite USB interface which carries both PCM and MIDI. The PCM on most units is 2 channels in and out, on some there are additional channels.
The devices present themselves to ALSA as many Roland devices seem to, and all the interfaces seem to be correctly auto-detected with current ALSA code.
For example, the JP-08 (0582:01b5):
$ amidi -l Dir Device Name IO hw:2,0,0 Boutiq MIDI 1
$ ./alsacap -C 2 *** Scanning for playback devices on card 2 *** Card 2, ID `Boutiq', name `Boutiq' Device 0, ID `USB Audio', name `USB Audio', 1 subdevices (1 available) 2 channels, sampling rate 44100..44100 Hz Sample formats: S32_LE Subdevice 0, name `subdevice #0'
$ ./alsacap -R -C 2 *** Scanning for recording devices on card 2 *** Card 2, ID `Boutiq', name `Boutiq' Device 0, ID `USB Audio', name `USB Audio', 1 subdevices (1 available) 2 channels, sampling rate 44100..44100 Hz Sample formats: S32_LE Subdevice 0, name `subdevice #0'
The MIDI works flawlessley, but the playback and capture interfaces do not. When the device is connected, an error usually appears comething like:
[ 15.737868] usb 2-1: Manufacturer: Roland [ 15.737871] usb 2-1: SerialNumber: BQJP352DDA054653353337241943 [ 15.765216] snd-usb-audio: probe of 2-1:1.0 failed with error -5 [ 15.767884] usbcore: registered new interface driver snd-usb-audio [ 15.803631] usb 2-1: Unable to change format on ep #8e: already in use [ 15.803659] usb 2-1: Unable to change format on ep #8e: already in use ...
When playing from aplay or arecord, nothing happens and eventually the program exits with an input/output error:
$ aplay -vv -D hw:CARD=Boutiq,DEV=0 -t raw -c 2 -r 44100 -f S32_LE /dev/urandom Playing raw data '/dev/urandom' : Signed 32 bit Little Endian, Rate 44100 Hz, Stereo Hardware PCM card 2 'Boutiq' device 0 subdevice 0 Its setup is: stream : PLAYBACK access : RW_INTERLEAVED format : S32_LE subformat : STD channels : 2 rate : 44100 exact rate : 44100 (44100/1) msbits : 32 buffer_size : 22050 period_size : 5513 period_time : 125011 tstamp_mode : NONE period_step : 1 avail_min : 5513 period_event : 0 start_threshold : 22050 stop_threshold : 22050 silence_threshold: 0 silence_size : 0 boundary : 6206523236469964800 appl_ptr : 0 hw_ptr : 0 ##################################################+| 99%aplay: pcm_write:1939: write error: Input/output error
As far as I can tell, most of the Boutique models have the same problem, and it seems to be related to the audio streaming implicit feedback. I was able to get the JP-08 and SE-02 PCM to work by interrupting the code that adds the feedback interface as follows:
--- linux-4.13.3/sound/usb/pcm.c 2017-09-20 16:28:17.000000000 +1000 +++ linux-4.13.3_uh/sound/usb/pcm.c 2017-09-24 04:54:17.950406081 +1000 @@ -367,6 +367,10 @@ search_roland_implicit_fb(dev, altsd->bInterfaceNumber + 1, altsd->bAlternateSetting, &alts, &ep) >= 0) { + dev_err(&dev->dev, + " > roland fb search found ep %x for %x\n", + ep, subs->ep_num); + return 0; goto add_sync_ep; }
When this patch is applied and the unit connected, you can see the search matching the correct interfaces for feedback, but they are not added. Interestingly, the probe error -5 on 1-1:1.0 is no longer present:
[ 24.832193] usb 1-1: Manufacturer: Roland [ 24.832194] usb 1-1: SerialNumber: BQJP352DDA054653353337241943 [ 24.846986] usbcore: registered new interface driver snd-usb-audio [ 24.869113] usb 1-1: > roland fb search found ep 8e for d [ 24.882599] usb 1-1: > roland fb search found ep 8e for d
Now when you playback aith aplay, it works:
$ aplay -vv -D hw:CARD=Boutiq,DEV=0 -t raw -c 2 -r 44100 -f S32_LE /dev/urandom Playing raw data '/dev/urandom' : Signed 32 bit Little Endian, Rate 44100 Hz, Stereo Hardware PCM card 2 'Boutiq' device 0 subdevice 0 Its setup is: stream : PLAYBACK access : RW_INTERLEAVED format : S32_LE subformat : STD channels : 2 rate : 44100 exact rate : 44100 (44100/1) msbits : 32 buffer_size : 22050 period_size : 5513 period_time : 125011 tstamp_mode : NONE period_step : 1 avail_min : 5513 period_event : 0 start_threshold : 22050 stop_threshold : 22050 silence_threshold: 0 silence_size : 0 boundary : 6206523236469964800 appl_ptr : 0 hw_ptr : 0 ##################################################+| 99%^C Aborted by signal Interrupt...
Capture also works, but only if you have a playback in process. If you try to use arecord on its own, you get input/output error as before. However, if you start the playback, and then capture, it works fine:
$ aplay -D hw:CARD=Boutiq,DEV=0 -t raw -c 2 -r 44100 -f S32_LE /dev/urandom & Playing raw data '/dev/urandom' : Signed 32 bit Little Endian, Rate 44100 Hz, Stereo $ arecord -vv -D hw:CARD=Boutiq,DEV=0 -c 2 -r 44100 -f S32_LE test.wav Recording WAVE 'test.wav' : Signed 32 bit Little Endian, Rate 44100 Hz, Stereo Hardware PCM card 2 'Boutiq' device 0 subdevice 0 Its setup is: stream : CAPTURE access : RW_INTERLEAVED format : S32_LE subformat : STD channels : 2 rate : 44100 exact rate : 44100 (44100/1) msbits : 32 buffer_size : 22050 period_size : 5513 period_time : 125011 tstamp_mode : NONE period_step : 1 avail_min : 5513 period_event : 0 start_threshold : 1 stop_threshold : 22050 silence_threshold: 0 silence_size : 0 boundary : 6206523236469964800 appl_ptr : 0 hw_ptr : 0 ###########+ | 21%^C Aborted by signal Interrupt...
So it seems like even though the feedback system should be working for these units, some part of the setup process is not working quite as Roland expects, and as a result they just seem to hang. Skipping the feedback search for these units doesn't seem like the correct fix, especially when the feedback mechanism seems to be working. I just don't know where to look. If anyone could shed some light on what's going on, or point me toward a possible solution, that would be fantastic.
For reference, the USB info for the JP-08 is as follows (the SE-02 has an identical interface layout):
$ lsusb -v -d 0582:01b5
Bus 001 Device 003: ID 0582:01b5 Roland Corp. Couldn't open device, some information will be missing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 255 Vendor Specific Class bDeviceSubClass 0 bDeviceProtocol 255 bMaxPacketSize0 64 idVendor 0x0582 Roland Corp. idProduct 0x01b5 bcdDevice 1.00 iManufacturer 1 iProduct 2 iSerial 3 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 258 bNumInterfaces 4 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 500mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 255 Vendor Specific Subclass bInterfaceProtocol 0 iInterface 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 2 bInterfaceProtocol 2 iInterface 0 ** UNRECOGNIZED: 06 24 f1 01 00 00 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 1 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 2 bInterfaceProtocol 2 iInterface 0 ** UNRECOGNIZED: 07 24 01 01 00 01 00 ** UNRECOGNIZED: 0b 24 02 01 02 04 18 01 44 ac 00 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x0d EP 13 OUT bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x0038 1x 56 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 2 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 2 bInterfaceProtocol 2 iInterface 0 ** UNRECOGNIZED: 07 24 01 01 00 01 00 ** UNRECOGNIZED: 0b 24 02 01 02 04 18 01 44 ac 00 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x0d EP 13 OUT bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x0038 1x 56 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 2 bInterfaceProtocol 1 iInterface 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 1 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 2 bInterfaceProtocol 1 iInterface 0 ** UNRECOGNIZED: 07 24 01 07 00 01 00 ** UNRECOGNIZED: 0b 24 02 01 02 04 18 01 44 ac 00 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x8e EP 14 IN bmAttributes 37 Transfer Type Isochronous Synch Type Asynchronous Usage Type Implicit feedback Data wMaxPacketSize 0x0038 1x 56 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 2 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 2 bInterfaceProtocol 1 iInterface 0 ** UNRECOGNIZED: 07 24 01 07 00 01 00 ** UNRECOGNIZED: 0b 24 02 01 02 04 18 01 44 ac 00 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x8e EP 14 IN bmAttributes 37 Transfer Type Isochronous Synch Type Asynchronous Usage Type Implicit feedback Data wMaxPacketSize 0x0038 1x 56 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 3 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 3 bInterfaceProtocol 0 iInterface 0 ** UNRECOGNIZED: 06 24 f1 02 01 01 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x84 EP 4 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 3 bAlternateSetting 1 bNumEndpoints 2 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 3 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 4 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x85 EP 5 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 4
Thanks,
Nathan Fraser --
participants (1)
-
Nathan Fraser