次の方法で共有


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

EvtAcxStreamPrepareHardware イベントは、ストリーミング用のハードウェアを準備するようにドライバーに指示します。

構文

EVT_ACX_STREAM_PREPARE_HARDWARE EvtAcxStreamPrepareHardware;

NTSTATUS EvtAcxStreamPrepareHardware(
  ACXSTREAM Stream
)
{...}

パラメーター

Stream

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

戻り値

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

注釈

AcxStream では、さまざまな状態がサポートされています。 これらの状態は、オーディオがフローしている (RUN 状態)、オーディオがフローしていないが、オーディオ ハードウェアが準備されている (PAUSE 状態)、またはオーディオがフローせず、オーディオ ハードウェアが準備されていない (STOP 状態) ことを示します。

EvtAcxStreamPrepareHardware イベントは、ストリームの状態を Stop 状態から Pause 状態に遷移します。 ドライバーは、DMA エンジンなど、このイベントのストリーミングに必要なハードウェア リソースを割り当てる必要があります。

ストリームが一時停止状態になると、ドライバーは EvtAcxStreamRun イベントを受け取って実行状態に切り替えるか、ドライバーが EvtAcxStreamReleaseHardware イベントを受け取って Stop 状態に移行できます。

ACX イベントは、この表で説明するように KS 状態に似ています。

開始状態 終了状態 呼び出された ACX ドライバー イベント メモ
STOP 取得 PrepareHardware ドライバーは、ハードウェアの割り当てと準備を実行します
取得 PAUSE (通話なし)
PAUSE 実行 実行
実行 PAUSE 一時停止
PAUSE 取得 (通話なし)
取得 STOP ReleaseHardware ドライバーがハードウェア割り当てを解放する

EvtAcxStreamAllocateRtPackets は EvtAcxStreamPrepareHardware の前に呼び出され、EvtAcxStreamPrepareHardware の前に RT パケットの割り当てが行われるのを許可します。

バッファー割り当てと DMA

通常、バッファー割り当ては、DMA ハードウェアで使用できるようにシステム メモリを割り当てる必要があります。 通常、バッファー割り当てはストリーミング ハードウェアには影響しません。 ハードウェアの準備フェーズは、ドライバーがストリームを実行する準備として使用されます。帯域幅の予約、DMA のプログラミング、ストリームを実行するための要求の準備の完了などのタスクを完了します。 通常、準備ハードウェア コードでは、割り当てられたバッファーを使用して DMA と関連アクティビティを準備し、ストリームを開始する準備をします。

メモリクリーンアップ

パケットの割り当て (システム上の物理メモリ) は EvtAcxStreamPrepareHardware の前に行われ、EvtAcxStreamReleaseHardware の後にリリース (EvtAcxStreamFreeRtPackets) が実行されます。 このパターンは、上位レイヤーのオーディオ ストリームセットアップ フロー (ks 割り当てバッファー prop init) に埋め込まれている既存のレガシ動作です。

ストリームのリソースの破棄は、ドライバーのストリーム コンテキストのクリーンアップ (破棄ではなく) で行うことができます。 オブジェクトのコンテキストで共有されている破棄コールバックを破棄しないでください。 このガイダンスは、すべての ACX オブジェクトに適用されます。

破棄コールバックは、最後の参照がなくなった後、不明な場合に呼び出されます。

ストリームのクリーンアップ コールバックは、ハンドルが閉じられると呼び出されます。 これに対する例外の 1 つは、ドライバーがコールバックでストリームを作成したときです。 ACX がストリーム作成操作から戻る直前にストリーム ブリッジにこのストリームを追加できなかった場合、ストリームは非同期で取り消され、現在のスレッドは create-stream クライアントにエラーを返します。 ストリームには、この時点で mem 割り当てが割り当てられません。

使用例を次に示します。

    ACX_STREAM_CALLBACKS streamCallbacks;
    ACX_STREAM_CALLBACKS_INIT(&streamCallbacks);
    streamCallbacks.EvtAcxStreamPrepareHardware     = Codec_EvtStreamPrepareHardware;
    ...
    status = AcxStreamInitAssignAcxStreamCallbacks(StreamInit, &streamCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
Codec_EvtStreamPrepareHardware(
    _In_ ACXSTREAM Stream
    )
{
    PSTREAM_CONTEXT ctx;
    NTSTATUS        status;

    PAGED_CODE();

    ctx = GetStreamContext(Stream);

    status = AllocateStreamHardware(Stream);

    if (NT_SUCCESS(status))
    {
        ctx->StreamState = AcxStreamStatePause;
    }

    return status;
}

ACX の要件

最小 ACX バージョン: 1.0

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

要件

要件
Header acxstreams.h
IRQL PASSIVE_LEVEL

こちらもご覧ください