하드웨어 이벤트

일부 오디오 디바이스는 하드웨어 볼륨 제어 노브, 음소거 스위치 또는 기타 유형의 수동 컨트롤을 제공합니다. 애플리케이션은 볼륨을 조정하거나 오디오 스트림이 재생되는 방식을 변경하여 이러한 컨트롤의 변경에 응답할 수 있습니다. 사용자가 하드웨어 컨트롤을 조정하면 미니포트 드라이버는 IPortEvents 인터페이스를 사용하여 포트 드라이버에 하드웨어 이벤트가 발생했음을 알릴 수 있습니다. 포트 드라이버는 디바이스에서 새 컨트롤 설정을 읽을 수 있도록 이벤트를 애플리케이션에 알립니다.

미니포트 드라이버는 포트 드라이버에서 Init 호출(예: IMiniportWavePci::Init 참조)을 서비스할 때 IPortEvents 인터페이스에 대한 포트 드라이버를 쿼리할 수 있습니다. Microsoft Windows 98 SE, Windows Me 및 Windows 2000 이상에서는 해당 쿼리가 성공합니다. 코드 예제는 이전 버전의 WDK(Windows 드라이버 키트)의 Sb16 샘플 오디오 어댑터를 참조하세요.

포트 드라이버가 드라이버의 IMiniport::GetDescription 메서드를 호출하면 메서드는 무엇보다도 디바이스에서 지원하는 이벤트를 지정하는 PCFILTER_DESCRIPTOR 구조를 출력합니다. 이벤트는 PCFILTER_DESCRIPTOR 노드 멤버의 자동화 테이블과 필터 자체에 대한 자동화 테이블을 가리키는 AutomationTable 멤버에서 지정할 수 있습니다. 각 이벤트는 PCEVENT_ITEM 구조로 지정됩니다. 드라이버는 PCEVENT_ITEM 구조체의 SetId 멤버를 KSEVENTSETID_AudioControlChangeKSEVENT_CONTROL_CHANGE 설정해야 하며 드라이버의 EventHandler 루틴에 대한 포인터를 처리기 멤버에 로드해야 합니다. 또한 드라이버는 Flags 멤버에서 PCEVENT_ITEM_FLAG_BASICSUPPORT 비트를 설정하여 컨트롤 변경 이벤트에 대한 기본 지원을 나타내야 하며, 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)는 와일드카드로 처리되며 항상 목록의 해당 매개 변수와 일치합니다.