This changes the Midiman quirk code to allow a different number of input
and output ports, and adds a quirk for the 2x4.

This isn't tested at all because somebody forgot to include the firmware
loader in the 2x4's Windows driver package. :)


Index: alsa-kernel/usb/usbaudio.h
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.h,v
retrieving revision 1.9
diff -u -r1.9 usbaudio.h
--- alsa-kernel/usb/usbaudio.h  25 Nov 2002 18:15:04 -0000      1.9
+++ alsa-kernel/usb/usbaudio.h  5 Dec 2002 08:41:53 -0000
@@ -172,7 +172,8 @@

 /* for QUIRK_MIDI_YAMAHA, data is NULL */

-/* for QUIRK_MIDI_MIDIMAN, data is the number of ports */
+/* for QUIRK_MIDI_MIDIMAN, data points to a snd_usb_midi_endpoint_info
+ * structure (out_cables and in_cables only) */

 /* for QUIRK_ROLAND_UA100, data is NULL */

Index: alsa-kernel/usb/usbmidi.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbmidi.c,v
retrieving revision 1.10
diff -u -r1.10 usbmidi.c
--- alsa-kernel/usb/usbmidi.c   11 Nov 2002 08:58:29 -0000      1.10
+++ alsa-kernel/usb/usbmidi.c   5 Dec 2002 08:41:53 -0000
@@ -892,7 +892,8 @@
 /*
  * Creates the endpoints and their ports for Midiman devices.
  */
-static int snd_usbmidi_create_endpoints_midiman(snd_usb_midi_t* umidi, int ports)
+static int snd_usbmidi_create_endpoints_midiman(snd_usb_midi_t* umidi,
+                                               snd_usb_midi_endpoint_info_t* endpoint)
 {
        snd_usb_midi_endpoint_info_t ep_info;
        struct usb_interface* intf;
@@ -906,7 +907,7 @@
                return -ENOENT;
        hostif = intf->altsetting;
        intfd = get_iface_desc(hostif);
-       if (intfd->bNumEndpoints < (ports > 1 ? 5 : 3)) {
+       if (intfd->bNumEndpoints < (endpoint->out_cables > 0x0001 ? 5 : 3)) {
                snd_printdd(KERN_ERR "not enough endpoints\n");
                return -ENOENT;
        }
@@ -923,7 +924,7 @@
                snd_printdd(KERN_ERR "endpoint[2] isn't bulk output\n");
                return -ENXIO;
        }
-       if (ports > 1) {
+       if (endpoint->out_cables > 0x0001) {
                epd = get_endpoint(hostif, 4);
                if ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) != USB_DIR_OUT ||
                    (epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != 
USB_ENDPOINT_XFER_BULK) {
@@ -933,31 +934,33 @@
        }

        ep_info.epnum = get_endpoint(hostif, 2)->bEndpointAddress & 
USB_ENDPOINT_NUMBER_MASK;
-       ep_info.out_cables = 0x5555 & ((1 << ports) - 1);
+       ep_info.out_cables = endpoint->out_cables & 0x5555;
        err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]);
        if (err < 0)
                return err;

        ep_info.epnum = get_endpoint(hostif, 0)->bEndpointAddress & 
USB_ENDPOINT_NUMBER_MASK;
-       ep_info.in_cables = (1 << ports) - 1;
+       ep_info.in_cables = endpoint->in_cables;
        err = snd_usbmidi_in_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]);
        if (err < 0)
                return err;
        umidi->endpoints[0].in->urb->complete = snd_usbmidi_in_midiman_complete;

-       if (ports > 1) {
+       if (endpoint->out_cables > 0x0001) {
                ep_info.epnum = get_endpoint(hostif, 4)->bEndpointAddress & 
USB_ENDPOINT_NUMBER_MASK;
-               ep_info.out_cables = 0xaaaa & ((1 << ports) - 1);
+               ep_info.out_cables = endpoint->out_cables & 0xaaaa;
                err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, 
&umidi->endpoints[1]);
                if (err < 0)
                        return err;
        }

-       for (cable = 0; cable < ports; ++cable) {
-               snd_usbmidi_init_substream(umidi, SNDRV_RAWMIDI_STREAM_OUTPUT, cable,
-                                          &umidi->endpoints[cable & 
1].out->ports[cable].substream);
-               snd_usbmidi_init_substream(umidi, SNDRV_RAWMIDI_STREAM_INPUT, cable,
-                                          
&umidi->endpoints[0].in->ports[cable].substream);
+       for (cable = 0; cable < 0x10; ++cable) {
+               if (endpoint->out_cables & (1 << cable))
+                       snd_usbmidi_init_substream(umidi, SNDRV_RAWMIDI_STREAM_OUTPUT, 
+cable,
+                                                  &umidi->endpoints[cable & 
+1].out->ports[cable].substream);
+               if (endpoint->in_cables & (1 << cable))
+                       snd_usbmidi_init_substream(umidi, SNDRV_RAWMIDI_STREAM_INPUT, 
+cable,
+                                                  
+&umidi->endpoints[0].in->ports[cable].substream);
        }
        return 0;
 }
