Skip to content

Commit 920159e

Browse files
tiwaigregkh
authored andcommitted
ALSA: usb-audio: Make mic volume workarounds globally applicable
[ Upstream commit d6e6b9218ced5249b9136833ef5ec3f554ec7fde ] It seems that many webcams have buggy firmware and don't expose the mic capture volume with the proper resolution. We have workarounds in mixer.c, but judging from the numbers, those can be better managed as global quirk flags. Link: https://patch.msgid.link/[email protected] Signed-off-by: Takashi Iwai <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 67a11de commit 920159e

File tree

3 files changed

+45
-48
lines changed

3 files changed

+45
-48
lines changed

sound/usb/mixer.c

Lines changed: 15 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,21 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
10841084
struct snd_kcontrol *kctl)
10851085
{
10861086
struct snd_usb_audio *chip = cval->head.mixer->chip;
1087+
1088+
if (chip->quirk_flags & QUIRK_FLAG_MIC_RES_384) {
1089+
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
1090+
usb_audio_info(chip,
1091+
"set resolution quirk: cval->res = 384\n");
1092+
cval->res = 384;
1093+
}
1094+
} else if (chip->quirk_flags & QUIRK_FLAG_MIC_RES_16) {
1095+
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
1096+
usb_audio_info(chip,
1097+
"set resolution quirk: cval->res = 16\n");
1098+
cval->res = 16;
1099+
}
1100+
}
1101+
10871102
switch (chip->usb_id) {
10881103
case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
10891104
case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */
@@ -1168,27 +1183,6 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
11681183
}
11691184
break;
11701185

1171-
case USB_ID(0x046d, 0x0807): /* Logitech Webcam C500 */
1172-
case USB_ID(0x046d, 0x0808):
1173-
case USB_ID(0x046d, 0x0809):
1174-
case USB_ID(0x046d, 0x0819): /* Logitech Webcam C210 */
1175-
case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */
1176-
case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
1177-
case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
1178-
case USB_ID(0x046d, 0x0826): /* HD Webcam c525 */
1179-
case USB_ID(0x046d, 0x08ca): /* Logitech Quickcam Fusion */
1180-
case USB_ID(0x046d, 0x0991):
1181-
case USB_ID(0x046d, 0x09a2): /* QuickCam Communicate Deluxe/S7500 */
1182-
/* Most audio usb devices lie about volume resolution.
1183-
* Most Logitech webcams have res = 384.
1184-
* Probably there is some logitech magic behind this number --fishor
1185-
*/
1186-
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
1187-
usb_audio_info(chip,
1188-
"set resolution quirk: cval->res = 384\n");
1189-
cval->res = 384;
1190-
}
1191-
break;
11921186
case USB_ID(0x0495, 0x3042): /* ESS Technology Asus USB DAC */
11931187
if ((strstr(kctl->id.name, "Playback Volume") != NULL) ||
11941188
strstr(kctl->id.name, "Capture Volume") != NULL) {
@@ -1197,28 +1191,6 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
11971191
cval->res = 1;
11981192
}
11991193
break;
1200-
case USB_ID(0x1224, 0x2a25): /* Jieli Technology USB PHY 2.0 */
1201-
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
1202-
usb_audio_info(chip,
1203-
"set resolution quirk: cval->res = 16\n");
1204-
cval->res = 16;
1205-
}
1206-
break;
1207-
case USB_ID(0x1bcf, 0x2283): /* NexiGo N930AF FHD Webcam */
1208-
case USB_ID(0x03f0, 0x654a): /* HP 320 FHD Webcam */
1209-
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
1210-
usb_audio_info(chip,
1211-
"set resolution quirk: cval->res = 16\n");
1212-
cval->res = 16;
1213-
}
1214-
break;
1215-
case USB_ID(0x1bcf, 0x2281): /* HD Webcam */
1216-
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
1217-
usb_audio_info(chip,
1218-
"set resolution quirk: cval->res = 16\n");
1219-
cval->res = 16;
1220-
}
1221-
break;
12221194
}
12231195
}
12241196

