前回の続き。
前回の実装では周期的に音が断続的になる不具合がありました。
ManualRecordingでない場合は、この現象が発生していなかったので、どこかでバッファが枯渇しているのでは? と当たりをつけて修正していきます。
上記関数のinNumberFrames
は毎回1024
で呼び出されていました。
一方で、ここのinNumberOfFrames
は基本1024
であるものの、周期的に1023
や1025
が登場するようでした。
毎回AudioRecorderInputCallback
でreadした分をそのまま返していたので、要求されたフレーム数に関係なく1024
フレーム分を返していたことになります。
てっきり同じ回数呼び出されるので同じフレーム数だろうと思っていましたが、ダウンサンプリングしているせいか割り切れなかった分の誤差が発生しているようです。
誤差程度のずれしか発生していないので、以下のようなバッファを保持することで対応します。
これで音が断続することはなくなったものの、AVAudioEngineManualRenderingBlock
の呼び出しの中では何が起きているのかが謎に包まれていて消化不良感が否めない……