目次
OpenAL
記事作成日:2010-08-20
クロスプラットフォームのオーディオライブラリ。ライセンスはLGPLとのこと。
http://www.delicious.com/nishimotz/openal
DirectSound 3DがVistaで廃止されたという記事によれば、 OpenAL は3Dサウンドを実現するための事実上の後継技術の一つである。
オーディオ入力APIとしては、 portaudio は「入力バッファがたまったらコールバックで読んでもらう」方式なのに対して、 OpenAL は「自分でメインループを回して、入力バッファがたまったかどうか定期的に見に行く」方式らしい。 仕様
- portaudio の v19 はブロッキングIOに対応している
OpenAL は Windows, Linux, MacOS X などに加えて iPhone でも使えるようだ:記事
ALUTというユーティリティライブラリもあるが、GLUTのようなクロスプラットフォームのアプリケーションフレームワークではなく、 バッファの初期化やスリープなどいくつかの機能にとどまっている。 実際にはアプリケーションフレームワークがメインループをにぎるケースが多いだろうから、それでいいのだろう。
Ubuntu 9.04
パッケージがある。
- libopenal-dev
- libalut-dev
下記は公開されている記事を参考にしたもの。
# Makefile target: g++ main.cpp -lopenal -lalut
#include<AL/alut.h> int main(int argc, char** argv){ alutInit(&argc,argv); ALuint buffer, source; alGenBuffers( 1, &buffer ); alGenSources( 1, &source ); buffer = alutCreateBufferHelloWorld (); alSourcei( source, AL_BUFFER, buffer ); alutSleep (1); alSourcePlay( source ); alutSleep (1); return 0; }
make が通ることを確認したが、 VMware ゲスト環境であるせいか、音が途切れる。
Windows (cygwin gcc-3 による MinGW 環境)
前述の記事では MinGW コンパイル環境を使っていたようだが cygwin の gcc-3 で MinGW クロスコンパイルができることを これ を読んで知ったので、試してみた。
ここからOpenAL11CoreSDK.zipを落として展開、手順に従って(いったん)インストールする。
"C:\Program Files\OpenAL 1.1 SDK" の下にある include と libs を取ってくる。
ここから freealut-1.1.0-binを落として適当な場所に展開する。lib と include の中身を使う。
下記のような状態にしておく。
$ ls Makefile alut.dll include libs main.cpp $ ls include/AL/ EFX-Util.h al.h alc.h alut.h efx-creative.h efx.h xram.h $ ls libs/Win32/ EFX-Util_MT EFX-Util_MTDLL OpenAL32.lib
Makefile はこんなかんじ。
# Makefile target-cygwin-mingw-win32: gcc-3 -mno-cygwin main.cpp -lOpenAL32 -lalut -Iinclude -Llibs/Win32
これで make すると a.exe ができる。
実行すると cygwin の bash からでもコマンドプロンプトからでも音が出ることを確認した。
Ubuntu : python-openal
執筆:2010-09-02
Mac で OpenAL
since 2011-10-09
Mac は Core Audio に加えて OpenAL が使用できる。
http://www20.atwiki.jp/yosilove/pages/16.html
SDK に Services/OpenALExample というサンプルがあると CoreAudioOverview に書かれている。
状態モデル
yunoの雑記帳 - OpenALストリーミング再生 http://bit.ly/nDhMJ5
Source
http://www.memorize-being.net/releases/oal11spec-ja/spec-4.html
alGetSourcei(source, AL_SOURCE_STATE, &state) を利用して状態を取得できる。
- AL_INITIAL
- AL_PLAYING
- AL_PAUSED
- AL_STOPPED
状態遷移コマンド
- void alSourcePlay (ALuint sName);
- void alSourcePause (ALuint sName);
- void alSourceStop (ALuint sName);
- void alSourceRewind (ALuint sName);