Ubuntu Weekly Recipe

第299回 UbuntuでOpen Sound Systemアプリケーションを簡単に使う方法

この記事を読むのに必要な時間:およそ 3 分

はじめに

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)⁠

注1)
「oss-dkms」などの一連のパッケージを追加でインストールすることで,サウンドサブシステムをOpen Sound Systemバージョン4に切り替えることはできます。
注2)
今回は簡便のために「/dev/dsp」だけを取り上げますが,これ以外にもOpen Sound System由来のキャラクタデバイスがいくつかあります。

Open Sound System Proxy Daemon(osspd)

Open Sound Systemインターフェースをエミュレートする仕組みとして,これまでaossやpadspが使われてきました。Ubuntu 13.04以降では,新しい簡便な方法が追加されました。その新しい方法とは,osspdというソフトウェアを利用することです。細かな解説は後で行うとして,まずはインストールして試してみましょう。Ubuntu 13.04以降では,パッケージ「osspd」が提供されています。Ubuntuソフトウェアセンターなどを使い,このパッケージをインストールしてください。

図1 Ubuntuソフトウェアセンターにおけるosspdの検索結果

図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に音声出力できていることがわかる

図2 gtickが表示されることから,PulseAudioに音声出力できていることがわかる

注3)
もっとも,GNU Gtickはバージョン0.5でPulseAudioに出力する機能が追加されているので,もうOpen Sound Systemバックエンドを使う必要はありません。

これまでの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を簡単に見ていきます。

注4)
この機能を有効にするにはLinuxカーネルのビルドオプションでALSAの当該機能を有効にしなければならず,手軽ではありません。
注5)
Open Sound Systemのインターフェースは/dev/dspに対する入出力関数の実行です。aossやpadspのエミュレート手法は,まず,これらのエミュレート関数を実装したライブラリを用意します。次にそのライブラリを,LD_PRELOADを用いてlibcよりも先にローダに動的リンクさせます。こうして,Open Sound Systemアプリケーションの実行形式がaossやpadspのライブラリ内のエミュレート関数を使うように仕向けます。しかし,このままではlibcの被エミュレート関数の機能が使えませんので,RTLD_NEXTハンドルを用いたdlsym(3)で,ライブラリから被エミュレート関数を呼べるようにしています。

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に渡すことができます。

著者プロフィール

坂本貴史(さかもとたかし)

Ubuntuのマルチメディア編集環境であるUbuntu Studioのユーザ。主にUbuntu日本コミュニティとUbuntu Studioコミュニティで活動。いつかユーザ同士で合作するのが夢。

コメント

コメントの記入