Martin Langer wrote:
> my new USB-MIDI-Keyboard has two USB subclasses usb-midi and usb-audio.
> Evolution, the manufacturer, told me "it's an Audio Class compliant device",
> but I don't find a new entry in /proc/asound/seq/clients after loading the
> modules.
> 
> usb.c: registered new driver snd-usb-midi
> snd-usb-midi: using interface 1
> snd-usb-midi: MIDIStreaming version 01.00
> snd-usb-midi: using 1 input jack(s) on endpoint 1
> snd-usb-midi: using 1 output jack(s) on endpoint 2
> snd-usb-midi: detected Evolution Electronics L MK-249C USB MIDI keyboa
> usb.c: snd-usb-midi driver claimed interface dfe688d8
> 
> It's not typical to have a midi-keyboard with two subclasses, or?

As Pedro said, subclass 1 is an AudioControl interface. There should be
two cards, one created by snd-usb-audio, and the other one created by
snd-usb-midi (see /proc/asound/cards). The contents of the control
interface (if there are any controls) should be visible in the output
of the "lsusb" command.

Your keyboard is unusual in two respects: it's an Audio Class compliant
device (yes, this _is_ unusual for USB MIDI devices :-) , and it uses
two endpoints, one for each direction. The combination of these two
triggers an ugly bug in the descriptor parsing code (device_info isn't
initialized).

Please try the following patch (the current taciturnity of the driver
is somewhat inconvenient, so it adds some error messages as well).


Index: usb/usbmidi.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usbmidi.c,v
retrieving revision 1.4
diff -u -r1.4 usbmidi.c
--- usb/usbmidi.c       5 Jul 2002 13:39:28 -0000       1.4
+++ usb/usbmidi.c       30 Jul 2002 12:39:00 -0000
@@ -834,8 +834,10 @@
                port = snd_seq_event_port_attach(umidi->seq_client,
                                                 &port_callback,
                                                 cap, type, port_name);
-               if (port < 0)
+               if (port < 0) {
+                       snd_printk(KERN_ERR "cannot create port (error code %d)\n", 
+err);
                        return port;
+               }
                if (in)
                        umidi->endpoints[ep].in->ports[c].seq_port = port;
 
@@ -1084,6 +1086,8 @@
        usb_ms_endpoint_descriptor_t* ms_ep;
        int i, epidx;
 
+       memset(device_info, 0, sizeof(*device_info));
+
        if (usb_device->descriptor.iManufacturer == 0 ||
            usb_string(usb_device, usb_device->descriptor.iManufacturer,
                       device_info->vendor, sizeof(device_info->vendor)) < 0)
@@ -1180,12 +1184,15 @@
 {
        usbmidi_device_info_t device_info;
        snd_card_t* card = NULL;
+       int err;
 
        if (snd_usbmidi_get_device_info(device, ifnum, device_id,
                                        &device_info) == 0) {
                printk(KERN_INFO "snd-usb-midi: detected %s %s\n",
                       device_info.vendor, device_info.product);
-               snd_usbmidi_card_create(device, &device_info, &card);
+               err = snd_usbmidi_card_create(device, &device_info, &card);
+               if (err < 0)
+                       snd_printk(KERN_ERR "cannot create card (error code %d)\n", 
+err);
        }
        return card;
 }


> ... and doing rmmod snd-usb-midi and rmmod snd-usb-audio ends here with
> Segmentation fault:
> 
> Jul 28 22:28:10 tuba kernel: usb.c: deregistering driver snd-usb-midi
> Jul 28 22:28:10 tuba kernel: Unable to handle kernel paging request at
> virtual address 29323034
> 
> a small bug or a big hole?

A small bug which results in a big mess.


HTH
Clemens


-------------------------------------------------------
This sf.net email is sponsored by: Dice - The leading online job board
for high-tech professionals. Search and apply for tech jobs today!
http://seeker.dice.com/seeker.epl?rel_code=31
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to