iOS端末をPulseAudioのDACにする
ためにアプリを書いた (まだ公開していない)
localhostでTCPをlistenする
iOS端末のマイクを float32 48KHz 1 channel で送信し
受信したデータをiOS端末のスピーカーを float32 48Khz 2 channels で再生する
なんでそんなことしてんの?
あとなんかイヤホンの出力も使えない
まあ iOS アプリでやってもいいけどミュートとか Linux 内でやりたい
iPad が古い世代なのでDiscordアプリが不安定というのもある
これと iproxy を組み合わせると USB 経由で音声の転送ができる まあ別に Wi-Fi 経由でやってもいいけどもちろん電波状況に影響を受ける
電池とかのことを考えると USB はデータ転送も充電も同時にできるので理想的
PulseAudio側では module-simple-protocol を使う
設定
code:setup.sh
pactl load-module module-simple-protocol-tcp rate=48000 format=float32le channels=2 source=音声出力のループバック(モニタ)デバイス名 record=true port=48002 listen=0.0.0.0
フォーマットが同じだとrecordとplaybackをまとめられるのだがinputとoutputでチャンネルが違うのでまとめられなかった
これでsinkのループバックの出力デバイスをマイクにして、sourceのループバックの入力デバイスを出力にすれば動くはず
iproxyでiOS端末のlocalhostをマシンのlocalhostに持ってくる code:iproxy.sh
iproxy 48000:48000
ncでいい感じに繋げる
code:nc.sh
nc localhost 48002 | nc localhost 48000 | pacat --rate=48000 --format=float32le --channels=1 --latency-msec=10 --device=マイク用ループバックのスピーカーデバイス名
案外これでちゃんと動くのですごい
終わる時は
iOS端末側で接続を切る
nc を Ctrl-C
iproxy を Ctrl-C
pactl unload-module module-simple-protocol-tcp
他で使ってるとそれも死ぬので注意
課題
Linux側のちゃんとしたラッパ (GUI?) を書く
別にラッパが全部やってくれるんだったらPulseAudioのmoduleのやつはUNIXソケットとかでもいいと思う (TCP port をアレしたくない)
iOS端末のマイク入力がやたら遅い
なんか AVAudioNode#installTap が0.1秒ごとくらいにしかデータをくれない
これをどうにかして低遅延化する必要がある
PulseAudio→iOSはほぼ遅延ない (バッファをちゃんと飛ばせば)
iOSアプリ側で再生バッファの自動制御をやる
現状はバッファが貯まってきた時のためにバッファに積むのをやめるボタンを用意して手で飛ばしている