Another discovery and a temporary solution that works for me, at least..

snd_usb_audio_probe() gets called twice, I'm guessing first for the 
audio interface and second for the midi interface.  I found that if 
snd-usb-audio is not loaded and I plug in the Audiophile and let 
hotplug take care of loading the modules (the only way audio will 
work), then usb_set_configuration() fails during the second call to 
snd_usb_audio_probe(), causing the probe to abort.  So no midi.

This patch causes usb_set_configuration() to be called only during the 
first probe.  I have no idea what's really causing the problem, but for 
now this gives me audio and midi at the same time. :)

Ben

On Thursday 17 July 2003 1:47 am, Ben Saylor wrote:
> I know you developers are overloaded, but here are a few things I've
> discovered as I attempt to diagnose the problem..
>
> After installing the Audiophile once on a Windows machine, MIDI works
> with 0.9.5, even if I power off and unplug the unit from USB and AC.
> It seems that the firmware only has to be loaded once.
>
> I get sound (but always at 48khz) with 0.9.5 iff I do the following:
>   1.  make sure ALSA modules are unloaded
>   2.  unplug the audiophile from the computer
>   3.  plug the audiophile into the computer
> snd-usb-audio and other modules are loaded automatically.
> --However, MIDI doesn't work if I do this.
>
> If I load the ALSA modules any other way than the above, MIDI works,
> but audio is either static or distorted.  I also get a bunch of these
> in /var/log/debug when I play a sound file (44100 Hz, 16 bit, stereo)
> with aplay:
>
> Jul 17 01:14:32 purebox kernel: usb.c: usb-check-bandwidth would have
> FAILED: was 938, would be 940, bustime = 2 us
> Jul 17 01:14:32 purebox kernel: usb.c: usb-check-bandwidth would have
> FAILED: was 826, would be 940, bustime = 114 us
> Jul 17 01:14:32 purebox kernel: usb.c: usb-check-bandwidth would have
> FAILED: was 938, would be 940, bustime = 2 us
> Jul 17 01:14:33 purebox kernel: usb.c: usb-check-bandwidth would have
> FAILED: was 483, would be 940, bustime = 457 us
> Jul 17 01:14:33 purebox kernel: usb.c: usb-check-bandwidth would have
> FAILED: was 938, would be 940, bustime = 2 us
> Jul 17 01:14:33 purebox kernel: usb.c: usb-check-bandwidth would have
> FAILED: was 826, would be 940, bustime = 114 us
>
> etc.  running tail -f /var/log/debug shows that 10 of these lines are
> spit out per second during playback.  They don't appear if I let the
> modules load automatically.
>
> Ben
--- alsa-driver-0.9.5/alsa-kernel/usb/usbaudio.c	2003-06-23 04:41:36.000000000 -0800
+++ alsa-driver-0.9.5-apusbhack/alsa-kernel/usb/usbaudio.c	2003-07-18 00:51:07.000000000 -0800
@@ -2599,6 +2599,7 @@
 	static snd_device_ops_t ops = {
 		.dev_free =	snd_usb_audio_dev_free,
 	};
+snd_printd(KERN_INFO ">>snd_usb_audio_create\n");
 	
 	*rchip = NULL;
 	chip = snd_magic_kcalloc(snd_usb_audio_t, 0, GFP_KERNEL);
@@ -2688,17 +2689,53 @@
 	snd_usb_audio_t *chip;
 	struct usb_host_interface *alts;
 	int ifnum;
+snd_printd(KERN_INFO ">>snd_usb_audio_probe\n");
+snd_printd(KERN_INFO "\
+  match_flags = %x\n\
+  idVendor = %x\n\
+  idProduct = %x\n\
+  bcdDevice_lo = %x\n\
+  bcdDevice_hi = %x\n\
+  bDeviceClass = %x\n\
+  bDeviceSubClass = %x\n\
+  bDeviceProtocol = %x\n\
+  bInterfaceClass = %x\n\
+  bInterfaceSubClass = %x\n\
+  bInterfaceProtocol = %x\n\
+",
+usb_id->match_flags,
+usb_id->idVendor,
+usb_id->idProduct,
+usb_id->bcdDevice_lo,
+usb_id->bcdDevice_hi,
+usb_id->bDeviceClass,
+usb_id->bDeviceSubClass,
+usb_id->bDeviceProtocol,
+usb_id->bInterfaceClass,
+usb_id->bInterfaceSubClass,
+usb_id->bInterfaceProtocol
+);
+
+	static int frogbreath = 0;
 
 	alts = &intf->altsetting[0];
 	ifnum = get_iface_desc(alts)->bInterfaceNumber;
+snd_printd(KERN_INFO "check1\n");
 
 	if (quirk && quirk->ifnum != QUIRK_ANY_INTERFACE && ifnum != quirk->ifnum)
 		goto __err_val;
+snd_printd(KERN_INFO "check2\n");
 
-	if (usb_set_configuration(dev, get_cfg_desc(config)->bConfigurationValue) < 0) {
-		snd_printk(KERN_ERR "cannot set configuration (value 0x%x)\n", get_cfg_desc(config)->bConfigurationValue);
-		goto __err_val;
+	if (!frogbreath) {
+		// if the audiophile is hotplugged and snd-usb-audio wasn't already loaded, usb_set_configuration fails on the 2nd probe (midi interface)
+		if (usb_set_configuration(dev, get_cfg_desc(config)->bConfigurationValue) < 0) {
+			snd_printk(KERN_ERR "cannot set configuration (value 0x%x)\n", get_cfg_desc(config)->bConfigurationValue);
+			snd_printd(KERN_INFO "cannot set configuration (value 0x%x)\n", get_cfg_desc(config)->bConfigurationValue);
+			goto __err_val;
+		}
+		frogbreath++;
 	}
+snd_printd(KERN_INFO "check3\n");
 
 	/* SB Extigy needs special boot-up sequence */
 	/* if more models come, this will go to the quirk list. */
@@ -2754,6 +2791,7 @@
 
 	err = 1; /* continue */
 	if (quirk) {
+snd_printd(KERN_INFO ">> ******* [snd_usb_audio_probe] if (quirk) { ..\n");
 		/* need some special handlings */
 		if ((err = snd_usb_create_quirk(chip, intf, quirk)) < 0)
 			goto __error;
@@ -2793,6 +2831,7 @@
 	snd_usb_audio_t *chip;
 	snd_card_t *card;
 	struct list_head *p;
+//snd_printd(KERN_INFO ">>snd_usb_audio_disconnect\n");
 
 	if (ptr == (void *)-1L)
 		return;
@@ -2836,6 +2875,7 @@
 			   const struct usb_device_id *id)
 {
 	void *chip;
+snd_printd(KERN_INFO ">>usb_audio_probe\n");
 	chip = snd_usb_audio_probe(interface_to_usbdev(intf), intf, id);
 	if (chip) {
 		dev_set_drvdata(&intf->dev, chip);

Reply via email to