At 3:08 AM +0100 11/16/12, Eldad Zack wrote:
I think that Autodiscovery should fail with this amtel device because the number of endpoints is 1 for the playback ep (this is what I encountered with the C400). Maybe a info message could be added in case the attributes do say implicit feedback, but bNumEndpoints < 2?
Good point. I'll look into changing that.
At 3:10 AM +0100 11/16/12, Eldad Zack wrote:
Hi Daniel, On Thu, 15 Nov 2012, Daniel Griscom wrote:
The audio output stream (from the computer to my device) runs at a few frames per second higher or lower rate than that of the input stream (from my device to the computer). The actual difference seems to be stable on a specific machine, but varies greatly between machines (I've seen differences from +7fps to -2fps; I presume this is due to differences in CPU clock frequencies).
Looking at the lsusb output, I assume that the sink/source coupling doesn't work, because it's not in an interface group.
And, good point number 2.
I'm not an ALSA dev, but I recently posted a series of patches for the M-Audio Fast Track C400, which uses the implicit feedback code that was already in the tree for other devices.
So, this device uses implicit feedback to tell ALSA to send output data at the same rate as its input data? Very cool; I've ordered one to test.
Yes, and it seems to work very good with my hardware. But I'm not actually sure I want to recommend a device with broken descriptors...
Try this, it *MIGHT* work (applies against mainline 3.7-rc5) - completely untested, btw.
Cheers, Eldad
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 5c12a3f..fd766a3 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -372,6 +372,19 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) alts = &iface->altsetting[1]; goto add_sync_ep; }
break;
case USB_ID(0x03eb, 0x2311): /* AMTEL === UNTESTED === */
if (is_playback) {
implicit_fb = 1;
ep = 0x82;
iface = usb_ifnum_to_if(dev, 2);
if (!iface || iface->num_altsetting == 0)
return -EINVAL;
alts = &iface->altsetting[1];
goto add_sync_ep;
}
}
if (((is_playback && attr == USB_ENDPOINT_SYNC_ASYNC) ||
Very, ultra, mega-cool. Even if it doesn't work as-is, this will give me big hints on how to get it done.
Thanks for all the help, Dan