プログラムをしているとたった一行だけのはずなのに何故か動かなかったりすることがあるかと思います。時々そんな一行をやらかすのですが、本日この一行で1時間ほどハマってました。

  • 正常動作
[[Audio instance] play:[[AudioSource alloc] initWithPath:@"bgm.m4a"]];
  • 異常動作
AudioSource *source = [[AudioSource alloc] initWithPath:@"bgm.m4a"];
[[Audio instance] play:source];

コードだけ見ると要はAudioSourceのインスタンス確保と初期化、そしてAudioクラスによる再生を行っています。Audioクラスはsingletonにより管理されていて常に唯一のインスタンスを返し、サウンド(ソース)の再生・停止を行います。

が、このAudioクラスが自分で作ったにも関わらずハマったという情けない話で、Audioクラスが最初にインスタンス化される際にはinitメソッドをコールするようになっています。つまりは、singletonクラスメソッドであるinstanceをコールした際にはご丁寧にもOpenALの初期化まで行っています。

ここまで書くと答えは明白で、異常動作のほうはOpenALの初期化前にALBufferを確保しようとして失敗していたと。たった一行や二行でも本気でわからないものです。

ちなみにこのオチに気がついたのが隣の同僚に「なんでだろ~」と聞いていた最中でふと思いつきました。その同僚はObjective-Cを知らないというのに無茶振り質問したわけなんですが・・・。いざ話してみると見落としがちな部分も気がつくものですね。

# 話す前に自分で気がつけって?、うん、自分でもそうしたいのですけどね。巧く行かないものなんです orz