Re: [PATCH 2/2] ALSA: usb-audio: Add quirk for Plantronics headsets to fix control names

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/25/24 1:25 AM, Takashi Iwai wrote:
> On Sun, 24 Nov 2024 21:32:41 +0100,
> Terry Junge wrote:
>>
>> Many Poly/Plantronics headset families name the feature, input,
>> and/or output units in a such a way to produce control names
>> that are not recognized by user space. As such, the volume and
>> mute events do not get routed to the headset's audio controls.
>>
>> As an example from a product family:
>>
>> The microphone mute control is named
>> Headset Microphone Capture Switch
>> and the headset volume control is named
>> Headset Earphone Playback Volume
>>
>> The quirk fixes these to become
>> Headset Capture Switch
>> Headset Playback Volume
>>
>> Signed-off-by: Terry Junge <linuxhid@xxxxxxxxxxxxxxxxxxxxxx>
> 
> Thanks, this description looks much more understandable now.
> Meanwhile...
> 
>> ---
>>  sound/usb/mixer_quirks.c | 35 +++++++++++++++++++++++++++++++++++
>>  1 file changed, 35 insertions(+)
>>
>> diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
>> index 8bbf070b3676..20d63efd5498 100644
>> --- a/sound/usb/mixer_quirks.c
>> +++ b/sound/usb/mixer_quirks.c
>> @@ -4215,6 +4215,37 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
>>  	}
>>  }
>>  
>> +static void snd_fix_plt_control_name(struct snd_kcontrol *kctl)
>> +{
>> +	static const char * const names_to_remove[] = {
>> +		"Earphone",
>> +		"Microphone",
>> +		"Receive",
>> +		"Transmit",
>> +		NULL
>> +	};
>> +	const char * const *n2r;
>> +	char *dst, *src;
>> +	size_t len;
>> +
>> +	for (n2r = names_to_remove; *n2r; ++n2r) {
>> +		dst = strstr(kctl->id.name, *n2r);
>> +		if (dst) {
>> +			src = dst + strlen(*n2r);
>> +			len = strlen(src) + 1;
>> +			if ((char *)kctl->id.name != dst && *(dst - 1) == ' ')
>> +				--dst;
>> +			memmove(dst, src, len);
>> +		}
>> +	}
>> +	if (kctl->id.name[0] == ' ') {
>> +		char rcat[sizeof(kctl->id.name)] = { "Headset" };
>> +
>> +		strlcat(rcat, kctl->id.name, sizeof(rcat));
>> +		strscpy(kctl->id.name, rcat, sizeof(kctl->id.name));
>> +	}
>> +}
> 
> ... the code itself isn't really trivial (due to the poor string
> handling by nature of C language), so it's better to put some brief
> comment what this function really does, too.

Thanks Takashi,

I'll comment the function in v2 and send it out.

> 
> 
> thanks,
> 
> Takashi





[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux