다음을 통해 공유


하드웨어 이벤트

일부 오디오 디바이스는 하드웨어 볼륨 제어 노브, 음소거 스위치 또는 기타 유형의 수동 컨트롤을 제공합니다. 애플리케이션은 볼륨을 조정하거나 오디오 스트림이 재생되는 방식을 변경하여 이러한 컨트롤의 변경에 응답할 수 있습니다. 사용자가 하드웨어 컨트롤을 조정하면 미니포트 드라이버는 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)는 와일드카드로 처리되며 항상 목록의 해당 매개 변수와 일치합니다.