硬體事件
某些音訊裝置提供硬體音量控制 Knob、靜音開關,或其他類型的手動控制項。 應用程式可以藉由調整音量或變更播放音訊資料流程的方式,來回應這些控制項中的變更。 當使用者調整硬體控制項時,迷你埠驅動程式會使用 IPortEvents 介面來通知埠驅動程式發生硬體事件。 埠驅動程式接著會通知事件的應用程式,以便從裝置讀取新的控制項設定。
您的迷你埠驅動程式可以在服務Init呼叫時查詢IPortEvents介面的埠驅動程式, (請參閱IMiniportWavePci::Init,例如從埠驅動程式) 。 在 Microsoft Windows 98 SE、Windows Me 和 Windows 2000 和更新版本上,該查詢會成功。 如需程式碼範例,請參閱舊版 Windows 驅動程式套件中的 Sb16 範例音訊配接器 (WDK) 。
當埠驅動程式呼叫驅動程式的 IMiniport::GetDescription 方法時,此方法會輸出 PCFILTER_DESCRIPTOR 結構,以指定裝置支援的事件。 事件可以在自動化資料表中指定PCFILTER_DESCRIPTOR的 Pins 和 Nodes 成員,以及在 AutomationTable 成員中,指向篩選本身的自動化資料表。 每個事件都是由 PCEVENT_ITEM 結構指定。 您的驅動程式應該將PCEVENT_ITEM結構的 Set 和 Id 成員設定為 KSEVENTSETID_AudioControlChange 和 KSEVENT_CONTROL_CHANGE,並將驅動程式 EventHandler 常式的指標載入 處理常式 成員。 您的驅動程式也應該在 Flags 成員中設定PCEVENT_ITEM_FLAG_BASICSUPPORT位,以指出控制變更事件的基本支援,而且應該設定PCEVENT_ITEM_FLAG_ONESHOT和/或PCEVENT_ITEM_FLAG_ENABLE位,以指出它支援單次和/或週期性通知。
當應用程式稍後呼叫混合器Open函式 (Microsoft Windows SDK檔中所述,) 要求特定事件的通知時,埠驅動程式接著會使用指向PCEVENT_REQUEST結構的指標呼叫驅動程式的 EventHandler常式。 這個結構的 Verb 成員會設定為 PCEVENT_VERB_ADD,而其 EventItem 成員會指定要啟用的事件。 PCEVENT_REQUEST結構也包含驅動程式應該視為不透明系統資料的 KSEVENT_ENTRY 結構的指標。 啟用事件之後,您的處理常式應該使用相同的KSEVENT_ENTRY指標呼叫 IPortEvents::AddEventToEventList 。 透過此呼叫,處理常式會確認事件已啟用。
當硬體事件發生且驅動程式的插斷服務常式偵測到靜音或磁片區變更時,您的驅動程式會呼叫 IPortEvents::GenerateEventList ,並使用描述事件的一組參數,向埠驅動程式發出事件訊號。 例如,下列呼叫描述行出磁片區節點中的控制項變更:
pPE->GenerateEventList(NULL, KSEVENT_CONTROL_CHANGE,
FALSE, ULONG(-1), TRUE, LINEOUT_VOL);
在此呼叫期間,埠驅動程式會搜尋其事件清單,尋找符合呼叫參數的所有事件,並將通知傳送給監視這些事件的用戶端。 在此範例中,pPE 是 IPortEvents 物件的指標,LINEOUT_VOL是迷你埠驅動程式指派給行出磁片區節點的節點識別碼。 上述範例中未指定的參數 (例如事件集 GUID 和釘選識別碼,) 會被視為萬用字元,而且一律符合清單中的對應參數。