From 27d3b4564d65f3059f3262187fab2d1ff6f7d854 Mon Sep 17 00:00:00 2001 From: Valentin David Date: Fri, 2 Jan 2026 13:19:48 +0100 Subject: [PATCH] Add UCM2 configuration for M-Audio Fast Track Ultra Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/672 Signed-off-by: Valentin David Signed-off-by: Jaroslav Kysela --- .../M-Audio/Fast-Track-Ultra-HiFi.conf | 400 ++++++++++++++++++ ucm2/USB-Audio/M-Audio/Fast-Track-Ultra.conf | 3 + ucm2/USB-Audio/USB-Audio.conf | 12 + 3 files changed, 415 insertions(+) create mode 100644 ucm2/USB-Audio/M-Audio/Fast-Track-Ultra-HiFi.conf create mode 100644 ucm2/USB-Audio/M-Audio/Fast-Track-Ultra.conf diff --git a/ucm2/USB-Audio/M-Audio/Fast-Track-Ultra-HiFi.conf b/ucm2/USB-Audio/M-Audio/Fast-Track-Ultra-HiFi.conf new file mode 100644 index 0000000..fc0169c --- /dev/null +++ b/ucm2/USB-Audio/M-Audio/Fast-Track-Ultra-HiFi.conf @@ -0,0 +1,400 @@ +Include.pcm_split.File "/common/pcm/split.conf" + +Macro [ + { + SplitPCM { + Name "fast_track_ultra_stereo_out" + Direction Playback + Channels 2 + HWChannels 8 + HWChannelPos0 FL + HWChannelPos1 FR + HWChannelPos2 FL + HWChannelPos3 FR + HWChannelPos4 FL + HWChannelPos5 FR + HWChannelPos6 FL + HWChannelPos7 FR + } + } + { + SplitPCM { + Name "fast_track_ultra_mixed_in" + Direction Capture + Channels 1 + HWChannels 8 + HWChannelPos0 MONO + HWChannelPos1 MONO + HWChannelPos2 MONO + HWChannelPos3 MONO + HWChannelPos4 FL + HWChannelPos5 FR + HWChannelPos6 FL + HWChannelPos7 FR + } + } +] + +SectionVerb { + EnableSequence [ + # Fast Track Ultra is also a mixer. + # When every volume 100%, it sends everything + # everywhere, including through the effect + # processor. So we need to zero everything we + # do not use. + # + # Note that 'AInX - OutY Capture' are not + # really capture, but input monitoring. + # There is no hardware volume control for the captures + # other than the physical potentiometers on the device. + + cset "name='AIn1 - Out1 Capture Volume' 0%" + cset "name='AIn2 - Out1 Capture Volume' 0%" + cset "name='AIn3 - Out1 Capture Volume' 0%" + cset "name='AIn4 - Out1 Capture Volume' 0%" + cset "name='AIn5 - Out1 Capture Volume' 0%" + cset "name='AIn6 - Out1 Capture Volume' 0%" + cset "name='AIn7 - Out1 Capture Volume' 0%" + cset "name='AIn8 - Out1 Capture Volume' 0%" + + cset "name='AIn1 - Out2 Capture Volume' 0%" + cset "name='AIn2 - Out2 Capture Volume' 0%" + cset "name='AIn3 - Out2 Capture Volume' 0%" + cset "name='AIn4 - Out2 Capture Volume' 0%" + cset "name='AIn5 - Out2 Capture Volume' 0%" + cset "name='AIn6 - Out2 Capture Volume' 0%" + cset "name='AIn7 - Out2 Capture Volume' 0%" + cset "name='AIn8 - Out2 Capture Volume' 0%" + + cset "name='AIn1 - Out3 Capture Volume' 0%" + cset "name='AIn2 - Out3 Capture Volume' 0%" + cset "name='AIn3 - Out3 Capture Volume' 0%" + cset "name='AIn4 - Out3 Capture Volume' 0%" + cset "name='AIn5 - Out3 Capture Volume' 0%" + cset "name='AIn6 - Out3 Capture Volume' 0%" + cset "name='AIn7 - Out3 Capture Volume' 0%" + cset "name='AIn8 - Out3 Capture Volume' 0%" + + cset "name='AIn1 - Out4 Capture Volume' 0%" + cset "name='AIn2 - Out4 Capture Volume' 0%" + cset "name='AIn3 - Out4 Capture Volume' 0%" + cset "name='AIn4 - Out4 Capture Volume' 0%" + cset "name='AIn5 - Out4 Capture Volume' 0%" + cset "name='AIn6 - Out4 Capture Volume' 0%" + cset "name='AIn7 - Out4 Capture Volume' 0%" + cset "name='AIn8 - Out4 Capture Volume' 0%" + + cset "name='AIn1 - Out5 Capture Volume' 0%" + cset "name='AIn2 - Out5 Capture Volume' 0%" + cset "name='AIn3 - Out5 Capture Volume' 0%" + cset "name='AIn4 - Out5 Capture Volume' 0%" + cset "name='AIn5 - Out5 Capture Volume' 0%" + cset "name='AIn6 - Out5 Capture Volume' 0%" + cset "name='AIn7 - Out5 Capture Volume' 0%" + cset "name='AIn8 - Out5 Capture Volume' 0%" + + cset "name='AIn1 - Out6 Capture Volume' 0%" + cset "name='AIn2 - Out6 Capture Volume' 0%" + cset "name='AIn3 - Out6 Capture Volume' 0%" + cset "name='AIn4 - Out6 Capture Volume' 0%" + cset "name='AIn5 - Out6 Capture Volume' 0%" + cset "name='AIn6 - Out6 Capture Volume' 0%" + cset "name='AIn7 - Out6 Capture Volume' 0%" + cset "name='AIn8 - Out6 Capture Volume' 0%" + + cset "name='AIn1 - Out7 Capture Volume' 0%" + cset "name='AIn2 - Out7 Capture Volume' 0%" + cset "name='AIn3 - Out7 Capture Volume' 0%" + cset "name='AIn4 - Out7 Capture Volume' 0%" + cset "name='AIn5 - Out7 Capture Volume' 0%" + cset "name='AIn6 - Out7 Capture Volume' 0%" + cset "name='AIn7 - Out7 Capture Volume' 0%" + cset "name='AIn8 - Out7 Capture Volume' 0%" + + cset "name='AIn1 - Out8 Capture Volume' 0%" + cset "name='AIn2 - Out8 Capture Volume' 0%" + cset "name='AIn3 - Out8 Capture Volume' 0%" + cset "name='AIn4 - Out8 Capture Volume' 0%" + cset "name='AIn5 - Out8 Capture Volume' 0%" + cset "name='AIn6 - Out8 Capture Volume' 0%" + cset "name='AIn7 - Out8 Capture Volume' 0%" + cset "name='AIn8 - Out8 Capture Volume' 0%" + + cset "name='DIn1 - Out2 Playback Volume' 0%" + cset "name='DIn1 - Out3 Playback Volume' 0%" + cset "name='DIn1 - Out4 Playback Volume' 0%" + cset "name='DIn1 - Out5 Playback Volume' 0%" + cset "name='DIn1 - Out6 Playback Volume' 0%" + cset "name='DIn1 - Out7 Playback Volume' 0%" + cset "name='DIn1 - Out8 Playback Volume' 0%" + + cset "name='DIn2 - Out1 Playback Volume' 0%" + cset "name='DIn2 - Out3 Playback Volume' 0%" + cset "name='DIn2 - Out4 Playback Volume' 0%" + cset "name='DIn2 - Out5 Playback Volume' 0%" + cset "name='DIn2 - Out6 Playback Volume' 0%" + cset "name='DIn2 - Out7 Playback Volume' 0%" + cset "name='DIn2 - Out8 Playback Volume' 0%" + + cset "name='DIn3 - Out1 Playback Volume' 0%" + cset "name='DIn3 - Out2 Playback Volume' 0%" + cset "name='DIn3 - Out4 Playback Volume' 0%" + cset "name='DIn3 - Out5 Playback Volume' 0%" + cset "name='DIn3 - Out6 Playback Volume' 0%" + cset "name='DIn3 - Out7 Playback Volume' 0%" + cset "name='DIn3 - Out8 Playback Volume' 0%" + + cset "name='DIn4 - Out1 Playback Volume' 0%" + cset "name='DIn4 - Out2 Playback Volume' 0%" + cset "name='DIn4 - Out3 Playback Volume' 0%" + cset "name='DIn4 - Out5 Playback Volume' 0%" + cset "name='DIn4 - Out6 Playback Volume' 0%" + cset "name='DIn4 - Out7 Playback Volume' 0%" + cset "name='DIn4 - Out8 Playback Volume' 0%" + + cset "name='DIn5 - Out1 Playback Volume' 0%" + cset "name='DIn5 - Out2 Playback Volume' 0%" + cset "name='DIn5 - Out3 Playback Volume' 0%" + cset "name='DIn5 - Out4 Playback Volume' 0%" + cset "name='DIn5 - Out6 Playback Volume' 0%" + cset "name='DIn5 - Out7 Playback Volume' 0%" + cset "name='DIn5 - Out8 Playback Volume' 0%" + + cset "name='DIn6 - Out1 Playback Volume' 0%" + cset "name='DIn6 - Out2 Playback Volume' 0%" + cset "name='DIn6 - Out3 Playback Volume' 0%" + cset "name='DIn6 - Out4 Playback Volume' 0%" + cset "name='DIn6 - Out5 Playback Volume' 0%" + cset "name='DIn6 - Out7 Playback Volume' 0%" + cset "name='DIn6 - Out8 Playback Volume' 0%" + + cset "name='DIn7 - Out1 Playback Volume' 0%" + cset "name='DIn7 - Out2 Playback Volume' 0%" + cset "name='DIn7 - Out3 Playback Volume' 0%" + cset "name='DIn7 - Out4 Playback Volume' 0%" + cset "name='DIn7 - Out5 Playback Volume' 0%" + cset "name='DIn7 - Out6 Playback Volume' 0%" + cset "name='DIn7 - Out8 Playback Volume' 0%" + + cset "name='DIn8 - Out1 Playback Volume' 0%" + cset "name='DIn8 - Out2 Playback Volume' 0%" + cset "name='DIn8 - Out3 Playback Volume' 0%" + cset "name='DIn8 - Out4 Playback Volume' 0%" + cset "name='DIn8 - Out5 Playback Volume' 0%" + cset "name='DIn8 - Out6 Playback Volume' 0%" + cset "name='DIn8 - Out7 Playback Volume' 0%" + + cset "name='Effect Send AIn1 Volume' 0%" + cset "name='Effect Send AIn2 Volume' 0%" + cset "name='Effect Send AIn3 Volume' 0%" + cset "name='Effect Send AIn4 Volume' 0%" + cset "name='Effect Send AIn5 Volume' 0%" + cset "name='Effect Send AIn6 Volume' 0%" + cset "name='Effect Send AIn7 Volume' 0%" + cset "name='Effect Send AIn8 Volume' 0%" + + cset "name='Effect Send DIn1 Volume' 0%" + cset "name='Effect Send DIn2 Volume' 0%" + cset "name='Effect Send DIn3 Volume' 0%" + cset "name='Effect Send DIn4 Volume' 0%" + cset "name='Effect Send DIn5 Volume' 0%" + cset "name='Effect Send DIn6 Volume' 0%" + cset "name='Effect Send DIn7 Volume' 0%" + cset "name='Effect Send DIn8 Volume' 0%" + + cset "name='Effect Return 1 Volume' 0%" + cset "name='Effect Return 2 Volume' 0%" + cset "name='Effect Return 3 Volume' 0%" + cset "name='Effect Return 4 Volume' 0%" + ] +} + +LibraryConfig.remap.Config { + ctl.default.map."name='Line1 Playback Volume'" { + "name='DIn1 - Out1 Playback Volume'".vindex.0 0 + "name='DIn2 - Out2 Playback Volume'".vindex.1 0 + } +} + +LibraryConfig.remap.Config { + ctl.default.map."name='Line2 Playback Volume'" { + "name='DIn3 - Out3 Playback Volume'".vindex.0 0 + "name='DIn4 - Out4 Playback Volume'".vindex.1 0 + } +} + +LibraryConfig.remap.Config { + ctl.default.map."name='Line3 Playback Volume'" { + "name='DIn5 - Out5 Playback Volume'".vindex.0 0 + "name='DIn6 - Out6 Playback Volume'".vindex.1 0 + } +} + +LibraryConfig.remap.Config { + ctl.default.map."name='Line4 Playback Volume'" { + "name='DIn7 - Out7 Playback Volume'".vindex.0 0 + "name='DIn8 - Out8 Playback Volume'".vindex.1 0 + } +} + +SectionDevice."Line1" { + Comment "Stereo Output 1/2 (Main - Headphones 1)" + + Macro.pcm_split.SplitPCMDevice { + Name "fasttrackultra_stereo_out" + Direction Playback + HWChannels 8 + Channels 2 + Channel0 0 + Channel1 1 + ChannelPos0 FL + ChannelPos1 FR + } + Value { + PlaybackMixer "default:${CardId}" + PlaybackMixerElem "Line1" + } +} + +SectionDevice."Line2" { + Comment "Stereo Output 3/4 (Headphones 2)" + + Macro.pcm_split.SplitPCMDevice { + Name "fast_track_ultra_stereo_out" + Direction Playback + HWChannels 8 + Channels 2 + Channel0 2 + Channel1 3 + ChannelPos0 FL + ChannelPos1 FR + } + Value { + PlaybackMixer "default:${CardId}" + PlaybackMixerElem "Line2" + } +} + +SectionDevice."Line3" { + Comment "Stereo Output 5/6" + + Macro.pcm_split.SplitPCMDevice { + Name "fast_track_ultra_stereo_out" + Direction Playback + HWChannels 8 + Channels 2 + Channel0 4 + Channel1 5 + ChannelPos0 FL + ChannelPos1 FR + } + Value { + PlaybackMixer "default:${CardId}" + PlaybackMixerElem "Line3" + } +} + +SectionDevice."Line4" { + Comment "Stereo Output 7/8 (S/PDIF)" + + Macro.pcm_split.SplitPCMDevice { + Name "fast_track_ultra_stereo_out" + Direction Playback + HWChannels 8 + Channels 2 + Channel0 6 + Channel1 7 + ChannelPos0 FL + ChannelPos1 FR + } + Value { + PlaybackMixer "default:${CardId}" + PlaybackMixerElem "Line4" + } +} + +# A typical use case is the use 4 front facing inputs as mono inputs +# and then use 5/6 from the TRS input from the back (probably stereo). +# 7/8 is only connected to S/PDIF so almost always stereo. + +SectionDevice."Mic1" { + Comment "Input 1" + + Macro.pcm_split.SplitPCMDevice { + Name "fast_track_ultra_mixed_in" + Direction Capture + HWChannels 8 + Channels 1 + Channel0 0 + ChannelPos0 MONO + } +} + +SectionDevice."Mic2" { + Comment "Input 2" + + Macro.pcm_split.SplitPCMDevice { + Name "fast_track_ultra_mixed_in" + Direction Capture + HWChannels 8 + Channels 1 + Channel0 1 + ChannelPos0 MONO + } +} + +SectionDevice."Mic3" { + Comment "Input 3" + + Macro.pcm_split.SplitPCMDevice { + Name "fast_track_ultra_mixed_in" + Direction Capture + HWChannels 8 + Channels 1 + Channel0 2 + ChannelPos0 MONO + } +} + +SectionDevice."Mic4" { + Comment "Input 4" + + Macro.pcm_split.SplitPCMDevice { + Name "fast_track_ultra_mixed_in" + Direction Capture + HWChannels 8 + Channels 1 + Channel0 3 + ChannelPos0 MONO + } +} + +SectionDevice."Line56" { + Comment "Input 5/6" + + Macro.pcm_split.SplitPCMDevice { + Name "fast_track_ultra_mixed_in" + Direction Capture + HWChannels 8 + Channels 2 + Channel0 4 + Channel1 5 + ChannelPos0 FL + ChannelPos1 FR + } +} + +SectionDevice."SPDIF78" { + Comment "Input 7/8 (S/PDIF)" + + Macro.pcm_split.SplitPCMDevice { + Name "fast_track_ultra_mixed_in" + Direction Capture + HWChannels 8 + Channels 2 + Channel0 6 + Channel1 7 + ChannelPos0 FL + ChannelPos1 FR + } +} diff --git a/ucm2/USB-Audio/M-Audio/Fast-Track-Ultra.conf b/ucm2/USB-Audio/M-Audio/Fast-Track-Ultra.conf new file mode 100644 index 0000000..6f6a552 --- /dev/null +++ b/ucm2/USB-Audio/M-Audio/Fast-Track-Ultra.conf @@ -0,0 +1,3 @@ +SectionUseCase."HiFi" { + File "/USB-Audio/M-Audio/Fast-Track-Ultra-HiFi.conf" +} diff --git a/ucm2/USB-Audio/USB-Audio.conf b/ucm2/USB-Audio/USB-Audio.conf index 59b0e53..cdb1017 100644 --- a/ucm2/USB-Audio/USB-Audio.conf +++ b/ucm2/USB-Audio/USB-Audio.conf @@ -267,6 +267,18 @@ Macro.ssl2.RegexMatch "Id='31e9:000[1289]' Profile='SolidStateLabs/SSL2'" Macro.beacn-mic.StringMatch "Id='33ae:0001' Profile='Beacn/Beacn-Mic'" Macro.beacn-studio.RegexMatch "Id='33ae:[04]003' Profile='Beacn/Beacn-Studio'" +If.maudio-fast-track-ultra { + Condition { + Type String + Haystack "${CardComponents}" + Needle "USB0763:2080" + } + True.Define { + ProfileName "M-Audio/Fast-Track-Ultra" + MixerRemap yes + } +} + # # end of device specific configuration block # -- 2.52.0