From mboxrd@z Thu Jan 1 00:00:00 1970 From: "David W." Subject: Re: Crackly playback, Roland AIRA TR-8 USB audio almost works with ALSA . . . Date: Tue, 10 Feb 2015 20:26:31 +0000 Message-ID: <54DA6977.9020002@d-dub.org.uk> References: <53B6FB3A.40804@d-dub.org.uk> <53B84A0B.9060805@googlemail.com> <53B8563A.40608@d-dub.org.uk> <53B9A821.9060407@googlemail.com> <53B9D21F.30801@d-dub.org.uk> <53BA3EDD.4090105@googlemail.com> <548F70D2.90506@d-dub.org.uk> <54A2FF71.9030502@d-dub.org.uk> <54C6CA42.3040206@d-dub.org.uk> <54D8A083.8080800@d-dub.org.uk> <54D8CC18.9090004@d-dub.org.uk> Reply-To: regulars@d-dub.org.uk Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from owm.eumx.net (eumx.net [91.82.101.43]) by alsa0.perex.cz (Postfix) with ESMTP id D5EEA260547 for ; Tue, 10 Feb 2015 21:26:32 +0100 (CET) In-Reply-To: <54D8CC18.9090004@d-dub.org.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org Is "implicit feedback" specific to USB audio playback endpoints? If yes, and if the implementation of "implicit feedback" is more problematic in this 'Roland TR-8' than it is in the 'M-Audio C400/C600/Ultras' for ALSA development (the latter apparently have quirks working for them), is the following possible: to write a quirk for this TR-8 which will expose only the (non-implicit feedback) audio capture USB endpoints and MIDI in+out endpoints but block/mask the (problematic implicit feedback) audio playback USB endpoints? This isn't ideal but would open up a lot of usability for this popular drum machine in linux. Audio output could be routed to a separate device via jack2's audioadapter or alsa_in and alsa_out etc. cheers. On 09/02/15 15:02, David W. wrote: > > PS, without any of my patches applied: > > http://www.alsa-project.org/db/?f=c8c6e17e735b0861968c4c397fc754186eb98da7 > > On 09/02/15 11:56, David W. wrote: >> >> I'm having trouble making a patch (for linux-3.18.5-1-ARCH) to enable >> implicit feedback mode work for this USB device (Roland TR-8) and would >> appreciate some advice. >> >> >> I've made semi-educated guesses at various patches, but if an actual >> developer has any suggestions they would be hugely appreciated!! >> >> >> Adding a quirk for the device (see patch quoted below) to: >> >> "set_sync_ep_implicit_fb_quirk()" >> >> using endpoint 0x85 (EP 5 IN; Transfer Type: Interrupt, Usage Type: Data; >> see lsusb -v output below) causes: >> >> "BOGUS urb xfer, pipe 0 != type 1" >> >> And no sound when playing a sample using 'aplay'. There is sound only if: >> >> 'printk(KERN_ERR " XXX %s() :%d\n", __func__, __LINE__);' >> >> is added to retire_outbound_urb() and retire_inbound_urb() in >> sound/usb/endpoint.c. On playback with 'aplay' enough messages are printed >> to the journal to crash the journald - BUT some samples are played, mostly >> with bad timing although there are little bursts when I can actually hear >> the sample. Additionally warnings: >> >> underrun!!! (at least 16.449 ms long) >> underrun!!! (at least 205.035 ms long) >> >> Playing the sample again provides no sound and no warnings but pauses for > >> 20 seconds but the sample is ~2 seconds long. Rebooting the computer allows >> for sound to be heard again on first play of sample. Rebooting device does not. >> >> >> This seems like the problem is controlling how much data should >> be sent to the endpoint i.e., the frequency of packets (urbs?) sent from >> host to device is off but somehow all the printk() activity slows things >> down enough for the device to actually put something though its DAC? >> >> AFAIU, an asynchronous device typically has three isochronous endpoints: >> - one asynchronous input endpoint for capture samples. >> - one asynchronous output endpoint for playback samples >> - one input endpoint for playback frequency feedback data >> >> but implicit feedback mode does something slightly different and atypical >> for the 'playback frequency feedback data'? And that is the problem here? >> >> And the "BOGUS urb xfer, pipe 0 != type 1" is indicating we haven't set up >> an endpoint to correctly: >> >> 0 == PIPE_ISOCHRONOUS >> 1 == PIPE_INTERRUPT >> 2 == PIPE_CONTROL >> 3 == PIPE_BULK >> >> Endpoint 0x85 is IN to host and Transfer Type: Interrupt, hence 'type 1' in >> the warning. The implicit feedback quirk is probably setting up a pipe to >> receive isochronous feedback data from that endpoint hence, 'pipe 0' in the >> warning. >> >> I tried setting the set_sync_ep_implicit_fb_quirk() entry to a different >> endpoint: 0x8e. This is the audio capture endpoint. M-Audio C400, C600 and >> Ultras have set_sync_ep_implicit_fb_quirk() entries using their audio >> capture endpoints as defined in their quirks-table.h entries. >> >> When connecting, journal entries: >> kernel: usb 5-1.1: new high-speed USB device number 5 using ehci-pci >> kernel: snd-usb-audio: probe of 5-1.1:1.0 failed with error -5 >> >> On playback: >> kernel: usb 5-1.1: cannot submit urb 0, error -2: endpoint not enabled >> >> and in terminal: >> Playing WAVE 'Roland-GR-1-Orchestra-Hit-C5_32_c4_96000.wav' : Signed 32 bit >> Little Endian, Rate 96000 Hz, Channels 4 >> aplay: set_params:1297: Unable to install hw params: >> ACCESS: RW_INTERLEAVED >> FORMAT: S32_LE >> SUBFORMAT: STD >> SAMPLE_BITS: 32 >> FRAME_BITS: 128 >> CHANNELS: 4 >> RATE: 96000 >> PERIOD_TIME: 125000 >> PERIOD_SIZE: 12000 >> PERIOD_BYTES: 192000 >> PERIODS: 4 >> BUFFER_TIME: 500000 >> BUFFER_SIZE: 48000 >> BUFFER_BYTES: 768000 >> TICK_TIME: 0 >> >> >> I also tried adding an entry for this device to quirks-table.h. This causes >> journal entries, when first connected: >> >> kernel: usb 1-1.1: 1:1: cannot get freq at ep 0xd >> kernel: usb 1-1.1: 2:1: cannot get freq at ep 0x8e >> >> and on playback: >> >> kernel: usb 1-1.1: 1:1: cannot get freq at ep 0xd >> >> I've tried this with and without: >> >> .clock = 0x80, >> >> in the struct snd_usb_audio_quirk for the playback and capture interfaces. >> I copied that from the M-Audio C400, C600 and Ultra entries which >> apparently also operate in implicit feedback mode but I'm not sure how to >> obtain the correct value for this device. >> >> Finally, is it possible that search_roland_implicit_fb() isn't being called >> or needs to do something slightly different for this recent Roland device? >> >> >> I can continue guessing at patches, but if an actual developer has any >> suggestions they would be hugely appreciated!! >> >> >> David W. >> >> >> On 26/01/15 23:14, David W. wrote: >>> Dear ALSA developers, >>> >>> On 30/12/14 19:39, David W. wrote: >>>> On 15/12/14 23:37, David W. wrote: >>>>> On 07/07/14 07:31, Clemens Ladisch wrote: >>>>>> >>>>>> Apparently, this device needs some vendor-specific magic to enable >>>>>> recording. >>>>>> >>> >>> This AIRA TR-8 USB audio device, which fails with an 'input/output >>> error' after ~10 seconds for 'aplay' and 'arecord', seems to require >>> operation in implicit feedback mode: the following patch suggested by >>> Daniel Mack solves the 'input/output' error for 'aplay', but the >>> playback is noisy and corrupted and the kernel complains of 'rogue URB >>> xfers' (see below). >>> >>> Given this information and the quote below from lsusb etc., I am hoping >>> someone would be able to suggest a further patch to get playback and >>> recording working :-) >>> >>> I can patch, compile and test recent linux kernels (whatever is in: >>> https://www.archlinux.org/packages/?sort=&repo=Testing&q=linux) >>> >>> >>> Here's the patch from Daniel which helped: >>> >>> >>> diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c >>> index 0d8aba5..e35575b 100644 >>> --- a/sound/usb/pcm.c >>> +++ b/sound/usb/pcm.c >>> @@ -346,6 +346,15 @@ static int set_sync_ep_implicit_fb_quirk(struct >>> snd_usb_substream *subs, >>> >>> alts = &iface->altsetting[1]; >>> goto add_sync_ep; >>> + case USB_ID(0x0582, 0x017c): >>> + ep = 0x85; >>> + iface = usb_ifnum_to_if(dev, 3); >>> + >>> + if (!iface || iface->num_altsetting == 0) >>> + return -EINVAL; >>> + >>> + alts = &iface->altsetting[1]; >>> + goto add_sync_ep; >>> } >>> if (attr == USB_ENDPOINT_SYNC_ASYNC && >>> altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC && >>> >>> >>> >>> Here's an example of the kind of complaint that the 3.18.2-2-ARCH kernel, with the above patch >>> applied, reports: >>> >>> Jan 12 23:18:20 dwmobile kernel: WARNING: CPU: 2 PID: 1889 at drivers/usb/core/urb.c:450 >>> usb_submit_urb+0x265/0x5f0 [usbcore]() >>> Jan 12 23:18:20 dwmobile kernel: usb 2-1.1: BOGUS urb xfer, pipe 0 != type 1 >>> Jan 12 23:18:20 dwmobile kernel: Modules linked in: snd_usb_audio snd_usbmidi_lib snd_rawmidi >>> snd_seq_device ctr ccm sha256_ssse3 sha256_generic d >>> Jan 12 23:18:20 dwmobile kernel: snd_pcm snd_timer video mei_me battery ac snd intel_agp button >>> intel_gtt acpi_cpufreq shpchp mei soundcore proce >>> Jan 12 23:18:20 dwmobile kernel: CPU: 2 PID: 1889 Comm: aplay Not tainted 3.18.2-2-custom #1 >>> Jan 12 23:18:20 dwmobile kernel: Hardware name: System76, Inc. Pangolin >>> Performance /W76x/M77xCUH >>> Jan 12 23:18:20 dwmobile kernel: 0000000000000000 000000005911a000 ffff88022988faf8 ffffffff8154f134 >>> Jan 12 23:18:20 dwmobile kernel: 0000000000000000 ffff88022988fb50 ffff88022988fb38 ffffffff81072bc1 >>> Jan 12 23:18:20 dwmobile kernel: ffff88022988fb28 ffff88022f1aba00 0000000000000020 0000000000000003 >>> Jan 12 23:18:20 dwmobile kernel: Call Trace: >>> Jan 12 23:18:20 dwmobile kernel: [] dump_stack+0x4e/0x71 >>> Jan 12 23:18:20 dwmobile kernel: [] warn_slowpath_common+0x81/0xa0 >>> Jan 12 23:18:20 dwmobile kernel: [] warn_slowpath_fmt+0x55/0x70 >>> Jan 12 23:18:20 dwmobile kernel: [] ? usb_enable_endpoint+0x85/0x90 [usbcore] >>> Jan 12 23:18:20 dwmobile kernel: [] usb_submit_urb+0x265/0x5f0 [usbcore] >>> Jan 12 23:18:20 dwmobile kernel: [] snd_usb_endpoint_start+0x125/0x350 >>> [snd_usb_audio] >>> Jan 12 23:18:20 dwmobile kernel: [] start_endpoints+0xb9/0x1a0 [snd_usb_audio] >>> Jan 12 23:18:20 dwmobile kernel: [] snd_usb_pcm_prepare+0x17d/0x560 [snd_usb_audio] >>> Jan 12 23:18:20 dwmobile kernel: [] ? current_fs_time+0x16/0x60 >>> Jan 12 23:18:20 dwmobile kernel: [] snd_pcm_do_prepare+0x1b/0x30 [snd_pcm] >>> Jan 12 23:18:20 dwmobile kernel: [] snd_pcm_action_single+0x2f/0x70 [snd_pcm] >>> Jan 12 23:18:20 dwmobile kernel: [] snd_pcm_action_nonatomic+0x76/0x80 [snd_pcm] >>> Jan 12 23:18:20 dwmobile kernel: [] snd_pcm_common_ioctl1+0x688/0xbc0 [snd_pcm] >>> Jan 12 23:18:20 dwmobile kernel: [] snd_pcm_playback_ioctl1+0x118/0x280 [snd_pcm] >>> Jan 12 23:18:20 dwmobile kernel: [] snd_pcm_playback_ioctl+0x34/0x40 [snd_pcm] >>> Jan 12 23:18:20 dwmobile kernel: [] do_vfs_ioctl+0x2d0/0x4b0 >>> Jan 12 23:18:20 dwmobile kernel: [] ? vfs_write+0x18c/0x200 >>> Jan 12 23:18:20 dwmobile kernel: [] SyS_ioctl+0x81/0xa0 >>> Jan 12 23:18:20 dwmobile kernel: [] system_call_fastpath+0x12/0x17 >>> Jan 12 23:18:20 dwmobile kernel: ---[ end trace e6531ceb4fd4f2e5 ]--- >>> Jan 12 23:18:20 dwmobile kernel: ------------[ cut here ]------------ >>> >>> >>>>> >>>>> amidi -l >>>>> >>>>> Dir Device Name >>>>> IO hw:0,0,0 USB X-Session MIDI 1 >>>>> I hw:0,0,1 USB X-Session MIDI 2 >>>>> IO hw:2,0,0 TR-8 MIDI 1 # this device >>>>> IO hw:2,0,1 TR-8 MIDI 2 # this device >>>>> >>>>> >>>>> ./alsacap -d hw:2,0 >>>>> >>>>> *** Exploring configuration space of device 'hw:1,0' for playback *** >>>>> 4 channels >>>>> Sampling rate 96000 Hz >>>>> Sample formats: S32_LE >>>>> Significant bits: 32 >>>>> >>>>> >>>>> Bus 002 Device 005: ID 0582:017c Roland Corp. >>>>> 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 0x017c >>>>> bcdDevice 1.00 >>>>> iManufacturer 1 Roland >>>>> iProduct 2 TR-8 >>>>> iSerial 0 >>>>> bNumConfigurations 1 >>>>> Configuration Descriptor: >>>>> bLength 9 >>>>> bDescriptorType 2 >>>>> wTotalLength 176 >>>>> bNumInterfaces 4 >>>>> bConfigurationValue 1 >>>>> iConfiguration 0 >>>>> bmAttributes 0xc0 >>>>> Self Powered >>>>> MaxPower 0mA >>>>> 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 >>>>> # <06 24 F1 02 > from patch comment by Clemens Ladisch >>>>> ** UNRECOGNIZED: 06 24 f1 01 00 00 >>>>> # Audio OUT 4 channels? >>>>> Interface Descriptor: >>>>> bLength 9 >>>>> bDescriptorType 4 >>>>> bInterfaceNumber 1 >>>>> bAlternateSetting 1 >>>>> bNumEndpoints 1 >>>>> bInterfaceClass 255 Vendor Specific Class >>>>> bInterfaceSubClass 2 >>>>> bInterfaceProtocol 2 >>>>> iInterface 0 >>>>> # seen in other Roland devices >>>>> # http://ubuntuforums.org/archive/index.php/t-1905531.html >>>>> ** UNRECOGNIZED: 07 24 01 01 00 01 00 >>>>> ** UNRECOGNIZED: 0b 24 02 01 04 04 18 01 00 77 01 >>>>> Endpoint Descriptor: >>>>> bLength 7 >>>>> bDescriptorType 5 >>>>> bEndpointAddress 0x0d EP 13 OUT >>>>> bmAttributes 5 >>>>> Transfer Type Isochronous # audio >>>>> Synch Type Asynchronous >>>>> Usage Type Data >>>>> # 4x 24-bit 96kHz == 56 bytes per 4 channels (or 32-bit?) >>>>> wMaxPacketSize 0x00e0 1x 224 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 >>>>> # Audio IN: 14 channels? >>>>> 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 0e 04 18 01 00 77 01 >>>>> Endpoint Descriptor: >>>>> bLength 7 >>>>> bDescriptorType 5 >>>>> bEndpointAddress 0x8e EP 14 IN >>>>> bmAttributes 37 >>>>> Transfer Type Isochronous >>>>> Synch Type Asynchronous >>>>> Usage Type Implicit feedback Data >>>>> # 14 channels x 56 bytes per transfer 96kHz, 24-bit? >>>>> wMaxPacketSize 0x0310 1x 784 bytes >>>>> bInterval 1 >>>>> # MIDI? >>>>> Interface Descriptor: >>>>> bLength 9 >>>>> bDescriptorType 4 >>>>> bInterfaceNumber 3 >>>>> bAlternateSetting 0 >>>>> bNumEndpoints 2 >>>>> bInterfaceClass 255 Vendor Specific Class >>>>> bInterfaceSubClass 3 >>>>> bInterfaceProtocol 0 >>>>> iInterface 0 >>>>> # <06 24 F1 02 > 2 in 2 out >>>>> ** UNRECOGNIZED: 06 24 f1 02 02 02 >>>>> 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 >>>>> # MIDI: same endpoints needs Bulk AND Interrupt packet types? >>>>> 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 1 >>>>> 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 1 >>>>> Device Qualifier (for other device speed): >>>>> bLength 10 >>>>> bDescriptorType 6 >>>>> bcdUSB 2.00 >>>>> bDeviceClass 255 Vendor Specific Class >>>>> bDeviceSubClass 0 >>>>> bDeviceProtocol 255 >>>>> bMaxPacketSize0 64 >>>>> bNumConfigurations 1 >>>>> can't get debug descriptor: Resource temporarily unavailable >>>>> Device Status: 0x0001 >>>>> Self Powered >>>>> >> >> _______________________________________________ >> Alsa-devel mailing list >> Alsa-devel@alsa-project.org >> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel >> > > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@alsa-project.org > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel >