iOS9でAudioUnitのSampleRateとBufferSizeがおかしい

Xcodeを6から7にして、iOS9 SDKでビルドをすると何故かAVAudioSessionのSampleRateとIOBuffeerDurationの変更が効かない。

元々やっていたこと

RemoteIOを使っていて、スピーカー出力にこんな感じのcallbackを用意していた

そして、ここで受け取るbufferを決めるためにAudioSessionでこんな風に指定していた。

つまり、サンプルレートは44100でbufferは1024ずつ。
さっきのcallbackのinNumberFrameはだいたい1024になるはず。
だけど、iOS9だと(正確に言うと、iOS9のSDKが入ったXcode7でビルドすると)inNumberFrameが940か941になる。
しかもSampleRateも44100でなく48000に勝手に切り替わる。
別にSessionの設定でエラーが出るわけでもない。
1つ分かったのがイヤホンを刺すと直る。抜くとまたダメになる。

原因はOverrideSpeaker

Sessionの初期化のタイミングとかSwiftから呼んでるからSwiftに移動したりとかいろいろ試したけど、結果として原因はこれ

これを呼ぶのをやめれば正しく動く。
これが仕様なのかiOS9のバグなのかは不明だけど、呼ぶといきなりダメになる。
スピーカーの出力は

でも切り替えられるけど、こちらでも同じ。
仕様書にこの辺の変更も書いてないし、動作としてはバグっぽいからそのうち治るとは思いますけどね。

コメントを残す