I want my laptop to switch to wired headphones when I attach them. FreeBSD has its own Sound System, so it’s a great learning experience. I have yet to automate it (it is possible, but an attempt to do so forced me to do a complete rollback of the system state), but for now, this is working.
First, check which audio outputs your device supports:
$ cat /dev/sndstat
In the case of my ThinkPad, this returns
Installed devices:
pcm0: <NVIDIA (0x0094) (HDMI/DP 8ch)> (play)
pcm1: <NVIDIA (0x0094) (HDMI/DP 8ch)> (play)
pcm2: <NVIDIA (0x0094) (HDMI/DP 8ch)> (play)
pcm3: <Conexant (0x1f86) (Analog)> (play/rec) default
pcm4: <Conexant (0x1f86) (Left Analog Headphones)> (play)
No devices installed from userspace.
The ones I care about are: pcm3 - the speakers pcm4 - the headphone jack
I can now easily switch between them:
# enable speakers
$ sysctl hw.snd.default_unit=3
# enable headphones
$ sysctl hw.snd.default_unit=4
(replace the value with the correct id from sndstat
file.)
This, however, comes with a huge caveat. Some apps (khem khem, Firefox) not native to FreeBSD come configured with PulseAudio instead of FreeBSD’s Sound System. This creates a level of indirection, and changing system output may not work instantly. In the case of Firefox, I need to reload the tab. Some apps, as I’ve heard, require a restart.