Date

Windows Core Audio, キャプチャフォーマットを決定の続き

フォーマットが決まったので、排他モードでIAudioClientを初期化する。

デバイスピリオドを取得する。デバイスピリオドは、エンドポイント上で処理されるデータが、どの程度連続処理されるかを表したものである。IAudioClient::GetDevicePeriodで取得できる。 取得される値はREFERENCE_TIME型で100ナノ秒単位となる。

1
2
REFERENCE_TIME minimum_device_period=0;
    hr=pAudClient->GetDevicePeriod(NULL, &minimum_device_period);

IAudioClientをIAudioClient::Initializeで初期化する。引数として、共有または排他モードの指定、バッファサイズ、デバイスピリオドなどを指定する。バッファサイズとデバイスピリオドには、さきほど取得した値を渡す。

1
2
3
4
5
6
7
hr=pAudClient->Initialize(
        AUDCLNT_SHAREMODE_EXCLUSIVE, 0
        ,minimum_device_period //The buffer capacity as a time value
        ,minimum_device_period //The device period.
        ,(WAVEFORMATEX*)wfxe
        ,&GUID_NULL);
    CoTaskMemFree(wfxe);

IAudioClient::GetService を使ってIAudioClientから追加のサービスを取得する。特にキャプチャにおいては、エンドポイントから入力したバッファにアクセスするためにIAudioCaptureClientが必要となる。 IAudioClock は必須ではないが、再生またはキャプチャ時におけるストリーム上の位置(単調増加する値)や周波数を取得できる。オーディオクロックに同期するアプリケーションを作成するときは、この値を参照すると良いだろう。

1
2
hr=pAudClient->GetService(__uuidof(IAudioCaptureClient), (void**)&pCapClient);
    hr=pAudClient->GetService(__uuidof(IAudioClock), (void**)&pClock);

エンドポイント上のバッファサイズとレイテンシを取得してみる。

1
2
3
4
5
6
7
    // バッファサイズとレイテンシを取得
    UINT32 buf_size;
    REFERENCE_TIME latency;
    pAudClient->GetBufferSize(&buf_size);
    pAudClient->GetStreamLatency(&latency);
    DebugMsg(_T("Buffer Size=%d Latency=%I64dms minimum_device_period=%I64d"),
        buf_size, latency/REFTIMES_PER_MILLISEC, minimum_device_period);

ちなみに UA-101 では、次のような結果になった。

1
Buffer Size=1728 Latency=3ms minimum_device_period=30000 freq=96000

Comments

comments powered by Disqus