2014年6月12日木曜日

SKActionを使ったサウンドの再生でハマった話。割り込み後に再生しなくなるなど。

環境:iOS 7.1.1, XCode 5.1.1
状況:SKActionを使用した音声がシステム割り込みからの復帰後に再生しなくなる

SpriteKitを使ったアプリでSEの再生をSKActionのサウンド機能を使って再生していました。
音量調節が出来ないのが難点だけど実装が楽で実に有難い。
と思っていたら思わぬ罠が。
着信などのシステム割り込みからの復帰後にSEが再生しなくなる。
調べたら出てきました。

症状
http://stackoverflow.com/questions/22978547/handling-interruptions-in-sprite-kit-cant-get-sound-effects-via-skaction-pla
対処
http://iknowsomething.com/ios-sdk-spritekit-sound/

ま た バ グ か 。

なんか遭遇しすぎて逆に本当にSpriteKit自体のバグなのか、自分が何か見落としてるだけじゃないかと不安です。
(もう一個、別の件で詰まって調べたら「SpriteKitのバグっぽい」と言われてた事があったんですが失念。思い出したら書きます。)

ともかく動いてくれなきゃ困るので上記の対策を参考にさせて頂くことに。
SKActionがBlocksを実行できることを利用した実装なので、末端のコードを書きなおさなくていいのが嬉しい。
有り難や有り難や。
というか、コレがアリならもうSKActionはなんでもありですね。

ひとまず盲目的に実装したところ、アプリ起動中にコントロールセンターを引っ張りだすと deactivateAudioSession でエラーの際に再帰呼び出しをかけてるところでエラーがいつまでも解消せず、再帰が止まらなくなりタイムアウトで落ちる。
Audio Session Programming Guide には「割り込み発生時にはシステム側で AudioSession を停止する」って書いてあるし、特定のアプリ以外は明示的に停止する必要はないらしい。 今回は特に必要でもないので soptAudio 以外では deactivateAudioSession を呼ばないように変更。
とりあえず期待通りの挙動になりました。

Appleさん、新言語のついでに bug fixも早急にお願いします。 せっかくのフレームワークも結局既存の複雑なコードを呼び出すんじゃ意味ないっス(泣)

0 件のコメント :

コメントを投稿