2007年11月06日 23:59

途中まで書いたのに、間違って消してしまったらなえるよね?

まじ萎えた

どうしようもない


さて、高専祭がおわりました
まじ疲れた、、、
ちびの相手はしんどんなw

今回の高専祭はぐだぐだでしたね
なんというかだめだめだった
しかし、いい経験ではあった
来年はいい高専祭にできる予感がする
今後がんばろうと思う

以降、プログラムの話


てなわけで、openALの覚書でもかこうかと、
とりあえず、ここのソースでも解説してみる
このソースは自由に複製していいらしい
てなわけで、勝手につかわしてもらってます

まず、
ALCdevice *alcOpenDevice(const ALCchar *devicename);
名のとおり、デバイスをオープンする関数
devicenameにはオープンにするディバイスを指定します。
ここをNULLにすると、適当にいいやつをオープンするみたい?
"DirectSound3D"とかも指定できるみたいだけど、NULLが楽みたいだ
こだわりたいなら、openALSDKのサンプルソースのFrameworkをじっくりよんでくれ
返り値がNULLだと、エラー

つぎ、
ALCcontext * alcCreateContext(ALCdevice *device,ALCint* attrlist);
同じく名のとおり、コンテキストを作る
deviceにはalcOpenDeceiceで開いたディバイスを指定する。
attrlistはいろいろ指定できるみたいだが、NULLが楽チンみたい
ディバイスは基本的にプログラム中にひとつだが、コンテキストは複数作ることができるらしい。
ここのイメージがわかりやすい
返り値がNULLなら失敗

つぎ、
ALCboolean alcMakeContextCurrent(ALCcontext *context);
コンテキストをカレントにする
要はそのコンテキストを使用するようにする
ALC_TRUEなら成功、ALC_FALSEなら成功

ここまでが、alcによるopenALの準備の部分
環境を超えてopenALが使用できるようになる

で、つぎからがopenALの本体
void alGenBuffers(ALsizei n,ALuint *buffers);
バッファを生成する
nに生成するバッファの数
buffersには作成したバッファの名前のを保存するための配列を指定します
配列はn個以上ないと、困る、当たり前だけど
ちなみに名前といってもただの整数値

次の行は音のデータを作成している

つぎ、
void alBufferData(ALuint buffer,ALenum format,const ALvoid *data,ALsizei size,ALsizei freq);
バッファにデータを入れる
データ入れるデータのフォーマットはPCMらしい
bufferにはデータを入れたいバッファの名前を指定
formatにはデータのフォーマット
AL_FORMAT_MONO8
AL_FORMAT_MONO16
AL_FORMAT_STEREO8
AL_FORMAT_STEREO16
の中から最適なものを選ぶ
dateにはデータを指定
sizeはデータのサイズ指定
freqには周波数を指定(多分、、、、)
なんか、ほかにもいろいろ説明書いてあったけど、よくわからん
英語読める方はちょっとよんでくれ

つぎ、
void alGenSources(ALsizei n,ALuint *sources);
ソースを生成する
alGenBuffersのbuffersがsourcesに変わっただけ

つぎ、
void alSourcei(ALuint source,ALenum param,ALint value);
ソースにintの値を指定する
alSource*の一種
*に入る型によって役割は若干かわる
sourceに設定するソースを指定
paramに設定する項目
valueに値を指定する
paramにAL_BUFFERを指定した場合はソースにバッファを割り当てる
valueには割り当てたいバッファを指定する

つぎ、
void alSourcePlay(ALuint source);
ソースに割り当てられているバッファを再生する
sourceに再生したいソースを指定する
sourceを再生状態(AL_PLAYING)にする
もし、すでに再生状態なら、最初から再生しなおす
もし、割り当てているバッファが再生し終わっているなら、停止状態(AL_STOPED)にする

つぎの
sleep(1);
はMacOSXの関数なので、windows.hをインクルードし、
Sleep(1000);
書き換える

つぎ、
void alSourceStop(ALuint source);
ソースに割り当てられているバッファを停止する
sourceに停止するソースを指定する
sourceを停止状態(AL_STOPED)にする

つぎ、
void alDeleteSources(ALsizei n,ALuint *sources);
ソースを消去する
nに消去する数
sourcesに消去するソースの配列を指定する

つぎ、
void alDeleteBuffers(ALsizei n,ALuint *buffers);
バッファを消去する
ソースを同じ

つぎ、
alcMakeContextCurrent(NULL);
と、コンテキストをカレントから解除している
これをしないと、コンテキストを消去できない

つぎ、
void alcDestroyContext(ALCcontext *context);
まんま、コンテキストの消去

つぎ、
ALCboolean alcCloseDevice(ALCdevice *device);
まんま、ディバイスをクローズする
成功ならALC_TRUE、失敗ならALC_FALSEを返す
ディバイスをクローズすると、コンテキストとソースは使えなくなる

てなわけで、全部解説してみた
最後のほう適当だな、、、ねむいのよ
一応、出てきたすべての関数の解説を読みながらかいた
とはいっても、俺の英語力は低いのでかなり適当に意味を捉えている
あと、俺の予想で文章を書いているところがあるので、要注意

結構勉強になった気がする
できれば次はogg vorbis再生コードの解説もやりたいところ

コメントする

名前
 
  絵文字
 
 
コメント
  • ライブドアブログ