]> git.alsa-project.org Git - alsa-ucm-conf.git/commitdiff
Add UCM2 configuration for M-Audio Fast Track Ultra
authorValentin David <me@valentindavid.com>
Fri, 2 Jan 2026 12:19:48 +0000 (13:19 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 1 Apr 2026 14:12:08 +0000 (16:12 +0200)
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/672
Signed-off-by: Valentin David <me@valentindavid.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
ucm2/USB-Audio/M-Audio/Fast-Track-Ultra-HiFi.conf [new file with mode: 0644]
ucm2/USB-Audio/M-Audio/Fast-Track-Ultra.conf [new file with mode: 0644]
ucm2/USB-Audio/USB-Audio.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 (file)
index 0000000..fc0169c
--- /dev/null
@@ -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 (file)
index 0000000..6f6a552
--- /dev/null
@@ -0,0 +1,3 @@
+SectionUseCase."HiFi" {
+       File "/USB-Audio/M-Audio/Fast-Track-Ultra-HiFi.conf"
+}
index 59b0e531d6deab4e7e55682654255423df9e7bde..cdb1017af013cd223aa27d0e92698b7e72c7748b 100644 (file)
@@ -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
 #