Freigeben über


Hardwareereignisse

Einige Audiogeräte bieten Hardware-Lautstärkeregler, Stummschaltschalter oder andere Arten manueller Steuerelemente. Anwendungen können auf Änderungen in diesen Steuerelementen reagieren, indem sie die Lautstärke anpassen oder die Wiedergabe des Audiodatenstroms auf andere Weise ändern. Wenn der Benutzer ein Hardwaresteuerelement anpasst, verwendet der Miniporttreiber die IPortEvents-Schnittstelle , um den Porttreiber darüber zu informieren, dass ein Hardwareereignis aufgetreten ist. Der Porttreiber benachrichtigt wiederum die Anwendung des Ereignisses, damit er die neue Steuerelementeinstellung vom Gerät lesen kann.

Ihr Miniporttreiber kann den Porttreiber für die IPortEvents-Schnittstelle abfragen, wenn der Init-Aufruf (z. B . IMiniportWavePci::Init) vom Porttreiber aus ausgeführt wird. Unter Microsoft Windows 98 SE, Windows Me und Windows 2000 und höher ist diese Abfrage erfolgreich. Ein Codebeispiel finden Sie im Sb16-Beispiel-Audioadapter in früheren Versionen des Windows Driver Kit (WDK).

Wenn der Porttreiber die IMiniport::GetDescription-Methode Ihres Treibers aufruft, gibt die -Methode eine PCFILTER_DESCRIPTOR-Struktur aus, die unter anderem die von Ihrem Gerät unterstützten Ereignisse angibt. Ereignisse können in den Automatisierungstabellen für die Member Pins und Nodes von PCFILTER_DESCRIPTOR und im AutomationTable-Element angegeben werden, das auf die Automatisierungstabelle für den Filter selbst verweist. Jedes Ereignis wird durch eine PCEVENT_ITEM-Struktur angegeben. Ihr Treiber sollte die Set - und ID-Member der PCEVENT_ITEM Struktur auf KSEVENTSETID_AudioControlChange und KSEVENT_CONTROL_CHANGE festlegen und einen Zeiger auf die EventHandler-Routine Ihres Treibers in das Handler-Element laden. Ihr Treiber sollte auch das PCEVENT_ITEM_FLAG_BASICSUPPORT Bit im Flags-Member festlegen, um die grundlegende Unterstützung für Steuerelementänderungsereignisse anzugeben, und er sollte die PCEVENT_ITEM_FLAG_ONESHOT und/oder PCEVENT_ITEM_FLAG_ENABLE Bits festlegen, um anzugeben, dass einmalige und/oder wiederkehrende Benachrichtigungen unterstützt werden.

Wenn eine Anwendung später die Funktion mixerOpen aufruft (in der Microsoft Windows SDK-Dokumentation beschrieben), um eine Benachrichtigung über ein bestimmtes Ereignis anzufordern, ruft der Porttreiber dann die EventHandler-Routine Ihres Treibers mit einem Zeiger auf eine PCEVENT_REQUEST-Struktur auf. Das Verb-Element dieser Struktur ist auf PCEVENT_VERB_ADD festgelegt, und sein EventItem-Member gibt das zu aktivierende Ereignis an. Die PCEVENT_REQUEST-Struktur enthält auch einen Zeiger auf eine KSEVENT_ENTRY Struktur, die Ihr Treiber als undurchsichtige Systemdaten behandeln sollte. Nach dem Aktivieren des Ereignisses sollte Ihr Handler IPortEvents::AddEventToEventList mit demselben KSEVENT_ENTRY-Zeiger aufrufen. Mit diesem Aufruf bestätigt der Handler, dass das Ereignis aktiviert ist.

Wenn das Hardwareereignis auftritt und die Interrupt-Service-Routine Ihres Treibers eine Stummschaltung oder eine Volumeänderung erkennt, signalisiert Ihr Treiber das Ereignis an den Porttreiber, indem er IPortEvents:GenerateEventList mit einer Reihe von Parametern aufruft, die das Ereignis beschreiben. Der folgende Aufruf beschreibt beispielsweise eine Steuerelementänderung in einem Knoten mit Lineout-Volume:

    pPE->GenerateEventList(NULL, KSEVENT_CONTROL_CHANGE,
                           FALSE, ULONG(-1), TRUE, LINEOUT_VOL);

Während dieses Aufrufs durchsucht der Porttreiber seine Ereignisliste nach allen Ereignissen, die den Anrufparametern entsprechen, und sendet Benachrichtigungen an die Clients, die diese Ereignisse überwachen. In diesem Beispiel ist pPE ein Zeiger auf das IPortEvents-Objekt , und LINEOUT_VOL ist die Knoten-ID, die der Miniporttreiber dem Knoten lineout-volume zuweist. Nicht angegebene Parameter (z. B. die Ereignissatz-GUID und die Pin-ID im vorherigen Beispiel) werden als Feldhalter behandelt und entsprechen immer den entsprechenden Parametern in der Liste.