カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

レイテンシーの変更

このセクションではサウンドキャプチャーによるレイテンシーの設定方法を紹介します。

サウンドキャプチャーの出力を直接サウンドレンダラーにつないだ場合、録音した音が少し遅れて再生されます。この遅れをレイテンシーと呼び、DirectShowではデフォルトが500mSecに設定されています。この値はスピードが遅いコンピュータでも安全に再生できるよう配慮された数値です。高機能なサウンドカードを搭載しているコンピュータでは、もっと小さな値でも動作可能な場合があります。

このレイテンシーはサウンドキャプチャーフィルターの出力ピンが持つバッファサイズによって決まります。バッファ1枚の録音時間がすなわちレイテンシーになります。

以下に変更の手順を示します。

出力ピンの取得方法は、セクション「ピンを探す」を参照してください。

IAMBufferNegotiationインターフェースを取得します。

    IPin*                   pPin = キャプチャーフィルターの出力ピン;
    IAMBufferNegotiation*   pIAMBufferNegotiation = NULL;

    HRESULT result = pPin->QueryInterface(
        IID_IAMBufferNegotiation, (void**)&pIAMBufferNegotiation);
    if (FAILED(result))     throw result;

ALLOCATOR_PROPERTIES構造体にバッファサイズを設定します。バッファサイズは以下の計算式で示すように、ウェーブフォーマットと設定したい時間から求めます。

    WAVEFORMATEX    wfx;
    long lSize =
        wfx.nChannels * wfx.nSamplesPerSec * (wfx.wBitsPerSample / 8) * delay / 1000;

例えばデフォルトのレイテンシー500mSec・サンプリング周波数44100Hz・16Bit・ステレオでは、88200バイトとなります。

    ALLOCATOR_PROPERTIES prop;
    prop.cBuffers = 4;
    prop.cbBuffer = バッファサイズ;
    prop.cbAlign  = 1;
    prop.cbPrefix = 0;

IAMBufferNegotiation::SuggestAllocatorProperties()関数でバッファサイズを設定します。この設定は出力ピンを接続する前に行います。ピンを接続するとバッファサイズが確定するので以後は変更できません。

    result = pIAMBufferNegotiation->SuggestAllocatorProperties(&prop);
    if (FAILED(result))     throw result;

キャプチャーフィルターの接続先のピンがIAMBufferNegotiationインターフェースを支援している場合、同様にバッファサイズを設定します。支援していない場合は必要ありません。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