[alsa-devel] How to use implicit feedback with full duplex?
Eldad Zack
eldad at fogrefinery.com
Tue Feb 5 23:50:19 CET 2013
Hi Clemens,
On Tue, 5 Feb 2013, Clemens Ladisch wrote:
> Hi,
>
> I thought I'd try to use implicit feedback with my simple audio device:
>
> Interface Descriptor:
> bInterfaceNumber 1
> bAlternateSetting 0
> Interface Descriptor:
> bInterfaceNumber 1
> bAlternateSetting 1
> AudioStreaming Interface Descriptor:
> ...
> Endpoint Descriptor:
> bEndpointAddress 0x01 EP 1 OUT
> Interface Descriptor:
> bInterfaceNumber 2
> bAlternateSetting 0
> Interface Descriptor:
> bInterfaceNumber 2
> bAlternateSetting 1
> AudioStreaming Interface Descriptor:
> ...
> Endpoint Descriptor:
> bEndpointAddress 0x82 EP 2 IN
>
> So I wrote a patch to configure it like those M-Audio devices:
>
> --- a/sound/usb/pcm.c
> +++ b/sound/usb/pcm.c
> @@ -391,6 +391,17 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
> attr = fmt->ep_attr & USB_ENDPOINT_SYNCTYPE;
>
> switch (subs->stream->chip->usb_id) {
> + case USB_ID(0x0582, 0x0018):
> + if (is_playback) {
> + implicit_fb = 1;
> + ep = 0x82;
> + iface = usb_ifnum_to_if(dev, 2);
> + if (!iface || iface->num_altsetting < 2)
> + return -EINVAL;
> + alts = &iface->altsetting[1];
> + goto add_sync_ep;
> + }
> + break;
Looks good to me.
> case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
> if (is_playback) {
> implicit_fb = 1;
>
> This works fine when playing something:
...
> But when I then try to record at the same time, the driver refuses to
> configure the input endpoint (to the only format, which is already set):
>
> kernel: setting usb interface 2:1
> kernel: Re-using EP 82 in iface 2,1 @ffff8801fd2ac000
> kernel: Unable to change format on ep #82: already in use
>
> And despite that "alreay in use" check, the input endpoint is affected
> so much that playback breaks.
>
> Is full duplex supposed to work? Does it work with other devices?
This is probably a "yes, but" :)
I use my device mostly full duplex, but with jack opening both
playback and capture at the same time.
I assume you are opening two different streams, one for playback and
one for capture. In that case, the capture EP is of course already
in use, as a source for timing.
If I try opening 2 different streams I get the same here - but playback
doesn't break for me. I wonder why that happens.
Can you try using jackd -d alsa -d hw:x with the device and see if that
works for you?
Cheers,
Eldad
More information about the Alsa-devel
mailing list