All of lore.kernel.org
 help / color / mirror / Atom feed
* M-Audio FT C600 - driver missing control for disabling the Output Gain Knob
@ 2026-05-01 20:10 simon
  2026-05-01 21:11 ` Olivia Mackintosh
  0 siblings, 1 reply; 5+ messages in thread
From: simon @ 2026-05-01 20:10 UTC (permalink / raw)
  To: alsa-devel; +Cc: eldad, matthew.gruskin

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

Hi all,
I recently thrifted a C600 for a bargain price, and happily most of the 
functionality is working fine. I did notice a couple of controls (as 
seen in Windows app) are not presented under Linux.

There is the ability to disable the large Output Gain Knob (on right 
side of the device), which by defaults controls all of the stereo 
outputs (1/2, 3/4, 5/6).

Snooping the USB bus under Windows I see there is a USB packet sent with 
a bit mapped values to disable gain control of each stereo output. 
Wireshark Caps available if needed/wanted.

I suspect this is a moderately easy fix, and likely applies to the C400 
as well. Happy to work with/test patches to get this implement, but I'm 
not experienced with building ALSA.

Cheers,
Simon.

[-- Attachment #2: C600_out12_volume_off.PNG --]
[-- Type: image/png, Size: 57215 bytes --]

[-- Attachment #3: C600_out12_volume_on.PNG --]
[-- Type: image/png, Size: 57612 bytes --]

[-- Attachment #4: C600_disable_knob_level_control.PNG --]
[-- Type: image/png, Size: 27835 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: M-Audio FT C600 - driver missing control for disabling the Output Gain Knob
  2026-05-01 20:10 M-Audio FT C600 - driver missing control for disabling the Output Gain Knob simon
@ 2026-05-01 21:11 ` Olivia Mackintosh
  2026-05-02 18:19   ` simon
  0 siblings, 1 reply; 5+ messages in thread
From: Olivia Mackintosh @ 2026-05-01 21:11 UTC (permalink / raw)
  To: alsa-devel; +Cc: simon

On Fri, May 01, 2026 at 04:10:51PM -0400, simon@mungewell.org wrote:
> Hi all,
> I recently thrifted a C600 for a bargain price, and happily most of the
> functionality is working fine. I did notice a couple of controls (as seen in
> Windows app) are not presented under Linux.
> 
> There is the ability to disable the large Output Gain Knob (on right side of
> the device), which by defaults controls all of the stereo outputs (1/2, 3/4,
> 5/6).
> 
> Snooping the USB bus under Windows I see there is a USB packet sent with a
> bit mapped values to disable gain control of each stereo output. Wireshark
> Caps available if needed/wanted.
> 
> I suspect this is a moderately easy fix, and likely applies to the C400 as
> well. Happy to work with/test patches to get this implement, but I'm not
> experienced with building ALSA.
> 
> Cheers,
> Simon.

Hi Simon,

Congratuations on the thrift! Happy to help where I can as I have some
experience with making alsa controls. You're on the right track having
captured the control values.

There seems to already be c400 controls set up in the mixer_quirks.c
file, so it should be fairly straightforward to adapt this to also
support the c600.

Let me know if you need support in any way.

Olivia


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: M-Audio FT C600 - driver missing control for disabling the Output Gain Knob
  2026-05-01 21:11 ` Olivia Mackintosh
@ 2026-05-02 18:19   ` simon
  2026-05-03 23:13     ` RFC: M-Audio FT C600 - " simon
  0 siblings, 1 reply; 5+ messages in thread
From: simon @ 2026-05-02 18:19 UTC (permalink / raw)
  To: livvy; +Cc: alsa-devel

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

On 2026-05-01 17:11, Olivia Mackintosh wrote:

> There seems to already be c400 controls set up in the mixer_quirks.c
> file, so it should be fairly straightforward to adapt this to also
> support the c600.

Thanks for the pointer, I've had a look and it seems that way the 
'effect type' is set would be a good reference to clone/modify.

https://github.com/torvalds/linux/blob/master/sound/usb/mixer_quirks.c#L1302

I jumped back into Windows and captured changing the effect type which 
does a similar thing on the USB bus, though I did note that 'bRequest' 
is different and I don't understand why - and of course the 
'wValue/wIndex' are too.

Pulling down the Kernel source, so I can build locally.
Simon


