Skip to content

Commit d6e6b92

Browse files
committed
ALSA: usb-audio: Make mic volume workarounds globally applicable
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]>
1 parent b22b2e3 commit d6e6b92

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
@@ -2115,18 +2115,39 @@ struct usb_audio_quirk_flags_table {
21152115
static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
21162116
/* Device matches */
21172117
DEVICE_FLG(0x03f0, 0x654a, /* HP 320 FHD Webcam */
2118-
QUIRK_FLAG_GET_SAMPLE_RATE),
2118+
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
21192119
DEVICE_FLG(0x041e, 0x3000, /* Creative SB Extigy */
21202120
QUIRK_FLAG_IGNORE_CTL_ERROR),
21212121
DEVICE_FLG(0x041e, 0x4080, /* Creative Live Cam VF0610 */
21222122
QUIRK_FLAG_GET_SAMPLE_RATE),
21232123
DEVICE_FLG(0x045e, 0x083c, /* MS USB Link headset */
21242124
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY |
21252125
QUIRK_FLAG_DISABLE_AUTOSUSPEND),
2126+
DEVICE_FLG(0x046d, 0x0807, /* Logitech Webcam C500 */
2127+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2128+
DEVICE_FLG(0x046d, 0x0808, /* Logitech Webcam C600 */
2129+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2130+
DEVICE_FLG(0x046d, 0x0809,
2131+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2132+
DEVICE_FLG(0x046d, 0x0819, /* Logitech Webcam C210 */
2133+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2134+
DEVICE_FLG(0x046d, 0x081b, /* HD Webcam c310 */
2135+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2136+
DEVICE_FLG(0x046d, 0x081d, /* HD Webcam c510 */
2137+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2138+
DEVICE_FLG(0x046d, 0x0825, /* HD Webcam c270 */
2139+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
2140+
DEVICE_FLG(0x046d, 0x0826, /* HD Webcam c525 */
2141+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
21262142
DEVICE_FLG(0x046d, 0x084c, /* Logitech ConferenceCam Connect */
21272143
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_CTL_MSG_DELAY_1M),
2144+
DEVICE_FLG(0x046d, 0x08ca, /* Logitech Quickcam Fusion */
2145+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
21282146
DEVICE_FLG(0x046d, 0x0991, /* Logitech QuickCam Pro */
2129-
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR),
2147+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR |
2148+
QUIRK_FLAG_MIC_RES_384),
2149+
DEVICE_FLG(0x046d, 0x09a2, /* QuickCam Communicate Deluxe/S7500 */
2150+
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIC_RES_384),
21302151
DEVICE_FLG(0x046d, 0x09a4, /* Logitech QuickCam E 3500 */
21312152
QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_IGNORE_CTL_ERROR),
21322153
DEVICE_FLG(0x0499, 0x1509, /* Steinberg UR22 */
@@ -2194,7 +2215,7 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
21942215
DEVICE_FLG(0x0fd9, 0x0008, /* Hauppauge HVR-950Q */
21952216
QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
21962217
DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
2197-
QUIRK_FLAG_GET_SAMPLE_RATE),
2218+
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
21982219
DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
21992220
QUIRK_FLAG_GET_SAMPLE_RATE),
22002221
DEVICE_FLG(0x1397, 0x0507, /* Behringer UMC202HD */
@@ -2232,9 +2253,9 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
22322253
DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
22332254
QUIRK_FLAG_GET_SAMPLE_RATE),
22342255
DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
2235-
QUIRK_FLAG_GET_SAMPLE_RATE),
2256+
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
22362257
DEVICE_FLG(0x1bcf, 0x2283, /* NexiGo N930AF FHD Webcam */
2237-
QUIRK_FLAG_GET_SAMPLE_RATE),
2258+
QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
22382259
DEVICE_FLG(0x2040, 0x7200, /* Hauppauge HVR-950Q */
22392260
QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
22402261
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)