忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

「OpenALでHelloWorld」の補足

前回の補足として、OpenALの関数の解説をしておきますね。

ALUTの関数

(alut.dll)

alutInit
OpenALをより簡単に使うためのライブラリとしてALUT(OpenAL Utility Library)というのがあるのですが、それを初期化するのにalutInit関数というのを使います。

ALboolean alutInit ( int *argcp, char **argv);

これを呼ぶとALUTライブラリを初期化してALUTが使えるようになります。

引数は何を意味しているのかというと……コマンドラインの引数のようですね。
最初のargcpはたぶんargvの数を表す変数へのポインタで、argvはコマンドラインの引数そのもののようです。

ドキュメントには用途が詳しく書いていないのでどう使えばいいのかよくわかりませんが、この両方にNULLを渡してもかまわないそうです。(何のためにあるんだろ・・・)

戻り値は成功したならtrue、失敗したならfalseです。

alutExit
また、ALUTライブラリを使って音を出した後、アプリケーション終了前に後始末としてalutExit関数を呼ばなければいけません。(もちろん、この関数を呼ばずにアプリケーションを終了して、クリーンアップはOSに任せるというのも一つの手です)

ALboolean alutExit();

この関数を呼んだあと、またalutInitを使ってALUT初期化するのもアリだそうです。

戻り値は成功したならtrue、失敗したならfalseです。

alutCreateBufferHelloWorld
ALUTはまた、初学者のために"Hello, World!"という音声データをあらかじめ用意してくれています。

この音声データを取得するにはalutCreateBufferHelloWorld関数を使います。

ALuint alutCreateBufferHelloWorld();

Bufferというのは音声データを表すオブジェクトです。これを音源を表すSourceオブジェクトにセットし、再生することでスピーカーから音を出します。Bufferは純粋な音声データだけであるのに対し、Sourceは音源の位置、速度、向きなどから物理法則にしたがって音声データを加工する役割を持っているようです。Sourceが遠くにあれば音は小さくなりますし、こちらへ近づいてきているのならドップラー効果で音が高くなります。

戻り値は"Hello, World!"という音声データのBufferを表すハンドルのようなもの(整数)です。(ただし、OpenALではこれをハンドルではなくNameと表現するようですね。今後はNameという用語を使うことにします)


 

OpenALの関数

(OpenAL32.dll)

alGenSources
音源の物理的性質(?)を表すSourceオブジェクトを作るにはalGenSources関数を使います。

void alGenSources(ALsizei n, ALuint *srcNames);

きれいなオブジェクト指向になれたプログラマには気持ち悪いかもしれません。
この関数は複数のSourceオブジェクトを一度に作れるようになっています。

引数のnは作るSourceオブジェクトの数です。つまり、srcNamesのサイズを意味するのです。
srcNamesはこの関数が結果を出力する整数の配列です。作られたSourceの名前(Name)はこの配列の中に書き込まれます。

alSourcei
こうして作ったSourceオブジェクトに、音声データを表すBufferをセットして再生できるようにするにはalSourcei関数を使います。

void alSourcei(ALuint sourceName, ALenum paramName, int value);

厄介なことに、この関数には色々なはたらきがあります。Bufferをセットすることはもちろん出来ますが、別の属性をセットすることも出来るのです。

どんな属性をセットするかは、paramName引数で決めます。Bufferをセットする場合ならこの値はAL_BUFFER(=0x1009)です。
sourceNameは主体となるSourceの名前(Name)で、valueはもちろん、セットする値です。BufferをセットしたいのならBufferの名前(Name)です。

この関数には似たような仲間にalSourcefやalSourcefvなどがあります。最後に付くiとかfとかいう文字はセットする属性の型を表します。iならint、fならfloatといったぐあいです。また、一番最後にvが付く場合がありますが、その場合には属性の型が配列になるようです。
ドキュメントには以下のように書かれています:

void alSource {n} {if} (ALuint sourceName, ALenum paramName, T value);
void alSource {n} {if}v (ALuint sourceName, ALenum paramName, T *value);


alSourcePlay
Sourceを再生するには、alSourcePlay関数を使います。

void alSourcePlay (ALuint sourceName);

いうまでもなく、sourceNameは再生するSourceの名前(Name)です。

alDeleteSources
なお、alGenSources関数で作ったSourceをデリートするにはalDeleteSources関数を使います。

void alDeleteSources(ALsizei n, ALuint *sources);

再生中にデリートすると、自動的に再生がストップします。











拍手[1回]

PR