iOSのCoreAudioにおいて,auGraphで接続したNewTimePitchが働かない
iPod-touch (or iPhone)で使用するアプリとして,Xcodeを使い,言語はSwiftを用いて,iOSのCoreAudioを用いた音声処理のプログラムを作成中です.
Mic → remoteIOUnit → nBandEQUnit → reverbUnit → NewTimePitchUnit → remoteIOUnit → earPhone という流れで,これら(に並行して設けたNode)をauGraphで接続しています.
NewTimePitchUnitのパラメータは,リアルタイムの利用なので,rateは1に固定です.
pitchShiftは,なし(0セント),1オクターブダウン(-1200セント),2オクターブダウン(-2400セント)が選べるようにしてあります.
StreamFormatは,NewTimePitchUnitのStreamFormatをモノラルに修正したものを,すべてのUnitの入力側と出力側にセットしています.(それでエラーは出ません)
実機としてiPod-touchを用いて動作確認をしています.(simulator上では,Micが見つからないらしく,動作確認ができません.これはVMwareとXcodeとの相性の問題のようです)
なお,どのAPIを呼ぶ時も,その返り値のステータスをチェックして,エラーがあれば表示するようにして,エラーが表示されない所までバグをとりました.
しかし,NewTimePitchUnitを接続した時に限り,全く音声が出ません.NewTimePitchUnitをauGraphの経路から除けば,Micの音がearPhoneから出ます.エラー表示がされないので,NewTimePitchUnitを接続した時に音が出ない理由が何なのか一向に判らず途方に暮れております.
なお,'New'をとったTimePitchを試そうとしたら,「NewTimePitchを使え」とXcodeに直されてしまいました.
NewTimePitchUnitは,Micからの音声の処理はできない仕様なのでしょうか.説明にはrealtimeで使えるとあるようですが.
NewTimePitchUnitをrealtimeで使う経験をされた方がいらしたら,教えていただきたく思いますので,よろしくお願いいたします.
上記の問題,自己解決しましたので,自分で解答します.
realtime利用を目指していたので,遅れ時間をできるだけ短くしようと考え,session parameterの一つのioBufferDurationを0.006秒に設定していました.これはバッファー長256に相当します.
試みにこの設定箇所をコメントアウトしてBuildしたところ,NewTimePitchが働きました.ということは,ioBufferDurationは0.023秒で,バッファー長1024というになります.他の短い値(0.012秒とか)で試したところ,NewTimePitchのみ働きませんでした.ということはNewTimePitchのBuffer長は1024固定のようです.
ということで,当初の疑問は解決しました.しかし結果として,全体の遅れが大きいです.realtimeとは言い難いほど遅れます.残念ですが.