Posted at

iOSアプリ開発:OpenALで音連続再生時にエラー発生

More than 3 years have passed since last update.


現象

画面をタッチしたら音を再生させるようにし、

画面を連続タッチしたら下記処理でエラーが出ました。


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);
}