Below is the final version of my changes to usbmidi.c. I used the opportunity to make some further fixes.
These changes are desirable even if (apparently) they don't fix Martin's problem. - enlarged vendor/device name strings - fixed buffer overflow for card->shortname - added error messages if initialization fails - made information messages more consistent - fixed module_setup comment 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 31 Jul 2002 10:00:51 -0000 @@ -167,8 +167,8 @@ * or is supplied explicitly for broken devices. */ struct usbmidi_device_info { - char vendor[24]; /* vendor name */ - char product[24]; /* device name */ + char vendor[32]; /* vendor name */ + char product[32]; /* device name */ int16_t ifnum; /* interface number */ struct usbmidi_endpoint_info { int16_t epnum; /* endpoint number, @@ -803,7 +803,7 @@ int cap, type, port; int out, in; snd_seq_port_callback_t port_callback; - char port_name[40]; + char port_name[48]; for (c = 0; c < 0x10; ++c) { out = ep_info->out_cables & (1 << c); @@ -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", +port); return port; + } if (in) umidi->endpoints[ep].in->ports[c].seq_port = port; @@ -889,7 +891,7 @@ err = snd_usbmidi_create_endpoint_ports(umidi, i, &port_idx); if (err < 0) return err; - printk(KERN_INFO "snd-usb-midi: endpoint %d: %d output and %d input ports\n", + printk(KERN_INFO "snd-usb-midi: endpoint %d: created %d output and %d +input ports\n", ep_info->epnum, snd_usbmidi_count_bits(ep_info->out_cables), snd_usbmidi_count_bits(ep_info->in_cables)); @@ -972,12 +974,12 @@ return -ENOMEM; } strcpy(card->driver, "USB MIDI"); - sprintf(card->shortname, "%s %s", - device_info->vendor, device_info->product); - sprintf(card->longname, "%s (%x:%x if %d at %03d/%03d)", - card->shortname, usb_device->descriptor.idVendor, - usb_device->descriptor.idProduct, device_info->ifnum, - usb_device->bus->busnum, usb_device->devnum); + snprintf(card->shortname, sizeof(card->shortname), "%s %s", + device_info->vendor, device_info->product); + snprintf(card->longname, sizeof(card->longname), "%s %s at %03d/%03d if %d", + device_info->vendor, device_info->product, + usb_device->bus->busnum, usb_device->devnum, + device_info->ifnum); card->private_data = (void*)dev; err = snd_seq_device_new(card, 0, SNDRV_SEQ_DEV_ID_USBMIDI, @@ -1084,14 +1086,16 @@ 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) - strcpy(device_info->vendor, "Unknown Vendor"); + sprintf(device_info->vendor, "Unknown Vendor %x", +usb_device->descriptor.idVendor); if (usb_device->descriptor.iProduct == 0 || usb_string(usb_device, usb_device->descriptor.iProduct, device_info->product, sizeof(device_info->product)) < 0) - strcpy(device_info->product, "Unknown Device"); + sprintf(device_info->product, "Unknown Device %x", +usb_device->descriptor.idProduct); intf = usb_ifnum_to_if(usb_device, ifnum); if (!intf) @@ -1140,7 +1144,7 @@ } else { device_info->endpoints[epidx].out_cables = (1 << ms_ep->bNumEmbMIDIJack) - 1; } - printk(KERN_INFO "snd-usb-midi: using %d %s jack(s) on endpoint %d\n", + printk(KERN_INFO "snd-usb-midi: detected %d %s jack(s) on endpoint +%d\n", ms_ep->bNumEmbMIDIJack, ep->bEndpointAddress & USB_DIR_IN ? "input" : "output", device_info->endpoints[epidx].epnum); @@ -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; } @@ -1369,7 +1376,8 @@ #ifndef MODULE /* - * format is snd-usb-midi=snd_enable,snd_index,snd_id,snd_pid,snd_int_transfer + * format is snd-usb-midi=snd_enable,snd_index,snd_id, + * snd_vid,snd_pid,snd_int_transfer */ static int __init snd_usbmidi_module_setup(char* str) { ------------------------------------------------------- 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