2017/11/19

サウンド系API事情04 Linux系API

前回はMacのサウンドAPIについて説明したが、今回はLinuxのサウンドAPIに関して説明する。
Linuxはディストリビューションが多数ありそれぞれにモジュール構成の方針があるため、APIが多数ある。しかも、誤解を恐れずにいうがソフトベンダーがデスクトップ版をあまり重要視していないため、それぞれのディストリビューションで規格を統一しようという考え方があまりないようで、採用しているAPIもまちまちだったりする。
こういう事情もあり、複数のLinuxディストリビューションに対応したマルチメディアソフトウェアを作るのは、結構ないばらの道になることだろう。


Open Sound System (OSS)


今更だが、そもそもマシンから音をならすには、何が必要なのだろうか?
まずは音を鳴らすデバイス(スピーカー)などは物理的に必要だ。ただしスピーカーは入れ替え可能なため、そのスピーカーに信号を送るデバイス(サウンドカード)も必要となる。同時に、そのサウンドカードを制御するソフトウェア(ドライバー)も必要だ。

OSSはUnixのカーネル内の音声を扱うソフトウェアだが、その中でドライバ群も実装されたため、これを含めた全体をOSSと呼ぶ。
OSS自体の起源が古いため、例えばマルチプロセッサに対応した構造になっていない、や、マルチチャンネルサラウンドを扱う機能ない、など、機能構成も古いものとなっていた。
Linuxが作られていく中でOSSも当初は採用されてきたが、その古い構造などが問題視され、またライセンスがLinuxの方針に合わなくなったこともあり、代替のためのソフトウェアが作られていくことになる。

だた、OSSはその後更新され様々な機能実装やライセンス改変も行われている。(ライセンスは商用のものとFreeのものが用意されている)

使用感に関してはかなりUnixライクなので、ioctlとかを使い慣れていないとわかりづらいかもしれない。
明確なAPIがあるわけではなく、デバイスファイルと決まった方法でデータをやり取りすることで再生などが行われる。

Advanced Linux Sound Architecture(ALSA)


OSSの代替として作られたLinuxコンポーネントがALSAだ。
ALSAはOSSと同様ドライバ群+カーネルソフトウェアであり、ユーザ空間にAPIも用意されているため、アプリケーション開発者は他OSのサウンドAPIに近い使用感を感じるかと思われる。APIに関しては「snd_...」という名前から始まる。

また、Linuxカーネルに実装されているため全てのLinuxで標準に利用可能だが、全てのAPIを保証しているわけではなく、例えばASYNC系の機能はOSやデバイスによってサポートされていなかったりする。つまりコールバックの仕組みがあるにはあるが、環境によってはサポートされていなかったりする。マルチプラットフォーム化するなら、コールバックなどの仕組みは独自に用意したほうがいいだろう。

Enlightened Sound Daemon(ESD)


ここからはサウンドAPIというよりはサウンドサーバになるが、ESDはデスクトップ環境GNOMEのプロジェクトで開発されたサウンドサーバだ。
サウンドサーバとは実行中アプリケーションから送られてきたサウンドデータをミキシングして、サウンドドライバに流し込んだりするデーモンだが、こういうものがないと複数アプリケーションで音がならせないためマルチタスク環境では必要なものとなっている。

Unixでは結構サポートされているアプリケーションが多いらしい。正直使ったことがないため、詳細は省略する。

PulseAudio


ESDの置き換えとして実装されたサウンドサーバ。現在では多くのLinux系OSで標準のサウンドサーバとなっている。
簡単に音が再生録音できるSimpleAPIと詳細な制御ができるAsynchronousAPIがある。コールバック方式などを使用したい場合は、AsynchronousAPIを使う必要があるだろう。
Asyncではタスクを処理するためのステップ関数を自分で実行できたり、あるいは別スレッドで実行してくれるような構造を利用できたりと、結構フレキシブルな構造になっている。コールバック機構も用意されているので、アプリケーション開発者には比較的実装しやすいAPIとなってる。

PulseAudioはサウンドサーバなのでOSSやALSAなどとは基本的に異なる立ち位置だが、どちらもユーザ空間から実行できるAPIを用意している。またPulseAudioは仮想デバイスを用意しているため、例えばALSAのAPIで実装されているアプリケーションでも

アプリケーション→ALSA API→PulseAudio仮装デバイス(ミキシング)→ALSA Core(サウンドドライバ)→サウンドデバイス

という経路で音声を再生できるため、この場合はミキシングが行われる。
ただ、ALSAを直接叩いた方が音質がよくレイテンシも小さいため、「ALSAで書いてるけど音質悪いなー・・・あ!PulseAudioかまされてる!余計なことしやがって!」というケースも散見される。用途に応じてOSの設定を変える必要があるのだが、それを各ユーザにやらせるのははっきり言って酷だし、Linuxらしいなと思う。


LinuxではPulseAudioの例のように各API間で、仮想エミュレートという形でお互いを相互的に使用できる仕組みになっている場合が多い。


正直まだ色々なAPIがあるのだろうが、主なAPIを紹介させてもらった。
次回は変わり種のAndroidサウンドAPIについて紹介したい。


0 件のコメント:

コメントを投稿