9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2014-10-26

※個人で管理している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);
}
9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?