@@ -1020,6 +1023,8 @@
                        err = snd_usbmidi_detect_yamaha(umidi, &endpoints[0]);
                        break;
                case QUIRK_MIDI_MIDIMAN:
+                       memcpy(&endpoints[0], quirk->data,
+                              sizeof(snd_usb_midi_endpoint_info_t));
                        err = 0;
                        break;
                default:
@@ -1034,15 +1039,11 @@
        }

        /* create rawmidi device */
-       if (quirk && quirk->type == QUIRK_MIDI_MIDIMAN) {
-               in_ports = out_ports = (int)quirk->data;
-       } else {
-               out_ports = 0;
-               in_ports = 0;
-               for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) {
-                       out_ports += snd_usbmidi_count_bits(endpoints[i].out_cables);
-                       in_ports += snd_usbmidi_count_bits(endpoints[i].in_cables);
-               }
+       out_ports = 0;
+       in_ports = 0;
+       for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) {
+               out_ports += snd_usbmidi_count_bits(endpoints[i].out_cables);
+               in_ports += snd_usbmidi_count_bits(endpoints[i].in_cables);
        }
        err = snd_usbmidi_create_rawmidi(umidi, out_ports, in_ports);
        if (err < 0) {
@@ -1052,7 +1053,7 @@

        /* create endpoint/port structures */
        if (quirk && quirk->type == QUIRK_MIDI_MIDIMAN)
-               err = snd_usbmidi_create_endpoints_midiman(umidi, (int)quirk->data);
+               err = snd_usbmidi_create_endpoints_midiman(umidi, &endpoints[0]);
        else
                err = snd_usbmidi_create_endpoints(umidi, endpoints);
        if (err < 0) {
Index: alsa-kernel/usb/usbquirks.h
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbquirks.h,v
retrieving revision 1.8
diff -u -r1.8 usbquirks.h
--- alsa-kernel/usb/usbquirks.h 3 Dec 2002 11:07:10 -0000       1.8
+++ alsa-kernel/usb/usbquirks.h 5 Dec 2002 08:41:53 -0000
@@ -484,7 +484,10 @@
                .product_name = "MidiSport 2x2",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = (void*) 2
+               .data = & (const snd_usb_midi_endpoint_info_t) {
+                       .out_cables = 0x0003,
+                       .in_cables  = 0x0003
+               }
        }
 },
 {
@@ -494,7 +497,10 @@
                .product_name = "MidiSport 1x1",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = (void*) 1
+               .data = & (const snd_usb_midi_endpoint_info_t) {
+                       .out_cables = 0x0001,
+                       .in_cables  = 0x0001
+               }
        }
 },
 {
@@ -504,7 +510,10 @@
                .product_name = "Keystation",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = (void*) 1
+               .data = & (const snd_usb_midi_endpoint_info_t) {
+                       .out_cables = 0x0001,
+                       .in_cables  = 0x0001
+               }
        }
 },
 {
@@ -514,7 +523,10 @@
                .product_name = "MidiSport 4x4",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = (void*) 4
+               .data = & (const snd_usb_midi_endpoint_info_t) {
+                       .out_cables = 0x000f,
+                       .in_cables  = 0x000f
+               }
        }
 },
 {
@@ -524,7 +536,23 @@
                .product_name = "MidiSport 8x8",
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = (void*) 9
+               .data = & (const snd_usb_midi_endpoint_info_t) {
+                       .out_cables = 0x01ff,
+                       .in_cables  = 0x01ff
+               }
+       }
+},
+{
+       USB_DEVICE_VENDOR_SPEC(0x0763, 0x1041),
+       .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+               .vendor_name = "M-Audio",
+               .product_name = "MidiSport 2x4",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_MIDI_MIDIMAN,
+               .data = & (const snd_usb_midi_endpoint_info_t) {
+                       .out_cables = 0x000f,
+                       .in_cables  = 0x0003
+               }
        }
 },
 {
@@ -534,7 +562,10 @@
                .product_name = "Quattro",
                .ifnum = 9,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = (void*) 1
+               .data = & (const snd_usb_midi_endpoint_info_t) {
+                       .out_cables = 0x0001,
+                       .in_cables  = 0x0001
+               }
        }
 },
 {
@@ -544,7 +575,10 @@
                .product_name = "AudioPhile",
                .ifnum = 9,
                .type = QUIRK_MIDI_MIDIMAN,
-               .data = (void*) 1
+               .data = & (const snd_usb_midi_endpoint_info_t) {
+                       .out_cables = 0x0001,
+                       .in_cables  = 0x0001
+               }
        }
 },




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to