C++
audio

12-12 std::audioはクロスプラットフォームオーディオAPIの基盤となるか

https://adventar.org/calendars/3353 の12日目エントリーです。

11/20, 11/21の2日間にわたってロンドンでAudio Developers Conference 2018というイベントが行われ、わたしもそれに参加してきました。ADC自体は正直JUCEの開発元ROLIがJUCEのために開催しているカンファレンスと評価するのが妥当な感じでしたが、その中でC++で標準オーディオAPI仕様を策定しよう、というセッションがJetBrainsの開発者によって行われました。

前回議論したことですが、クロスプラットフォーム・オーディオライブラリの機能要件は、地味に増えていることがあります。とは言っても、その中には「技術標準」として考慮すべき事項とそうでない事項があります。たとえばWindowsでwinmmに加えてwasapiをサポートするとか、ASIOをサポートする(あるいはしない)というのは、特定プラットフォームの実装面での要件です。こういう問題は標準APIの議論の範疇にはありません。

逆に、入出力チャンネルについて、ステレオまでだけではなく5.1chや7.1ch、3Dオーディオなども考慮した多チャンネルをサポートしなければならない、といった要件は、プラットフォームを問わずに発生する新しい要件であり、標準化において考慮すべき事項です。

多チャンネルのオーディオバッファをinterleaved(単一の配列=バッファにフレーム単位でチャンネルごとに順番にデータを入れる方式 = frame1 (ch1, ch2), frame2 (ch1, ch2), ...)で取得したりdeinterleaveしたり(interleavedなバッファをフレームからチャンネル単位のバッファに分解してチャンネルごとにまとめる方式 = ch1 (frame1, frame2, ...), ch2 (frame1, frame2, ...), ...に変換)といったAPIも用意して、一般的な要求に応えたいようです。

std::audioについては、セッション中はデモが行われましたが、現時点でまだリポジトリすら公開されておらず、デモが行われたセッションの録画も公開されておらず(他のセッションはほとんど公開されているのですが)、外部の人間が実装をテストできると言える状況とはまだ言えなそうです。既存のクロスプラットフォーム・オーディオライブラリがたくさんあるのに何で新しいものを作ろうとするの?という質問も出ましたが、これから意見募集するかも?みたいな雰囲気でした。個人的な印象としては、「こんなのがあったらいいんじゃないか」という思いつきで構想を出してセッション案も出してしゃべったけど、まだ勇み足で、相談したり意見を受け容れたりする準備は何も整っていないのかな?という感じでした。

わたしがstd::audio構想について根本的に疑問があるとしたら、既存の標準化作業の成果を使うのではダメなのか?というところです。特にオーディオの最適レート取得をどうするかとか、16ビット整数とfloatのどちらをデフォルトにするかとか、まだ決まっていない部分などがあるといいますが、Web Audio APIのような先例はすでにあるので、基本的な部分の議論がまた繰り返しになるだけなのではないか、と思います。Web Audio APIは無駄に高度な機能を抱え込みすぎたきらいもあるので(firefoxのAudio Data API仕様を振り返ってみましょう)、全部をフォローする必要は全く無いと思いますが、参考にする部分は少なからずあることでしょう。

ちなみにWeb Audio APIのオーディオ実装を抜き出してクロスプラットフォームのオーディオライブラリにしちゃえばいいんじゃないか?と思った人もいるかもしれません。ハイ、あります。Chromiumのソースのforkだそうです。

https://github.com/LabSound/LabSound

ちょうど前回紹介したブログにFirefoxのオーディオ実装であるcucebを抜き出して使ったらどうか?みたいな話が載っていましたが、そのChromium版のようなものだと思えばよさそうです。個人的にはこの辺が現状では妥当な落としどころなんじゃないかなと思っています。ただ、C++のソリューションでは、Cで書かれたportaudioやlibsoundioのように言語の壁を越えて使われることは、ほとんど無いでしょう。

ちなみにcucebについて「何で単独で使えるようにモジュール分けてないんだよ」という内容になっている前述の記事について、hacker newsでは「ちゃんとモジュールはわかれている」「そうなのか。何か本文の内容も信じられなくなってきたな」みたいなコメントが続いていて、眉に唾をつけながら読んだほうがいいのかなとも思います。

標準化には段階がいくつかあり、(詳しいことは忘れてしまいましたが)さまざまな委員会レビューを経て承認される必要があり、標準化が実現するまでは早くても2022年あるいは2023年までかかるのではないかという感じでした(登壇者は2022年頃ではないかと説明し、聴衆の一部が2023年まではかかるはずだというコメントを出していました)。それくらいのタイムフレームで見ておくとよさそうです。