OpenAL+ALUREによる立体音響遊び・・・の準備

立体音響(3D Audio)を試したかったので、OpenALをインストールすることにしました。

  • 環境

結論

  • OSXにはOpenALが標準装備されているようなので、OpenALOpenAL Soft)を別途入れる必要はありません。
  • OSX標準のOpenALを利用する時はgccのオプションに"-framework OpenAL"と指定します。

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という実装が今のスタンダードなようです。

それと、OpenGLGLUTがあるように、OpenALにもALUTがあり、Downloadのところに置いてありますが、如何せん古いので、先ほどのOpenAL Softと同じ団体が開発している、ALUREが今のスタンダードなようです。

まとめ

  • OpenALOpenGLのサウンド版。
  • OpenALのドキュメントはここ。v1.1のPDFをダウンロードしておくと良い感じかも(?)
  • OpenALの実装はOpenAL Softを使うべし。
  • ALUTは使わず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…。

まとめ

あとで気づくことになるのですが、OS XにはOpenALが標準で入っているようなので、自分でビルドする必要はありませんでした(笑)*2

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:
...

  • The play and stream examples are now installed by default, but can be disabled with the BUILD_EXAMPLES and INSTALL_EXAMPLES options to cmake.
http://kcat.strangesoft.net/alure.html

ん?デフォルトでインストールされるとな?

ということで、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を先に検知したために、そっちに合わせてビルドされた、みたいな話なのかなと予想していますが、、、まぁ何にせよとりあえず動いたので良しとします。

まとめ

gccのオプションには"-framework OpenAL"を使いましょう。

おまけ

今回は、C系のライブラリをコンパイルして作りましたが、JavaならJogAmpや、他にもPHPRubyPythonなどでOpenALのbindingがあるようです*4。中でも、なかなか面白そうなのがHaskelのOpenALパッケージです。何故かコミットも活発で、Haskellの勉強がてら、触ってみるのもありかもしれません。

*1:元々OpenAL自体もCreativeが開発していたようです

*2:というかするだけ無駄です

*3:気づけよ!

*4:が、結構保守されていなかったりするので、何だかんだでC系が一番確実だと思われます