Chromebook HP C101PAにインストールしたArchLinuxでサウンドがヘッドホン端子から出るようにする

Chromebook、最近デフォルトでLinux機能が使えるようになってきているが、
やっぱり若干微妙なところがあり、ネイティブにLinuxが動かしたくなった。

###インストール
ArchLinuxのARM向けサイトに公式なインストール手順があり、
https://archlinuxarm.org/platforms/armv8/rockchip/asus-chromebook-flip-c101pa
これに従い、MicroSDにインストールした。
（ただし、最後のMainline Kernelの手順をしてしまうとサスペンドからの復帰ができなくなったので、それはやらない事をおすすめ）

引き続き、本題とは関係ないが、使い慣れているMATEのGUI環境をインストールしたり設定したり。

```Console
# pacman -Sy
# pacman -S xorg-server mate mate-extra lightdm lightdm-gtk-greeter
# systemctl enable lightdm
# pacman -S networkmanager network-manager-applet
# systemctl enable NetworkManager
# pacman -S chromium noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra ibus-kkc
# timedatectl set-timezone Asia/Tokyo
```

###ヘッドホンから音が出ない問題
ここでさて何か聴きながら続きをやっていくか、と思ってchromiumでyoutubeを開いてみたところ、
ヘッドホンを挿しているのに、音が本体のスピーカーから出る。
私は基本的に音楽を聴きながら作業したい人間であるため、これでは不便。

###対応手順
自分がなんとかした手順を先に書くと、こう。
以下のファイルに以下の内容を書く。

```text:$HOME/.asoundrc
pcm.!default { 
 type plug 
 slave { 
   pcm "hw:0,2" 
 } 
} 
ctl.!default {
  type hw
  card 0
}
```

```text:$home/.profile
amixer sset "Headphone" on 28,28
amixer sset "Mic" on 5
amixer sset "ADC1" 51
amixer sset "Capture Digital" on
amixer sset "Playback Digital" on
amixer sset "Mixer In Mic" on
amixer sset "Mixer Out FilterL DACL" on
amixer sset "Mixer Out FilterR DACR" on
amixer sset "Mixin" on 11
amixer sset "Out DAIR Mux" ADC
amixer sset "Sto1 ADC MIXL DMIC" on
amixer sset "Sto1 ADC MIXR DMIC" on
```

再起動すると、音がヘッドホンから出るようになる。

`.profile`の`Headphone`、`ADC1`、`Mixin`の数値は要するにボリューム絡みなので
お好みに応じて値を上下させてもよい。

お断りを入れておくと、これをすると「ヘッドホン端子からのみ音が出る」ようになる。抜いても本体スピーカーからは出ない。
私の用途としてはそれで全く問題ないので、これでよしとしている。
また、多分音を聴く方だけなら、.profileの行の内「Mic」や「Capture」が含まれる行は必要ないかもしれない。

---
###調べた手順

```aplay -l```を実行してみると、以下のような結果になる。

```text
**** List of PLAYBACK Hardware Devices ****
card 0: rk3399grusound [rk3399-gru-sound], device 0: MAX98357A PCM HiFi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: rk3399grusound [rk3399-gru-sound], device 2: DA7219 PCM da7219-hifi-2 []
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: rk3399grusound [rk3399-gru-sound], device 3: DP PCM i2s-hifi-3 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```
これはChromeOS側のシェルでも同様の結果となった。

そこでChromeOS側で、サンプルの無圧縮pcmのwaveファイルを用意して以下を試してみたところ、

```Console
$ aplay --device=hw:0,0 test.wav
$ aplay --device=hw:0,2 test.wav
```
後者の方で、ヘッドホンから音が鳴った。

```cat /proc/asound/pcm``` としてみたところ、こう。

```text
00-00: MAX98357A PCM HiFi-0 :  : playback 1
00-01: RT5514 PCM rt5514-aif1-1 :  : capture 1
00-02: DA7219 PCM da7219-hifi-2 :  : playback 1 : capture 1
00-03: DP PCM i2s-hifi-3 :  : playback 1
00-04: Wake on Voice snd-soc-dummy-dai-4 :  : capture 1
```

DA7219、というものがplayback 1: capture 1となっており、
ここから、これはマイク付きヘッドホン端子を意味している、と考えた。
であれば、一つ手前のaplayの確認で0,2の方で音が鳴った事も説明がつく。

しかし、ArchLinuxでは同じく`aplay --device=hw:0,2`としても音が出ない。
そこで、おそらく`alsamixer`で大量に並ぶパラメータのどこかにポイントがあるのではないか、とアタリをつけ、
以下のコマンドをChromeOSとArchLinux両方で実行した結果を比較し、
それを一致させてみようと考えた。

```
$ amixer 
```

結果が異なっている箇所を、音が鳴るChromeOS側の設定に寄せて変更していったところ、ArchLinuxを起動した後のデフォルト状態から

- Headphone
- Playback Digital
- Mixer Out FilterL DACL
- Mixer Out FilterR DACR

これらをON（alsamixerでは非ミュート状態）にすることで、`aplay --device=hw:0,2`で音が鳴るようにすることができた。
この設定変更を行うのが、上記の`.profile`の記述となる。

しかしそれで音が鳴ったからといって、あくまでそれはDA7219の方を指定した場合であり、
まだchromiumなどからの音は、デフォルトのMAX98357Aの方に流れてしまう。
そこで次に、ALSAの設定により、デフォルトをDA7219の方にした。
その設定が、上記の`.asoundrc`での記述となる。

###補記
私はALSAなりLinuxのサウンドシステムには全く詳しくないため、
ひょっとすると設定を入れる箇所としてはもっと良い箇所があるのかもしれない。

何となくではあるが、今回手動で設定したような事をする処理はもう入っていて、
ただそれが「ヘッドホンの抜き差しで動作する」というそのイベントだけが
うまく起きていない、という気はしないでもない。
ただ、先に述べたように私が望む動作までにはなったので、一旦よしとしている。

また、pulseaudioなどが絡むとまたさらに話が違ってくる可能性はある。
それが必要になった場合は、またその時に考えることとする。