AVFoundationで、プログラムは何度見返しても絶対正しいし、シミュレータだと音がなるのになぜか実機だと音がならないということがあった。
ちなみに試していたのはAVAudioEngineとAVAudioUnitSamplerを使ったMIDIをならすための簡単な処理。サウンドフォント(sf2ファイル)を使うときも使ってないときも同様。
ちなみに、同時に録音したボイスをならす機能もあるのだがそちらはなぜかちゃんと聞こえる。一体何なのか非常に悩んだ。
で、結局原因はというとAVAudioSessionのsetCategoryだった。上記にも書いたとおり、MIDIの処理とボイス用の処理があり、それぞれ別クラスになっていた。まずMIDIクラスを初期化し、次にVoiceクラスを初期化していたのだが、そのVoiceクラスのコンストラクタでsetCategoryしていた。そのためMIDIクラス側が無効になってしまっていたっぽい。
なぜ実機だけなのかはわからないが。端末全体の音をならす部分の数の問題とかかもしれない。
なにはともあれ、各クラスを初期化する前に下記を書いたら両方ちゃんと動作するようになった。
let session = AVAudioSession.sharedInstance()
try session.setCategory(
AVAudioSession.Category.playAndRecord,
options: AVAudioSession.CategoryOptions.mixWithOthers
)
try session.setActive(true)
とにかくあまり詳しくないため別の原因や正しい処理方法などあるかもしれないので各々適宜要調査だと思われる。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント