Rolandという浜松にある音響機器メーカーが出している
M-200iというオーディオミキサーがある。
このミキサーには、REACポートというディジタル音声を40チャネル出力するポートが備わっている。
ステージボックスとの接続や他のミキサーとの接続に使用するポートで、Ethernetパケットに音声情報を載せて送るようになっている。
Windows用には、このポートを通して録音するソフトが出ている。
Mac OS X用には、サードパーティから
REAC driverというGPL3のツールが出ている。
どちらもLinuxでは使用できないので、REAC driverのソースを参考に、Linuxで動くものを作成し始めた。
REAC driverのようなカーネル空間で動くオーディオドライバにすると扱いやすいのだろうが、そこまでするのは大変なので、ユーザー空間で動かすプログラムをつくることにした。
Linuxのsocketをつかってプログラムを書いてみたが、パケットロスを回避するのが難しく断念、最終的に、tcpdumpでファイルに保存しておき、後処理をすることにした。
- まず、M-200iのREACポートとLinuxマシンとをLANケーブルで接続する。
(1 Gbpsでリンクすることを期待していたのだが、dmesgを見るとなぜか100 Mbpsでリンクしていた。)
e1000e: enp0s31f6 NIC Link is Up 100 Mbps Full Duplex, Flow Control: None
e1000e 0000:00:1f.6 enp0s31f6: 10/100 speed: disabling TSO
今回はストレートケーブルを使って、スイッチングハブなどを介さずに接続した。
- 以下のように
tcpdump
でキャプチャし、ファイルに保存する。このとき、オプション-B
でカーネル上のバッファサイズを大きく取っておく。今回使用した環境 (Intel Core i7-7700 + H270) では、256MiBに設定したらようやくパケットロスしなくなった。
$ tcpdump -i enp0s31f6 -B 262144 -w a.pcap
このときtcpdumpはパケットロスしたと報告するのだが、次のステップでパケットを解析すると、音声情報が載ったパケットのロスは無かった.
- そのあと、自作のプログラムで、チャネルを選択して24-bit WAVE形式に変換する。プログラム自体はそのうちGitHubで公開するかもしれない。
$ reacrecorder --save-channels 21,22,39,40 --save-wav-24 --load-pcap-file a.pcap
REAC driverにはM-200iとのネゴシエーションなどいろいろな処理が書かれているのだが、今回の用途には必要なかった。
REAC masterとなるM-200iから常に音声データがブロードキャストされている。
そのパケットをキャプチャしてWAVEに変換すれば良いだけだった。