Raspberry Pi CM3でJUCE開発 #2 I2Sでオーディオ入出力
このコーデックはI2Cなどで設定する方式では無く、ピン論理でI2SのMaster/Slave, サンプルレートなどを決められるので使いやすい。
RasPiからI2SのMCLKは出せないので、UMB-AK4556-AをI2S Masterに、RasPiをSlaveにしてJUCEからオーディオ入出力を確認したい。
I2Sを有効化
/boot/config.txtのi2sオプションをonに変更。
code:/boot/config.txt
#Uncomment some or all of these to enable the optional hardware interfaces dtparam=i2s=on
とI2Sのコメントアウトを外す。
I2S以外の内蔵オーディオ入出力を無効化
内蔵オーディオ入出力(HDMIオーディオ出力等)を無効化は、同じく/boot/config.txtの
code:/boot/config.txt
enable_uart=0
と、dtparam=audio=onをコメントアウトする。
Device tree overlay
筆者はLinuxデバイスドライバーに詳しくなく、間違いが含まれている可能性があります。
Device treeとは?
Linuxデバイスドライバをより汎用的なものにするための仕組み。
ドライバにはハードウェアの制御についてのみ記述するべきで、ハードウェア依存のもの(ピンなど)は記述するべきではない。
ハードウェアのプロパティを記述するのがデバイスツリー。
デバイスツリーを使用すると
RasPiで汎用的にI2Sを扱えるドライバを使用して、Device treeのみ記述することでオーディオコーデックと通信できるようにする
ということができます。
使えそうなドライバを調べると、
simple-audio-cardドライバと、
なお、デバイスツリー作成法及びRasPiでの使用法は、
Device Tree Source(.dts)を記述し、Device Tree Compiler(dtcコマンド)でコンパイルするとDevice Tree Blob(.dtbo)というバイナリが出来るので、それを/boot/overlaysにコピーし、それを使うことを/boot/config.txtに記述します。
リポジトリ
genericstereoaudiocodec.dtsをコンパイルし、Device Tree Blobを作成します。
DTCでコンパイル
code:console
$ dtc -@ -H epapr -O dtb -o genericstereoaudiocodec.dtbo -Wno-unit_address_vs_reg genericstereoaudiocodec.dts
/boot/overlaysにコピー
code:console
$ sudo cp genericstereoaudiocodec.dtbo /boot/overlays
/boot/config.txtに以下を追加
code:/boot/config.txt
dtoverlay=genericstereoaudiocodec
再起動し、サウンドデバイスが認識されているかを確認
コンソールで、
出力デバイス
code:console
$ aplay -l
入力デバイス
code:console
$ arecord -l
でどちらもGenericStereoAudioのデバイスが出てくるはずです。
RasPi CM3とUMB-AK4556-Aを接続
18: PCM CLK(Bit clock)
19: PCM_FS(LR clock)
20: PCM_DIN (Data in)
21: PCM_DOUT(Data out)
UMB-AK4556はP1コネクタの
9: SDTO
10: SDTI
11: LRCLK
12: BCLK
つまりRasPi CM3とUMB-AK4556とを
RasPi GPIO18 <> UMB-AK4556 P1 12
RasPi GPIO19 <> UMB-AK4556 P1 11
RasPi GPIO20 <> UMB-AK4556 P1 9
RasPi GPIO21 <> UMB-AK4556 P1 10
のようにジャンパーで接続する。
AudioPluginHostで入出力をスルーする
code:console
$ cd JUCE/extras/AudioPluginHost/Builds/LinuxMakefile/build
$ ./AudioPluginHost
でAudioPluginHostを起動。
Audio OutputかAuido Inputをダブルクリックするとオーディオ設定が立ち上がるので、
Sample rate: 48000 Hz
Output: GenericStereoAudioCodec, ; Direct hardware device without any convertioons
Input: GenericStereoAudioCode, ; Direct sample snooping device
に設定する(Audio buffer sizeはお好みで)。
https://gyazo.com/1f5319c243f7b6070c076e3cffb82899
Audio InputとAudio Outputを直結し、UMB-AK4556のオーディオ入力に適当な音声を入力し、オーディオ出力をスピーカーに繋げると入力をI2S変換した音声がAudioPluginHost内でスルーされて出力される。
https://gyazo.com/bdb45001333088f6446ff7232ae4c237
次回はVNCや各種aliasの設定について
参考