All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lucas <jaffa225man@gmail.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@alsa-project.org,
	"Keith A. Milner" <maillist@superlative.org>
Subject: Re: [PATCH] ALSA: usb-audio: Apply implicit feedback mode for BOSS devices
Date: Wed, 21 Apr 2021 11:39:51 -0500	[thread overview]
Message-ID: <CAOsVg8rCkpBAKkuqUGxt55xGo4D=7RZC_A7CAbQgpG1yLWtHVw@mail.gmail.com> (raw)
In-Reply-To: <s5hlf9cau80.wl-tiwai@suse.de>

[-- Attachment #1: Type: text/plain, Size: 9768 bytes --]

I'll have to try the revised patch later tonight when I have time, but for
now, I'm attaching the requested lsusb -v outputs.  The only one I left out
was the UA-101, due to its other driver.

Yes, with the previous IMPLICIT_FB_BOTH_DEV capture table entries, the
INTEGRA-7, R-26, and Boutique D-05 all worked on their highest sample rates.

I love that this probably will be working automatically for everything
Roland/BOSS/EDIROL in the end!

Thanks for your continued efforts Takashi!,

  Lucas

On Wed, Apr 21, 2021 at 3:59 AM Takashi Iwai <tiwai@suse.de> wrote:

> On Wed, 21 Apr 2021 06:59:51 +0200,
> Lucas wrote:
> >
> > First, thanks very much for trying to cover all devices through
> detection!  I
> > had hoped something like this could be done, but sadly, it has created a
> mixed
> > result:
> >
> > Roland VG-99 Perfect!:
> > arecord -D hw:VG99 -f S24_3LE -r 44100 -c 2 ./file.wav
> > Recording WAVE './file.wav' : Signed 24 bit Little Endian in 3bytes, Rate
> > 44100 Hz, Stereo
> > ^CAborted by signal Interrupt...
> >
> > aplay -D hw:VG99 -f S24_3LE -r 44100 -c 2 ./file.wav
> > Playing WAVE './file.wav' : Signed 24 bit Little Endian in 3bytes, Rate
> 44100
> > Hz, Stereo
> >
> > Roland INTEGRA-7 doesn't capture, but plays perfectly (only 96 kHz mode
> > tested):
> > arecord -D hw:INTEGRA7 -f S32_LE -r 96000 -c 2 ./file.wav
> > Recording WAVE './file.wav' : Signed 32 bit Little Endian, Rate 96000 Hz,
> > Stereo
> > arecord: pcm_read:2153: read error: Input/output error
> >
> > aplay -D hw:INTEGRA7 -f S32_LE -r 96000 -c 2 ./other-file.wav
> > Playing WAVE './other-file.wav' : Signed 32 bit Little Endian, Rate
> 96000 Hz,
> > Stereo
>
> Hm, that's bad.  And INTEGRA7 did work before the patching?
> I saw that this has the right EP numbers (0x0d and 0x8e), so the
> static quirk entry was correct.
>
> >
> > Roland R-26 doesn't capture, but plays perfectly (only 96 kHz mode
> tested):
>
> R-26 seems also to be the one with both ASYNC and EP 0x0d/0x8e, so the
> same reason as INTEGRA7.
>
> > arecord -D hw:R26AUDIO -f S32_LE -r 96000 -c 2 ./file.wav
> > Recording WAVE './file.wav' : Signed 32 bit Little Endian, Rate 96000 Hz,
> > Stereo
> > arecord: pcm_read:2153: read error: Input/output error
> >
> > aplay -D hw:R26AUDIO -f S32_LE -r 96000 -c 2 ./other-file.wav
> > Playing WAVE './other-file.wav' : Signed 32 bit Little Endian, Rate
> 96000 Hz,
> > Stereo
> >
> > Roland Boutique D-05 doesn't capture, but plays perfectly:
>
> OK, this one looks slightly different.
> D-05 has two EPs in each interface, both are ASYNC and 0x0d/0x8e.
> So another adjustment might be needed here.
>
> > EDIROL UA-101 full-speed (USB 1.1) and high-speed (USB 2.0) not detected
> for
> > capture or playback (only 48 kHz mode tested):
>
> This is a different driver, so we can forget for now.
>
> > I'm guessing another look at "lsusb -v" would help, but don't know what
> to
> > look for and have run out of time tonight.
>
> Could you post the archive of your lsusb -v outputs?  Put in a tarball
> and post with attachment.
>
> Below is a revised patch.  Let me know if this works better.
>
>
> thanks,
>
> Takashi
>
>
> --- a/sound/usb/implicit.c
> +++ b/sound/usb/implicit.c
> @@ -79,6 +79,7 @@ static const struct snd_usb_implicit_fb_match
> playback_implicit_fb_quirks[] = {
>
>  /* Implicit feedback quirk table for capture: only FIXED type */
>  static const struct snd_usb_implicit_fb_match
> capture_implicit_fb_quirks[] = {
> +#if 0
>         IMPLICIT_FB_FIXED_DEV(0x0582, 0x00a6, 0x0d, 0x01), /* Roland
> JUNO-G */
>         IMPLICIT_FB_FIXED_DEV(0x0582, 0x00a9, 0x0d, 0x01), /* Roland
> MC-808 */
>         IMPLICIT_FB_FIXED_DEV(0x0582, 0x00ad, 0x0d, 0x01), /* Roland
> SH-201 */
> @@ -146,6 +147,7 @@ static const struct snd_usb_implicit_fb_match
> capture_implicit_fb_quirks[] = {
>         IMPLICIT_FB_BOTH_DEV(0x0582, 0x01fd, 0x0d, 0x01), /* Roland
> Boutique SH-01A */
>         IMPLICIT_FB_BOTH_DEV(0x0582, 0x01ff, 0x0d, 0x01), /* Roland
> Boutique D-05 */
>         IMPLICIT_FB_BOTH_DEV(0x0582, 0x0203, 0x0d, 0x01), /* BOSS AD-10 */
> +#endif
>
>         {} /* terminator */
>  };
> @@ -204,30 +206,70 @@ static int add_generic_uac2_implicit_fb(struct
> snd_usb_audio *chip,
>                                        ifnum, alts);
>  }
>
> -/* Like the function above, but specific to Roland with vendor class and
> hack */
> +static bool roland_sanity_check_iface(struct usb_host_interface *alts)
> +{
> +       if (alts->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC ||
> +           (alts->desc.bInterfaceSubClass != 2 &&
> +            alts->desc.bInterfaceProtocol != 2) ||
> +           alts->desc.bNumEndpoints < 1)
> +               return false;
> +       return true;
> +}
> +
> +/* Like the UAC2 case above, but specific to Roland with vendor class and
> hack */
>  static int add_roland_implicit_fb(struct snd_usb_audio *chip,
>                                   struct audioformat *fmt,
> -                                 unsigned int ifnum,
> -                                 unsigned int altsetting)
> +                                 struct usb_host_interface *alts)
>  {
> -       struct usb_host_interface *alts;
>         struct usb_endpoint_descriptor *epd;
>
> -       alts = snd_usb_get_host_interface(chip, ifnum, altsetting);
> -       if (!alts)
> +       if (!roland_sanity_check_iface(alts))
>                 return 0;
> -       if (alts->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC ||
> -           (alts->desc.bInterfaceSubClass != 2 &&
> -            alts->desc.bInterfaceProtocol != 2) ||
> -           alts->desc.bNumEndpoints < 1)
> +       /* only when both streams are with ASYNC type */
> +       epd = get_endpoint(alts, 0);
> +       if (!usb_endpoint_is_isoc_out(epd) ||
> +           (epd->bmAttributes & USB_ENDPOINT_SYNCTYPE) !=
> USB_ENDPOINT_SYNC_ASYNC)
> +               return 0;
> +
> +       /* check capture EP */
> +       alts = snd_usb_get_host_interface(chip,
> +                                         alts->desc.bInterfaceNumber + 1,
> +                                         alts->desc.bAlternateSetting);
> +       if (!alts || !roland_sanity_check_iface(alts))
>                 return 0;
>         epd = get_endpoint(alts, 0);
>         if (!usb_endpoint_is_isoc_in(epd) ||
> -           (epd->bmAttributes & USB_ENDPOINT_USAGE_MASK) !=
> -                                       USB_ENDPOINT_USAGE_IMPLICIT_FB)
> +           (epd->bmAttributes & USB_ENDPOINT_SYNCTYPE) !=
> USB_ENDPOINT_SYNC_ASYNC)
>                 return 0;
> +       chip->playback_first = 1;
>         return add_implicit_fb_sync_ep(chip, fmt, epd->bEndpointAddress, 0,
> -                                      ifnum, alts);
> +                                      alts->desc.bInterfaceNumber, alts);
> +}
> +
> +/* capture quirk for Roland device; always full-duplex */
> +static int add_roland_capture_quirk(struct snd_usb_audio *chip,
> +                                   struct audioformat *fmt,
> +                                   struct usb_host_interface *alts)
> +{
> +       struct usb_endpoint_descriptor *epd;
> +
> +       if (!roland_sanity_check_iface(alts))
> +               return 0;
> +       epd = get_endpoint(alts, 0);
> +       if (!usb_endpoint_is_isoc_in(epd) ||
> +           (epd->bmAttributes & USB_ENDPOINT_SYNCTYPE) !=
> USB_ENDPOINT_SYNC_ASYNC)
> +               return 0;
> +
> +       alts = snd_usb_get_host_interface(chip,
> +                                         alts->desc.bInterfaceNumber - 1,
> +                                         alts->desc.bAlternateSetting);
> +       if (!alts || !roland_sanity_check_iface(alts))
> +               return 0;
> +       epd = get_endpoint(alts, 0);
> +       if (!usb_endpoint_is_isoc_out(epd))
> +               return 0;
> +       return add_implicit_fb_sync_ep(chip, fmt, epd->bEndpointAddress, 0,
> +                                      alts->desc.bInterfaceNumber, alts);
>  }
>
>  /* Playback and capture EPs on Pioneer devices share the same iface/altset
> @@ -365,14 +407,8 @@ static int audioformat_implicit_fb_quirk(struct
> snd_usb_audio *chip,
>         }
>
>         /* Roland/BOSS implicit feedback with vendor spec class */
> -       if (attr == USB_ENDPOINT_SYNC_ASYNC &&
> -           alts->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
> -           alts->desc.bInterfaceProtocol == 2 &&
> -           alts->desc.bNumEndpoints == 1 &&
> -           USB_ID_VENDOR(chip->usb_id) == 0x0582 /* Roland */) {
> -               if (add_roland_implicit_fb(chip, fmt,
> -                                          alts->desc.bInterfaceNumber + 1,
> -                                          alts->desc.bAlternateSetting))
> +       if (USB_ID_VENDOR(chip->usb_id) == 0x0582) {
> +               if (add_roland_implicit_fb(chip, fmt, alts) > 0)
>                         return 1;
>         }
>
> @@ -404,6 +440,13 @@ static int audioformat_capture_quirk(struct
> snd_usb_audio *chip,
>         if (p && (p->type == IMPLICIT_FB_FIXED || p->type ==
> IMPLICIT_FB_BOTH))
>                 return add_implicit_fb_sync_ep(chip, fmt, p->ep_num, 0,
>                                                p->iface, NULL);
> +
> +       /* Roland/BOSS need full-duplex streams */
> +       if (USB_ID_VENDOR(chip->usb_id) == 0x0582) {
> +               if (add_roland_capture_quirk(chip, fmt, alts) > 0)
> +                       return 1;
> +       }
> +
>         if (is_pioneer_implicit_fb(chip, alts))
>                 return 1; /* skip the quirk, also don't handle generic
> sync EP */
>         return 0;
>


-- 
Protect your digital freedom and privacy, eliminate DRM, learn more at
http://www.defectivebydesign.org/what_is_drm
On a related note, also see https://www.fsf.org/campaigns/surveillance

[-- Attachment #2: lsusb_-v.tar --]
[-- Type: application/x-tar, Size: 40960 bytes --]

  reply	other threads:[~2021-04-21 16:41 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-14  8:32 [PATCH] ALSA: usb-audio: Apply implicit feedback mode for BOSS devices Takashi Iwai
2021-04-14 15:08 ` Mike Oliphant
2021-04-19 13:45   ` Keith A. Milner
2021-04-20  4:20     ` Lucas
2021-04-20 15:42       ` Lucas
2021-04-20 16:36         ` Takashi Iwai
2021-04-21  4:59           ` Lucas
2021-04-21  8:59             ` Takashi Iwai
2021-04-21 16:39               ` Lucas [this message]
2021-04-22  4:05                 ` Lucas
2021-04-22  4:10                   ` Lucas
2021-04-22 12:02                     ` Takashi Iwai
2021-04-22 14:41       ` Keith A. Milner
2021-04-22 15:31         ` Lucas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAOsVg8rCkpBAKkuqUGxt55xGo4D=7RZC_A7CAbQgpG1yLWtHVw@mail.gmail.com' \
    --to=jaffa225man@gmail.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=maillist@superlative.org \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.