SpeakHere サンプルから必要な部分だけを取り出す形でサウンドの再生を行っていたのですが、それでもまだときどきサウンドが再生できなくなってしまう場合がある。
まず重要な部分の結論を書いておくと、先日解決したと思っていたフレームワークのバージョン問題は、まったく関係ありませんでした。2.0 でも 2.1 でも 2.2 でも、Speak Here のオーディオ再生のコードはちゃんと機能します。誤解を与えてしまった方がいらっしゃいましたら、申し訳ありません m(__)m。
なぜだろうと悩んでいたのですが、ふとベースにあるのが OpenAL なのに、初期化のためのコードを1行も書いてないことに思い至って、解決。そりゃあ再生できてたのが奇跡だよなあ (__;。
void audioInterruptionListenerCallback(void *inUserData, UInt32 interruptionState)
{
}
こんなコールバック関数を用意しておいて、UIApplication の delegate で、
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, self);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
AudioSessionSetActive(true);
// Override point for customization after app launch
[window addSubview:viewController.view];
[window makeKeyAndVisible];
}
として、オーディオ再生を初期化してやると、ちゃんと再生できるようになったのでした。初期化のタイミングも、applicationDidFinishLaunching: くらい as soon as possible じゃないとダメみたい。
あと、2.2 の開発環境では、iPhone シミュレータでオーディオ再生がシミュレートできなくなるという問題が起こっていたのですが、どうも 2.2 のシミュレータは /Library/QuickTime に入っているコンポーネントをいちいち読み込もうとするのが問題らしい。こんな感じのエラーが出ます。
2008-12-14 14:48:52.681 AudioTest[37296:20b] Error loading /Library/QuickTime/DivX Decoder.component/Contents/MacOS/DivX Decoder: dlopen(/Library/QuickTime/DivX Decoder.component/Contents/MacOS/DivX Decoder, 262): Symbol not found: _SCDynamicStoreCopyConsoleUser
ということで、
- DivX Decoder.component
- Motion.component
- LiveType.component
の3つのコンポーネントを /Library/QuickTime から取り除いたら、問題なくシミュレータ上でオーディオ再生できるようになりました。高性能すぎるエミュレーションも考えもの。
ちなみに、iPhone シミュレータのメニューから、「ハードウェア」-「バージョン」で「2.1」や「2.0」にしてもちゃんと音が出ますけど、ちょっとめんどい。
コメントを書く