一部のオーディオ デバイスには、ハードウェアボリュームコントロールノブ、ミュートスイッチ、またはその他の種類の手動コントロールが用意されています。 アプリケーションは、ボリュームを調整するか、オーディオ ストリームの再生方法を変更することで、これらのコントロールの変更に対応できます。 ユーザーがハードウェア コントロールを調整すると、ミニポート ドライバーは IPortEvents インターフェイスを使用して、ハードウェア イベントが発生したことをポート ドライバーに通知します。 ポート ドライバーは、デバイスから新しい制御設定を読み取ることができるように、イベントのアプリケーションに通知します。
ミニポート ドライバーは、ポート ドライバーからの Init 呼び出し (IMiniportWavePci::Init など) をサービスする時点で、IPortEvents インターフェイスのポート ドライバーを照会できます。 Microsoft Windows 98 SE、Windows Me、Windows 2000 以降では、そのクエリは成功します。 コード例については、以前のバージョンの Windows Driver Kit (WDK) の Sb16 サンプル オーディオ アダプターを参照してください。
ポート ドライバーがドライバーの IMiniport::GetDescription メソッドを呼び出すと、デバイスがサポートするイベントなどを指定する PCFILTER_DESCRIPTOR 構造体が出力されます。 イベントは、PCFILTER_DESCRIPTORの ピン と ノード のメンバーのオートメーション テーブルと、フィルター自体のオートメーション テーブルを指す AutomationTable メンバーで指定できます。 各イベントは、 PCEVENT_ITEM 構造体によって指定されます。 ドライバーは、PCEVENT_ITEM構造体の Set メンバーと Id メンバーを KSEVENTSETID_AudioControlChange および KSEVENT_CONTROL_CHANGEに設定し、ドライバーの EventHandler ルーチンへのポインターを ハンドラー メンバーに読み込む必要があります。 ドライバーは、コントロール変更イベントの基本的なサポートを示すように Flags メンバーのPCEVENT_ITEM_FLAG_BASICSUPPORT ビットを設定する必要があります。また、1 回の通知または定期的な通知をサポートすることを示すPCEVENT_ITEM_FLAG_ONESHOTビットまたはPCEVENT_ITEM_FLAG_ENABLE ビットを設定する必要があります。
アプリケーションが後で mixerOpen 関数 (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はミニポート ドライバーがラインアウト ボリューム ノードに割り当てるノード ID です。 指定されていないパラメーター (前の例のイベント セット GUID やピン ID など) はワイルドカードとして扱われ、常にリスト内の対応するパラメーターと一致します。