2013/02/14

C言語 OpenAL をWindowsXP MinGWで使う

C言語 ANSI C89の範囲だけでは直接音を出すアプリケーションは作れそうもない。Windows のライブラリを使えば簡単に実現できそうだったけど、OpenAL(Open Audio Library) というマルチプラットフォームなオーディオ API があるので、それをインストールしてみた。

インストール

OpenAL公式ページから以下をダウンロードする。
http://connect.creativelabs.com/openal/default.aspx
OpenAL11CoreSDK.exe
freealut-1.1.0-bin
oalinst.exe

OpenAL11CoreSDK.exe
ダウンロード先は Creative Labs: Connect > OpenAL > Downloads
Windows へのインストールは OpenAL11CoreSDK.exe をダブルクリックして行う。デフォルトのインストール先は C:\Program Files\OpenAL 1.1 SDK となっている。これは好きな場所で構わないと思う。どうも VC++ での開発を意識しているようなので、MinGWを使う場合は、いろいろファイルを移動する必要がある。

C:\Program Files\OpenAL 1.1 SDK\libs\ 内のファイルすべてを
C:\MinGW\lib\ へ移動。

C:\Program Files\OpenAL 1.1 SDK\include\ 内のファイルすべてを
C:\MinGW\include\AL\ へ移動。(AL フォルダは自分で作成)

そのほかの OpenAL11CoreSDK のファイルは使わないので、捨ててしまっても問題ないようだ。

freealut-1.1.0-bin
ダウンロード先は Creative Labs: Connect > OpenAL > Downloads > ALUT
解凍し、その中の下記ファイルを移動する。
\lib\alut.dll は C:\WINDOWS\system32\ へ入れる。
\lib\alut.lib は C:\MinGW\lib\ へ入れる。
\include\AL\alut.h は C:\MinGW\include\AL\ へ入れる。

oalinst.exe
ダウンロード先は Creative Labs: Connect > OpenAL > Downloads
これは作ったアプリケーションを起動するのに必要なようだ。ダブルクリックであっけないインストールが行われる。上の OpenAL11CoreSDK をアンインストールしたら、OpenALのアプリが動かなくなったので、これをインストールしたら無事動くようになった。C:\WINDOWS\system32 の中に wrap_oal.dll と OpenAL32.dll を入れるようだ。 ちなみに wrap_oal.dll を抜くと wavファイルの再生は出来ても、「HelloWorld」 としゃべるアプリは無音だった。

wavファイルを再生するプログラムを作ってみる

wavファイルをドラッグ&ドロップで再生するプログラム。サンプルをいじって作ってみた。細かな部分は OpenAL がやってくれるので、関数の役割だけ知れば何とかなりそうという印象。
/*
 * wavplayer.c
 * February 14th, 2013
 * gcc wavplayer.c -lOpenAL32 -lalut -s -o wavplayer
 */
#include <stdio.h>
#include <stdlib.h>
#include <AL/alut.h>

int main(int argc, char *argv[]) {
  /* ALUTによる初期化 再生するファイル */
  alutInit(&argc, argv);
  /* バッファを2つ用意 buffer, source */
  ALuint buffer, source;
  alGenBuffers(1, &buffer);
  alGenSources(1, &source);
  /* ファイルがなければエラー表示してenterで終了 */
  if (!argv[1]) {
    fprintf(stderr,"read error %s\n"
            "Press Enter key to exit."
            ,argv[1]);
    getchar();
    exit(EXIT_FAILURE);
  }
  /* wavファイルをバッファに入れる */
  buffer = alutCreateBufferFromFile(argv[1]);
  alSourcei(source, AL_BUFFER, buffer);
  /* 再生 */
  alSourcePlay(source);
  printf("OpenAL Player %s \nPress Enter key to exit.", argv[1]);
  /* enterで終了 */
  getchar();
  alutExit();
  return 0;
}
上記を
gcc wavplay.c -lOpenAL32 -lalut -s -o wavplayer
のようにオプションを付けてコンパイル。-lOpenAL32 -lalut は、openal32.lib、alut.libを意味する。出来たexeファイルは 9KB の小さなアプリケーション。これに再生したい wav ファイルをドラッグ&ドロップすると、コマンドプロンプトが下記のように表示され、最後まで再生される。Enter キーを押すと終了する。
OpenAL Player C:\sample.wav
Press Enter key to exit.

OpenALでサイン波を鳴らす C言語
C言語 ANSI C89 Meadow & MinGW GCC 目次
sound programming 目次