OpenAL+ALUREによる立体音響遊び・・・の準備
立体音響(3D Audio)を試したかったので、OpenALをインストールすることにしました。
- 環境
- Mac OS X Mountain Lion
- Homebrew
結論
OpenALとは
OpenGLのサウンド版です。思想も同じで、OpenAL自体は実装ではなくAPI(インターフェース)で、それに従っていればOpenAL互換のライブラリと名乗ることができる、というわけです。
OpenALの本家本元ですが、元々openal.orgというサイトがあったのですが、今はhttp://connect.creativelabs.com/openal/default.aspxというサイトへ飛ばされるようになってしまいました。Sound Blasterで有名なCreative Technologyの研究サイトのようです*1。
まずは、APIのドキュメントはここらへんにあるので、ダウンロードしておくと良いでしょう。
実装については、どうもCreativeの実装はプロプライエタリになったようです。そこで、オープンソースだったバージョンからForkしたOpenAL Softという実装が今のスタンダードなようです。
それと、OpenGLにGLUTがあるように、OpenALにもALUTがあり、Downloadのところに置いてありますが、如何せん古いので、先ほどのOpenAL Softと同じ団体が開発している、ALUREが今のスタンダードなようです。
OpenAL Softのインストール
OpenALをインストールし、サンプルを動かしてみました。
まず、公式サイトからtarballをダウンロードし、適当に解凍します。
インストール方法などがREADMEに書いてありますので、さらっと一読しましょう。cmakeが無いならbrewでインストールしましょう。
$ cd path/to/openal_src/build $ cmake .. $ make $ make install (/usr/local/libなどに各種ファイルが入ります)
次に、exampleディレクトリ内のalstream.cを動作させてみます。指定した音声ファイルの音を再生するサンプルです。ffmpegを使って、色んなフォーマットに対応しているのですが、却ってサンプルとして分かりづらいんじゃないかなぁという気もしますが、ともかく動かしてみました。
まず、ffmpegが入っていないとダメなので、brewで入れます。ついでなのでvorbisも組み込みました。
$ brew install ffmpeg --with-libvorbis ... $ ls /usr/local/lib/ | grep av libavcodec.54.86.100.dylib libavcodec.54.dylib libavcodec.a libavcodec.dylib libavdevice.54.3.102.dylib ...
Makefileを書いても良いのですが、面倒だったで個別にコンパイルしました。"example/common"以下もコンパイルする必要があります。
$ cd pass/to/openal_src/examples $ cd common $ gcc -c alffmpeg.c $ gcc -c alhelpers.c $ cd .. $ gcc -c alstream.c $ gcc alstream.o common/alhelpers.o common/alffmpeg.o -lopenal -lavcodec -lavformat -lavutil $ ./a.out Usage: ./a.out <filenames...>
途中ワイルドカードでも良かったかもしれませんが、とにかくこんな感じです。
$ say 'Yes we can' -o yes.aiff $ ./a.out yes.aiff Opened "OpenAL Soft" AL_SOFT_buffer_samples supported! Playing test.aiff (S16, Mono, 22050hz) Done. $ saykana 'うふふ' -o uhuhu.aiff $ ./a.out uhuhu.aiff Opened "OpenAL Soft" AL_SOFT_buffer_samples supported! Playing test.aiff (S16, Mono, 8000hz) Done.
楽しいですね。ただ、mp3やoggは再生出来ませんでした、、、何のためのffmpeg…。
ALURE(AL Utilities REtooled)のインストール
次に、ALUT相当のALUREをインストールしてみます。手順は先ほどと同様です。
$ curl -O http://kcat.strangesoft.net/alure-releases/alure-1.2.tar.bz2 (最新版を指定しましょう) $ tar xvjf alure-1.2.tar.bz2 $ cd alure-1.2/build $ cmake .. $ make $ make install
サンプルを動かします。
$ gcc alureplay.c -lopenal -lalure $ say 'yes we can' -o yes $ ./a.out yes.aiff Failed to create OpenAL source!
むむっ!動かない。
どうも、alGenSourcesに失敗している様子です。AL_INVALID_OPERATIONエラーが発生しているようです。alureInitDeviceの方に問題がありそうですが、ざっとソースを読んだ分には、ぱっと見問題無いところがなおさら謎です。
…
悩むこと数時間、公式サイトに、こんな記載があることを発見しました。
ALURE 1.2 is now available!
Changes from 1.1 include:
...http://kcat.strangesoft.net/alure.html
- The play and stream examples are now installed by default, but can be disabled with the BUILD_EXAMPLES and INSTALL_EXAMPLES options to cmake.
ん?デフォルトでインストールされるとな?
ということで、buildディレクトリを見てみたら
$ ls CMakeCache.txt alurecdplay install_manifest.txt CMakeFiles alureplay libalure-static.a Makefile alurestream libalure.1.2.0.dylib alure-static.pc cmake_install.cmake libalure.1.dylib alure.pc config.h libalure.dylib
ありました…。しかも、実行してみたら、ちゃんと動きます。
そこで、Makefileを辿って行くと、どうも"CMakeFiles/alureplay.dir/link.txt"がヒントになりそうな感じです。
/usr/bin/cc -O2 -g -DNDEBUG -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/alureplay.dir/examples/alureplay.o -o alureplay libalure.1.2.0.dylib -framework OpenAL -ldl -lm -lstdc++ -pthread
"-lopenal"ではなくて"-framework OpenAL"としている!そこで、
$ gcc alureplay.c -lalure -framework OpenAL $ ./a.out yes.aiff
鳴りました。確認してみると、"/System/Library/Frameworks/OpenAL.framework"が確かにありました。ということは、実はMacには最初からOpenAL入っていたんじゃないかという結論に至りました*3。ありゃりゃ。
しかし、自分でコンパイルしたもので動かないのも納得がいきません。おそらくALUREがコンパイル時にOpenALに依存していて、cmakeの時に、自分でビルドしたOpenAL SoftではなくOpenAL.frameworkを先に検知したために、そっちに合わせてビルドされた、みたいな話なのかなと予想していますが、、、まぁ何にせよとりあえず動いたので良しとします。