次の方法で共有


EVT_ACX_STREAM_GET_CAPTURE_PACKET コールバック関数 (acxstreams.h)

EvtAcxStreamGetCapturePacket は、ドライバーがパケットの充填を開始した時点の QPC 値を含め、最後に入力されたパケット (0 ベース) をドライバーに指示します。

構文

EVT_ACX_STREAM_GET_CAPTURE_PACKET EvtAcxStreamGetCapturePacket;

NTSTATUS EvtAcxStreamGetCapturePacket(
  ACXSTREAM Stream,
  PULONG LastCapturePacket,
  PULONGLONG QPCPacketStart,
  PBOOLEAN MoreData
)
{...}

パラメーター

Stream

ACXSTREAM オブジェクトは、回線によって作成されたオーディオ ストリームを表します。 ストリームは、親回線の要素に基づいて作成された要素の一覧で構成されます。 詳細については、「 ACX - ACX オブジェクトの概要」を参照してください。

LastCapturePacket

最後にキャプチャされたパケットの位置を示す値。 これは、キャプチャされたデータの完全なパケットの数を示す 0 から始まるインデックスです。

QPCPacketStart

最後にキャプチャされたパケットの開始時刻を示す値。

MoreData

準備が整ったデータがすぐにある場合は TRUE を返します。 OS は、必要に応じて、パケットの処理後すぐにこのルーチンを再度呼び出して、次のパケット情報を取得できます。 ドライバーが FALSE を返す場合、キャプチャはリアルタイムで動作しています。

戻り値

STATUS_SUCCESS呼び出しが成功した場合は を返します。 それ以外の場合は、適切なエラー コードを返します。 詳細については、「 NTSTATUS 値の使用」を参照してください。

注釈

キャプチャされたオーディオ データをオーディオ バッファーから読み取る前に、OS はこのルーチンを呼び出して、使用可能なデータに関する情報を取得します。

パケット番号は、ストリーム内のパケットを識別します。 ストリームに対して EVT_ACX_STREAM_RELEASEHARDWARE が呼び出されると、これは 0 にリセットされます。 この数値は、キャプチャされた各バッファーで進みます。 OS は、パケット番号からオーディオ バッファー内のパケットの場所を派生させることができます。また、ストリームの開始を基準にしてパケットのストリーム位置を派生させることもできます。

OS は、いつでもこのルーチンを呼び出します。 通常の操作では、ドライバーが AcxRtStreamNotifyPacketComplete を呼び出した後、または以前の呼び出しが MoreData に対して true を返した後に、OS によってこのルーチンが呼び出されます。 OS がこのルーチンを呼び出すと、ドライバーは、OS が以前のすべてのパケットの読み取りを完了したと見なす場合があります。 ハードウェアが十分なデータをキャプチャした場合、ドライバーは次の完全なパケットをオーディオ バッファーにすぐにバーストし、AcxRtStreamNotifyPacketComplete をもう一度呼び出すことができます。 キャプチャ オーバーフローの場合 (OS がデータを十分に速く読み取らない場合)、オーディオ ドライバーが一部のオーディオ データを削除または上書きする可能性があります。 オーディオ ドライバーは、最初に最も古いデータを削除または上書きします。 オーディオ ドライバーは、OS がデータを読み取っていない可能性がある場合でも、内部パケット カウンターを進め続ける可能性があります。

使用例を次に示します。

#pragma code_seg("PAGE")
NTSTATUS
CodecC_EvtStreamGetCapturePacket(
    _In_ ACXSTREAM          Stream,
    _Out_ ULONG           * LastCapturePacket,
    _Out_ ULONGLONG       * QPCPacketStart,
    _Out_ BOOLEAN         * MoreData
)
{
    PCODEC_STREAM_CONTEXT ctx;
    CCaptureStreamEngine* streamEngine = nullptr;
    ULONG currentPacket;
    LONGLONG qpcPacketStart;

    PAGED_CODE();

    ctx = GetCodecStreamContext(Stream);
    // Retrieve the current packet that is being written to by the audio hardware
    currentPacket = (ULONG)InterlockedCompareExchange((LONG*)&ctx->CurrentPacket, -1, -1);
    qpcPacketStart = InterlockedCompareExchange64(&ctx->LastPacketStart.QuadPart, -1, -1);

    // The Last capture packet is the packet before the current packet.
    *LastCapturePacket = currentPacket - 1;
    *QPCPacketStart = (ULONGLONG)qpcPacketStart;
    *MoreData = FALSE;

    return STATUS_SUCCESS;
}

ACX の要件

最小 ACX バージョン: 1.0

ACX バージョンの詳細については、「 ACX バージョンの概要」を参照してください。

要件

要件
Header acxstreams.h
IRQL PASSIVE_LEVEL

こちらもご覧ください