次の方法で共有


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 イベントを受け取ることがあります。

ACX イベントは、次の表に示すように KS 状態に似ています。

開始状態 終了状態 呼び出された ACX ドライバー イベント 筆記
止める 取得する PrepareHardware ドライバーがハードウェアの割り当てと準備を実行する
取得する 休止 (通話なし)
休止 走る 走る
走る 休止 休止
休止 取得する (通話なし)
取得する 止める ReleaseHardware ドライバーがハードウェア割り当てを解放する

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

バッファー割り当てと DMA

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

メモリクリーンアップ

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

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

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

ストリームのクリーンアップ コールバックは、ハンドルが閉じられたときに呼び出されます。 これに対する 1 つの例外は、ドライバーがコールバックでストリームを作成したときです。 ストリーム作成操作から戻る直前に ACX がこのストリームをストリーム ブリッジに追加できなかった場合、ストリームは非同期で取り消され、現在のスレッドは作成ストリーム クライアントにエラーを返します。 ストリームには、この時点で 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 バージョンの概要 参照してください。

必要条件

要件 価値
ヘッダー acxstreams.h
IRQL PASSIVE_LEVEL

関連項目