summaryrefslogtreecommitdiff
path: root/content/2023/switching-between-speakers-and-headphones-on-freebsd.md
blob: 05551696edec529260ab16b4cf4823b62af6ca22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
---
title: "Switching Between Speakers and Headphones on FreeBSD"
category: "software"
abstract: How to change the audio device?
date: 2023-03-16T22:52:01+01:00
year: 2023
draft: false
tags:
- FreeBSD
- headphones
- speakers
- ThinkPad
- audio
- tutorial
---
I want my laptop to switch to wired headphones when I attach them. FreeBSD has its own [Sound System](https://wiki.freebsd.org/Sound), 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.