※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後はHPのほうで更新します。
現象
画面をタッチしたら音を再生させるようにし、
画面を連続タッチしたら下記処理でエラーが出ました。
Test.m
alSourcei(source, AL_BUFFER, buffer);
if ((error = alGetError()) != AL_NO_ERROR) {
NSLog(@"Err alSourcei AL_BUFFER %x", error);
}
エラーログの内容は下記の通りです。
Err alSourcei AL_BUFFER a004
調査
al.hで調べた所、下記が一致します。
al.h
#define AL_INVALID_OPERATION 0xA004
OpenAL公式リファレンス
によると、35Pに解説がありました。
ソースの状態がAL_PLAYINGかAL_PAUSEDの時、
AL_BUFFERをするとAL_INVALID_OPERATIONが発生するそうです。
音が鳴り終わる前に、次の音を鳴らそうと準備する所でエラーが出ているようです。
対応
ソースの状態を取得し、AL_BUFFER出来ない状態なら停止させておくようにしたら、エラー出なくなりました。
Test.m
// 追加 start -----
// ソースの状態取得
alGetSourcei(mSource, AL_SOURCE_STATE, &state);
NSLog( @"alGetSourcei state:%x",state );
if ((error = alGetError()) != AL_NO_ERROR) {
NSLog(@"Err alGetSourcei AL_SOURCE_STATE %x", error);
}
// 再生中、一時停止中にソースを設定するとエラーとなるため、まず停止させる
if (state == AL_PLAYING || state == AL_PAUSED) {
alSourceStop(mSource);
}
// 追加 end -----
alSourcei(source, AL_BUFFER, buffer);
if ((error = alGetError()) != AL_NO_ERROR) {
NSLog(@"Err alSourcei AL_BUFFER %x", error);
}