OpenALの導入と音源ファイルの単純再生
まずは、OpenALの公式サイト(http://www.openal.org/)からOpenALライブラリSDKをダウンロードする。今回使用したのはOpenAL 1.1 SDK for Windows(2008/01/18時点)。

ダウンロードが完了すると"OpenAL11CoreSDK.exe"なる実行ファイルが出来るので、おもむろに実行する。するとインストーラーになっているので、指示に従ってインストール。

続いて同サイトからALUTをダウンロードする。得られたヘッダーファイル,libファイル,dllを適当なディレクトリに配置し、完了。ALUTの中にはサンプルとして"playfile.exe"が入っているので、試しにコマンドラインで実行してみる。ピロピロ音が鳴った。どうやら成功のようだ。

開発スタート。

OpenALSDK付属のサンプル通りにやるか、チュートリアルサイトDevMaster.net OpenAL Tutorialsに従うか、いきなりALUTで行うか迷ったが、どうせチャレンジするなら最新であろうALUTを使う方法で始めてみる。ダウンロードしたALUTライブラリ内にdoc/alut.htmlも添付されているので、まあこれを見ながらすすめよう。 ちなみに、OpenALの関数ランゲージリファレンスはOpenALのインストールディレクトリ内の"docs/OpenAL Programmer's Guide.pdf"に記されています。

まず最初にdoc/alut.htmlに記載されている"Hello world"のソースを丸々コピー。 音声ライブラリのHello worldってなんなんだ、と思ったら、

alutCreateBufferHelloWorld()

関数で男が"Hello world"としゃべってる音声バッファが作られるらしい。 こういった無駄な機能は熱い。

早速コンパイルしようとすると、早速エラー。GLUTと違って、libも手動設定っぽい。 こういうのはプロジェクトファイル作るたびに設定を忘れがちなので、pragmaで記述。 結局コンパイルできたソースは次のようになった。

#include <stdlib.h>
#include <AL/alut.h>

#pragma comment(lib, "OpenAL32.lib")
#pragma comment(lib, "alut.lib")

int main (int argc, char **argv)
{
  ALuint helloBuffer, helloSource;
  alutInit (&argc, argv);
  helloBuffer = alutCreateBufferHelloWorld ();
  alGenSources (1, &helloSource);
  alSourcei (helloSource, AL_BUFFER, helloBuffer);
  alSourcePlay (helloSource);
  alutSleep (1);
  alutExit ();
  return EXIT_SUCCESS;
}

実行すると、男が"Hello world"としゃべる。

ソースをみて思うところとしては、 OpenALというのは、バッファ作成→ソース作成→音鳴らす、の順で動作させるようだ。 バッファやソースをポインタではなくuint型で指定させるあたりは、OpenGLのテクスチャの扱いに似ているな。

使われているALUT関数は,

  alutInit ()
  alutCreateBufferHelloWorld ()
  alutSleep ()
  alutExit ()

の4つだけなので、どうやらALUTの請け負っている部分はInitでOpenAL用のスレッドを作り、 その管理を行うのがメインのようだ。バッファの作成も出来るみたいだけど、 wevやmp3を読み込める親切関数はあるのだろうか?

  alutCreateBufferFromFile (const char *filename)

関数の下に"For backwards-compatibility"として

  alutLoadWAVFile()
関数が紹介されているので、前者でwavもしくはそれ以外も読み込めるのでは?
ということで、wavやその他のファイルを再生すべく、上記のソースに修正をかける。 単純にバッファの作成を次のようにしたらうまくいった。
  helloBuffer = alutCreateBufferFromFile ("file1.wav");
file1.wavはALUTのサンプル同梱のファイル。同じくfile2.auも再生できた。この勢いでmp3は?!!、、、出来ませんでした。。。。 どっかに対応フォーマット一覧とか書いてないものか。

プロパティー設定は?

OpenALでは再生環境の各種設定ができる(と期待している)。 例えば、音源の位置や方向、観測者の位置などを設定することで、聞こえ方が変化するなど。ここではその第一歩として音源のループ再生を行う

音源の各種設定は

  alSourcei()
関数の第一引数に作成したソース、第二引数に設定したい項目を表す定数、第三引数に設定値を指定するらしい。今回は上記ソースに以下を追加。(合わせてconio.hもインクルード
#include <conio.h>
  ・・・
  ALboolean loop = AL_TRUE;
  ・・・
   alSourcei (helloSource, AL_LOOPING,  loop     );
  alSourcePlay (helloSource);
  alutSleep (1);
  getch();
  
このALbooleanの実態はcharなので注意。 コンソールで実行すると、何かキー入力されるまで、ループ再生するようになった。 このときalutSleepを省くと再生の頭出しがうまくいかなかったので注意。



Atsushi M. Ito web