sound/usb/quirks.c

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2144,18 +2144,39 @@ struct usb_audio_quirk_flags_table {
21442144
static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
21452145
/* Device matches */
21462146
DEVICE_FLG(0x03f0, 0x654a, /* HP 320 FHD Webcam */
2147-
QUIRK_FLAG_GET_SAMPLE_RATE),
2147+
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
21482148
DEVICE_FLG(0x041e, 0x3000, /* Creative SB Extigy */
21492149
QUIRK_FLAG_IGNORE_CTL_ERROR),
21502150
DEVICE_FLG(0x041e, 0x4080, /* Creative Live Cam VF0610 */
21512151
QUIRK_FLAG_GET_SAMPLE_RATE),
21522152
DEVICE_FLG(0x045e, 0x083c, /* MS USB Link headset */
21532153
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY |
21542154
QUIRK_FLAG_DISABLE_AUTOSUSPEND),
2155+
DEVICE_FLG(0x046d, 0x0807, /* Logitech Webcam C500 */
2156+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2157+
DEVICE_FLG(0x046d, 0x0808, /* Logitech Webcam C600 */
2158+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2159+
DEVICE_FLG(0x046d, 0x0809,
2160+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2161+
DEVICE_FLG(0x046d, 0x0819, /* Logitech Webcam C210 */
2162+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2163+
DEVICE_FLG(0x046d, 0x081b, /* HD Webcam c310 */
2164+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2165+
DEVICE_FLG(0x046d, 0x081d, /* HD Webcam c510 */
2166+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2167+
DEVICE_FLG(0x046d, 0x0825, /* HD Webcam c270 */
2168+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2169+
DEVICE_FLG(0x046d, 0x0826, /* HD Webcam c525 */
2170+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
21552171
DEVICE_FLG(0x046d, 0x084c, /* Logitech ConferenceCam Connect */
21562172
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY_1M),
2173+
DEVICE_FLG(0x046d, 0x08ca, /* Logitech Quickcam Fusion */
2174+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
21572175
DEVICE_FLG(0x046d, 0x0991, /* Logitech QuickCam Pro */
2158-
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR),
2176+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR |
2177+
QUIRK_FLAG_MIC_RES_384),
2178+
DEVICE_FLG(0x046d, 0x09a2, /* QuickCam Communicate Deluxe/S7500 */
2179+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
21592180
DEVICE_FLG(0x046d, 0x09a4, /* Logitech QuickCam E 3500 */
21602181
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR),
21612182
DEVICE_FLG(0x0499, 0x1509, /* Steinberg UR22 */
@@ -2223,7 +2244,7 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
22232244
DEVICE_FLG(0x0fd9, 0x0008, /* Hauppauge HVR-950Q */
22242245
QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
22252246
DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
2226-
QUIRK_FLAG_GET_SAMPLE_RATE),
2247+
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
22272248
DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
22282249
QUIRK_FLAG_GET_SAMPLE_RATE),
22292250
DEVICE_FLG(0x1397, 0x0507, /* Behringer UMC202HD */
@@ -2261,9 +2282,9 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
22612282
DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
22622283
QUIRK_FLAG_GET_SAMPLE_RATE),
22632284
DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
2264-
QUIRK_FLAG_GET_SAMPLE_RATE),
2285+
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
22652286
DEVICE_FLG(0x1bcf, 0x2283, /* NexiGo N930AF FHD Webcam */
2266-
QUIRK_FLAG_GET_SAMPLE_RATE),
2287+
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
22672288
DEVICE_FLG(0x2040, 0x7200, /* Hauppauge HVR-950Q */
22682289
QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
22692290
DEVICE_FLG(0x2040, 0x7201, /* Hauppauge HVR-950Q-MXL */

sound/usb/usbaudio.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ extern bool snd_usb_skip_validation;
194194
* QUIRK_FLAG_FIXED_RATE
195195
* Do not set PCM rate (frequency) when only one rate is available
196196
* for the given endpoint.
197+
* QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384
198+
* Set the fixed resolution for Mic Capture Volume (mostly for webcams)
197199
*/
198200

199201
#define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0)
@@ -218,5 +220,7 @@ extern bool snd_usb_skip_validation;
218220
#define QUIRK_FLAG_IFACE_SKIP_CLOSE (1U << 19)
219221
#define QUIRK_FLAG_FORCE_IFACE_RESET (1U << 20)
220222
#define QUIRK_FLAG_FIXED_RATE (1U << 21)
223+
#define QUIRK_FLAG_MIC_RES_16 (1U << 22)
224+
#define QUIRK_FLAG_MIC_RES_384 (1U << 23)
221225

222226
#endif /* __USBAUDIO_H */

0 commit comments

Comments
 (0)