summaryrefslogtreecommitdiff
path: root/content/bsd/thinkpad/switching-between-speakers-and-headphones-on-freebsd.md
blob: f3179800e0410067b3a184ccbe1ea7da8feba67e (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
52
53
54
55
56
57
58
59
60
+++
title = "FreeBSD: Switching Between Speakers and Headphones"
author = ["Michał Sapka"]
date = 2023-03-16T23:02:00+01:00
categories = ["bsd"]
draft = false
weight = 3004
primary_menu = "bsd"
image_dir = "bsd"
image_max_width = 600
abstract = "How to change the audio sevices?"
[menu]
  [menu.bsd-thinkpad]
    weight = 3004
    identifier = "freebsd-switching-between-speakers-and-headphones"
    name = "Switching beteen headphnes and speakers"
+++

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:

```shell
$ cat /dev/sndstat
```

In the case of my ThinkPad, this returns

```shell
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:

```shell
# 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.