はじめに
Open Sound Systemに関しては、本連載の第137回 と第144回 において、Ubuntuで使う方法を扱いました。その内容を大まかに分類すると、サウンドドライバをAdvanced Linux Sound Architecture(ALSA)からOpen Sound Systemに切り替える方法(第144回)と、サウンドドライバを切り替えずにOpen Sound Systemアプリケーションを使う方法(第137回)になります。前者に関しては、より多くのデバイスをサポートするALSAがLinux標準のサウンドサブシステムである現在、有用ではありません。しかし後者に関しては、ALSAとPulseAudioの組み合わせをサウンド環境としているUbuntuでOpen Sound Systemアプリケーションを使えるという点において、現在でも有用です。
Ubuntu 13.04以降、Open Sound Systemアプリケーションを使う新しい方法が追加されました。今回はこの新しい方法をご紹介します。
Open Sound Systemアプリケーションの問題
新しい方法を紹介する前に、Ubuntu(と言うかLinux)においてOpen Sound Systemアプリケーションが抱えている問題をまとめます。
Ubuntuがカーネルとして用いているLinuxにおいて、サウンドドライバとしてのOpen Sound Systemは10年以上前にdeprecatedであり、過去のものです。そのため、過去に開発されたLinux向けOpen Sound Systemアプリケーションは、ALSAあるいはGstreamer、PulseAudioのインターフェースを使って書き直されるべきです。しかし、過去に開発が終了しているOpen Sound Systemアプリケーションを今さら修正するのはモチベーションが上がりません。
またOpen Sound System自体の開発は継続しており、UNIXライクなシステムで使用することができます。そのため、他のUNIXライクなシステムで開発されたOpen Sound SystemアプリケーションをLinuxで動かしたい人がいるかもしれません。この場合も、アプリケーションの移植の過程で、ALSAあるいはGstreamer、PulseAudioのインターフェースを用いるコードを追加するべきです。しかし、APIの学習やメンテナンス、クロスビルドのコストを考えると、こちらもモチベーションが上がりません。
このような事情により、アプリケーションをOpen Sound Systemのインターフェースのまま動作させるという要求が発生します。
しかし現在のLinuxは、サウンドサブシステムとしてALSAを使います。Open Sound Systemはインストールされません[1] 。システムにOpen Sound Systemのインターフェースがないため、そのままではOpen Sound Systemアプリケーションを使うことができません。使用可能とするには、Open Sound Systemインターフェースをエミュレートする仕組みを、Linuxに用意する必要があります。
なお、使用しているソフトウェアがOpen Sound Systemアプリケーションであることを判断する目安として、アプリケーションの設定に「/dev/dsp」に関するものがあるかどうかを見るという手法が使えます。この「/dev/dsp」はOpen Sound Systemのキャラクタデバイスの1つです。アプリケーションはこのキャラクタデバイスに対して音声データの入出力を行うことで、サウンドデバイスと入出力を行います[2] 。
Open Sound System Proxy Daemon(osspd)
Open Sound Systemインターフェースをエミュレートする仕組みとして、これまでaossやpadspが使われてきました。Ubuntu 13.04以降では、新しい簡便な方法が追加されました。その新しい方法とは、osspdというソフトウェアを利用することです。細かな解説は後で行うとして、まずはインストールして試してみましょう。Ubuntu 13.04以降では、パッケージ「osspd」が提供されています。Ubuntuソフトウェアセンターなどを使い、このパッケージをインストールしてください。
図1 Ubuntuソフトウェアセンターにおけるosspdの検索結果
パッケージをインストールすると、osspdがデーモンとしてシステムに常駐するようになります。
$ service --status-all
[ ? ] LCDd
[ + ] acpid
(省略)
[ + ] osspd
(省略)
[ + ] winbind
[ - ] x11-common
では、osspdの効果を確認してみます。本連載の第137回にならい、今回もGNU Gtickを使います。gtickをOpen Sound Systemインターフェースを使うように設定してサウンド機能を開始すると、とくに何もしなくてもシステムから音声が出力されます[3] 。
ここで、デスクトップ右上から起動できる「サウンドの設定」の、「 アプリケーション」タブを確認してみます。gtickの音声出力がPulseAudioに渡っていることが確認できます。
図2 gtickが表示されることから、PulseAudioに音声出力できていることがわかる
これまでのOpen Sound Systemエミュレート方法
それでは、osspdがどのようにしてOpen Sound Systemアプリケーションの音声入出力を可能としているかを見ていきましょう。その前に、既存のエミュレート方法とその欠点をまとめます。
これまで、Open Sound Systemのエミュレート方法がいくつか開発され、使われてきました。たとえばALSAのカーネルランドの場合、ALSAのドライバがOpen Sound Systemのドライバのふりをすることで、Open Sound Systemアプリケーションの音声データ入出力をサウンドデバイスに入出力する機能を持ちます[4] 。
またaossやpadspはLinuxのローダの機能を使い、自分のライブラリをプリローディングします。このライブラリには入出力関数をエミュレートするコードが含まれており、Open Sound Systemアプリケーションの入出力を、ALSAやPulseAudioの入出力にします[5] 。
これらのエミュレート手法にはそれぞれ欠点があります。ALSAドライバがOpen Sound Systemドライバのふりをする方法の欠点は以下です。
一度に1つのOpen Sound Systemアプリケーションしか「/dev/dsp」を使えないこと
そのOpen Sound Systemアプリケーションが実際のサウンドデバイスを占有すること
システム全体として1つのサウンドアプリケーションしか使うことができず、その結果、PulseAudioのようなALSAアプリケーションを同時に使用することができません。
また、aossやpadspを使う方法にも以下の欠点があります。
インターフェースの完全なエミュレートが難しいこと
起動のためのコマンドを端末で実行、あるいはランチャーに登録する手間が必要なこと
これらの欠点を踏まえ、osspdは異なるアプローチでOpen Sound Systemエミュレートを行います。その際に利用されているのが、LinuxのCUSEという機能です。次では、このCUSEを簡単に見ていきます。
LinuxのFUSE拡張機能CUSE
Linuxのfsサブシステムには、FUSEという機能があります。FUSEは、ファイルシステムをユーザランドで実現するためのものです。この機能を利用しているユーザランド実装として、NTFSファイルシステムをLinuxで使用可能にするntfs-3gや、SSHでリモートのファイルシステムをローカルにマウントするsshfsがあります。
このFUSEの拡張機能にCUSEがあります。CUSEを利用すると、キャラクタデバイスへの入出力をユーザランドに実装することができます。この機能がOpen Sound Systemインターフェースのエミュレートにどう役立つかというと、「 /dev/dsp」への入出力をユーザランドで処理できる点です。もう少し見ていきましょう。
通常、Open Sound Systemアプリケーションが「/dev/dsp」へ入出力を行うと、それに対応するカーネルランドのドライバのコードを実行します。CUSEを利用すると、このドライバの代わりになるものをユーザランドに実装できます。つまり、この「ドライバの代わりになるもの」を、ALSAやPulseAudioのアプリケーションとして書くことができます。その結果、Open Sound Systemアプリケーションの音声入出力を、ALSAやPulseAudioに渡すことができます。
まとめ
Ubuntu 13.04以降、Open Sound Systemアプリケーションをストレスなく使うために役立つOpen Sound System Proxy Daemonを利用することができます。Open Sound System Proxy DaemonはLinuxのfsサブシステムのCUSEを利用し、キャラクタデバイスのドライバ機能をユーザランドに実装します。このドライバはALSAやPulseAudioのアプリケーションとしての機能を持つため、Open Sound Systemアプリケーションの音声入出力をALSAやPulseAudioに渡すことができます。