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 事件會將數據流狀態從 [停止] 狀態轉換為 [暫停] 狀態。 驅動程式應該配置此事件中串流所需的任何硬體資源,例如 DMA 引擎。
一旦數據流處於Pause狀態,驅動程式可能會收到 EvtAcxStreamRun 事件以轉換至 [執行] 狀態,或驅動程式可能會收到 EvtAcxStreamReleaseHardware 事件,以轉換為 Stop 狀態。
ACX 事件類似於 KS 狀態,如下表所述。
啟動狀態 | 結束狀態 | 呼叫 ACX 驅動程式事件 | 備註 |
---|---|---|---|
STOP | 獲得 | PrepareHardware | 驅動程式會執行硬體配置和準備 |
獲得 | PAUSE | (無通話) | |
PAUSE | RUN | 執行 | |
RUN | PAUSE | 暫停 | |
PAUSE | 獲得 | (沒有呼叫) | |
獲得 | STOP | ReleaseHardware | 驅動程式釋放硬體配置 |
EvtAcxStreamAllocateRtPackets 會在 EvtAcxStreamPrepareHardware 之前呼叫,以允許在 EvtAcxStreamPrepareHardware 之前進行 RT 封包配置。
緩衝區配置和 DMA
緩衝區配置通常只牽涉到配置系統記憶體的方式,以便與 DMA 硬體搭配使用。 一般而言,緩衝區配置不會對串流硬體有任何影響。 準備硬體階段是用來讓驅動程式準備好執行數據流,方法是完成保留頻寬、程序設計 DMA 等工作,以及完成要求執行數據流的準備。 一般而言,準備硬體程序代碼會利用配置的緩衝區來準備 DMA 和相關活動,以便開始數據流。
記憶體清除
在 EvtAcxStreamPrepareHardware 之前,封包配置 (系統上) 實體記憶體完成,而且其發行 (EvtAcxStreamFreeRtPackets) 會在 EvtAcxStreamReleaseHardware 之後完成。 此模式是內嵌在上層音訊數據流設定流程中的現有舊版行為, (ks 配置緩衝區屬性 init) 。
數據流資源的處置可以在驅動程序的數據流內容清除中完成, (不會終結) 。 絕對不要處置對象內容終結回呼中共用的任何專案。 本指南適用於所有 ACX 物件。
當最後一個 ref 消失之後,就會叫用終結回呼,但未知。
當句柄關閉時,會呼叫數據流的清除回呼。 這是驅動程式在其回呼中建立數據流時的其中一個例外狀況。 如果 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 版本概觀。
規格需求
需求 | 值 |
---|---|
標頭 | acxstreams.h |
IRQL | PASSIVE_LEVEL |