[-- Attachment #2: C600_effect_vs_output_gain_knob.png --]
[-- Type: image/png, Size: 55133 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RFC: M-Audio FT C600 - control for disabling the Output Gain Knob
  2026-05-02 18:19   ` simon
@ 2026-05-03 23:13     ` simon
  2026-05-04 19:07       ` Olivia Mackintosh
  0 siblings, 1 reply; 5+ messages in thread
From: simon @ 2026-05-03 23:13 UTC (permalink / raw)
  To: alsa-devel; +Cc: Eldad Zack

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

Hi all,
Managed to pull a small patch together to enabling/disabling the Output 
Gain Knob, as is done in the Windows driver/control application. The 
outputs act in stereo pairs (1/2, 3/4, 5/6), the device defaults to all 
'adjusted' with the knob and you can now select any combination (or 
none).

This code likely works on the C400 as well, but I do not have that 
device to test/confirm. Tested against Linux 6.8.0, as that's what I run 
locally.

I can formally sign/submit a patch if there's no comments. Is that done 
here or on the kernel mailing lists?
Cheers,
Simon.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: c600_out_gain_knob_disable.patch --]
[-- Type: text/x-diff; name=c600_out_gain_knob_disable.patch, Size: 2540 bytes --]

diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
index 065a4be0d771..1ec98716c871 100644
--- a/sound/usb/mixer_quirks.c
+++ b/sound/usb/mixer_quirks.c
@@ -1042,7 +1042,7 @@ static int snd_ftu_eff_switch_init(struct usb_mixer_interface *mixer,
 
 	err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC_GET_CUR,
 			      USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
-			      pval & 0xff00,
+			      (pval & 0xff00) | ((pval & 0xff0000) >> 16),
 			      snd_usb_ctrl_intf(mixer->chip) | ((pval & 0xff) << 8),
 			      value, 2);
 	if (err < 0)
@@ -1076,7 +1076,7 @@ static int snd_ftu_eff_switch_update(struct usb_mixer_elem_list *list)
 			      usb_sndctrlpipe(chip->dev, 0),
 			      UAC_SET_CUR,
 			      USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
-			      pval & 0xff00,
+			      (pval & 0xff00) | ((pval & 0xff0000) >> 16),
 			      snd_usb_ctrl_intf(chip) | ((pval & 0xff) << 8),
 			      value, 2);
 	snd_usb_unlock_shutdown(chip);
@@ -1491,6 +1491,44 @@ static int snd_c400_create_effect_ret_vol_ctls(struct usb_mixer_interface *mixer
 	return 0;
 }
 
+/* output gain knob selectively adjusts outputs as stereo pairs */
+/* reuses functions from FTU effect switch */
+static int snd_c400_knob_switch_info(struct snd_kcontrol *kcontrol,
+					struct snd_ctl_elem_info *uinfo)
+{
+	static const char *const texts[8] = {
+		"None", "1/2", "3/4", "1/2 3/4",
+		"5/6", "1/2 5/6", "3/4 5/6", "1/2 3/4 5/6"
+	};
+
+	return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(texts), texts);
+}
+
+static int snd_c400_create_knob_switch(struct usb_mixer_interface *mixer,
+	int validx, int bUnitID)
+{
+	static struct snd_kcontrol_new template = {
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "Output Gain Knob",
+		.index = 0,
+		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+		.info = snd_c400_knob_switch_info,
+		.get = snd_ftu_eff_switch_get,
+		.put = snd_ftu_eff_switch_put
+	};
+	struct usb_mixer_elem_list *list;
+	int err;
+
+	err = add_single_ctl_with_resume(mixer, bUnitID,
+					 snd_ftu_eff_switch_update,
+					 &template, &list);
+	if (err < 0)
+		return err;
+	list->kctl->private_value = (validx << 8) | bUnitID;
+	snd_ftu_eff_switch_init(mixer, list->kctl);
+	return 0;
+}
+
 static int snd_c400_create_mixer(struct usb_mixer_interface *mixer)
 {
 	int err;
@@ -1523,6 +1561,10 @@ static int snd_c400_create_mixer(struct usb_mixer_interface *mixer)
 	if (err < 0)
 		return err;
 
+	err = snd_c400_create_knob_switch(mixer, 0x0900, 0x20);
+	if (err < 0)
+		return err;
+
 	return 0;
 }
 

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: RFC: M-Audio FT C600 - control for disabling the Output Gain Knob
  2026-05-03 23:13     ` RFC: M-Audio FT C600 - " simon
@ 2026-05-04 19:07       ` Olivia Mackintosh
  0 siblings, 0 replies; 5+ messages in thread
From: Olivia Mackintosh @ 2026-05-04 19:07 UTC (permalink / raw)
  To: simon, alsa-devel; +Cc: Eldad Zack

> I can formally sign/submit a patch if there's no comments. Is that done 
> here or on the kernel mailing lists?

You can submit patch here following
    https://kernel.org/doc/html/latest/process/submitting-patches.html

but it would be best to rebase/test against the tiwai/sound tree :)
    https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git/

Regards,
Olivia

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-05-04 19:08 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-01 20:10 M-Audio FT C600 - driver missing control for disabling the Output Gain Knob simon
2026-05-01 21:11 ` Olivia Mackintosh
2026-05-02 18:19   ` simon
2026-05-03 23:13     ` RFC: M-Audio FT C600 - " simon
2026-05-04 19:07       ` Olivia Mackintosh

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.