Commit b978d2f6 authored by Joe Turner's avatar Joe Turner Committed by Sasha Levin

ALSA: usb-audio: Don't attempt to get Lifecam HD-5000 sample rate

[ Upstream commit b62b9980 ]

Adds a quirk to disable the check that the sample rate has been set correctly, as the Lifecam does not support getting the sample rate.

This means that we don't need to wait for the USB timeout when attempting to get the sample rate. Waiting for the timeout causes problems in some applications, which give up on the device acquisition process before it has had time to complete, resulting in no sound.

[minor tidy up by tiwai]
Signed-off-by: default avatarJoe Turner <joe@oampo.co.uk>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
parent 320bb9ec
...@@ -303,6 +303,11 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface, ...@@ -303,6 +303,11 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface,
return err; return err;
} }
/* Don't check the sample rate for devices which we know don't
* support reading */
if (snd_usb_get_sample_rate_quirk(chip))
return 0;
if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC_GET_CUR, if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC_GET_CUR,
USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN, USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep, UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep,
......
...@@ -1102,6 +1102,11 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs, ...@@ -1102,6 +1102,11 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
} }
} }
bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)
{
/* MS Lifecam HD-5000 doesn't support reading the sample rate. */
return chip->usb_id == USB_ID(0x045E, 0x076D);
}
/* Marantz/Denon USB DACs need a vendor cmd to switch /* Marantz/Denon USB DACs need a vendor cmd to switch
* between PCM and native DSD mode * between PCM and native DSD mode
......
...@@ -21,6 +21,8 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev, ...@@ -21,6 +21,8 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev,
void snd_usb_set_format_quirk(struct snd_usb_substream *subs, void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
struct audioformat *fmt); struct audioformat *fmt);
bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip);
int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, int snd_usb_is_big_endian_format(struct snd_usb_audio *chip,
struct audioformat *fp); struct audioformat *fp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment