質問
次の構造を持つ非常に単純な iOS Core Audio アプリケーションがあります。
Remote I/O Unit Input Bus --> Render Callback --> Remote I/O Unit Output Bus
リモート I/O 出力バスによって呼び出されるレンダー コールバック関数は、リモート I/O 入力バスで呼び出すことにより、入力ハードウェアからサンプルをプルしますAudioUnitRender()
。次に、これらのサンプルを処理/影響を与え、提供された に書き込みAudioBufferList*
、戻り、影響を受けたサンプルを出力ハードウェアを介して再生させます。すべてうまくいきます。
私の質問は、次の正確な時間をどのように知るか、または計算できるかです。
- サンプルは入力ハードウェアによってキャプチャされました
- サンプルは実際に出力ハードウェアで再生されました
討論
構造体は、有効な, &値AudioTimeStamp
とともにレンダー コールバックに渡されます。このタイムスタンプが何を反映しているかは、私にははっきりとわかりません。ドキュメントには次のように記載されています。mHostTime
mSampleTime
mRateScalar
inTimeStamp Audio Unit render のこの呼び出しに関連付けられたタイムスタンプ。
これは、レンダリングが呼び出された時間を表しているように聞こえますが、入力サンプルがキャプチャされ、出力サンプルがレンダリングされる時間と (関係があるとすれば) どのように関係しているのでしょうか?
オンラインのいくつかのリソースでは、現在のホスト時間を使用mach_absolute_time()
またはCACurrentMediaTime()
計算することについて話していますが、現在のホスト時間から過去または将来のホスト時間への接続を確立できないようです。
次の Apple メーリング リスト スレッドからの引用では、過去の入力データと将来の出力データの両方に個別のタイム スタンプを含む 3 つのタイム スタンプについて説明しています。これはまさに私が探しているものですが、これは OS X で実行され、AUHAL I/O を使用していると思います。iOS でこれらのタイム スタンプを取得する方法が見つかりません。
したがって、CoreAudio の動作は、I/O proc が起動して 3 つのタイムスタンプを提供するというものです。(1) 入力データのタイムスタンプです。これは常に、少なくとも過去のバッファ サイズになります (2) 現在のタイム スタンプです - I/O proc が起動されて実行されたとき (3) は、提供する出力データのタイム スタンプです。これは、常に将来のある時点です。通常は、将来のバッファ サイズです。( http://lists.apple.com/archives/coreaudio-api/2005/Sep/msg00220.html )
明らかな何かが欠けているのではないかと思うので、誰かがこれに光を当ててくれることを願っています。
前もって感謝します。