다음을 통해 공유


오디오 모듈 통신 구현

오디오 모듈은 상대적으로 원자성 함수를 수행하는 오디오 처리 논리의 고유한 조각입니다. 오디오 모듈은 오디오 드라이버 또는 오디오 DSP에 상주할 수 있습니다. 오디오 모듈의 예로는 DSP 기반 오디오 처리가 있습니다.

Windows 10 릴리스 1703부터 UWP(유니버설 Windows 플랫폼) 앱과 커널 모드 디바이스 드라이버의 통신을 지원하는 API와 DPI가 모두 있습니다.

이 항목에서는 커널 디바이스 드라이버에서 오디오 모듈 통신 구현에 대한 정보를 제공합니다.

UWP 앱을 사용하여 명령을 보내고 오디오 디바이스 모듈에서 변경 알림을 받는 방법에 대한 자세한 내용은 오디오 디바이스 모듈 구성 및 쿼리를 참조 하세요.

오디오 모듈을 사용하는 이유

OEM은 일반적으로 고객이 이 오디오 시스템의 측면을 제어하고 기본 설정에 맞게 조정할 수 있도록 시스템에 구성 애플리케이션을 번들로 묶습니다. 오디오 하위 시스템에는 호스트 내 오디오 처리 개체, 하드웨어 DSP 처리 및 스마트 앰프와 같은 특수 하드웨어(오디오 코덱 자체 외에도 모두)와 같은 다양한 구성 요소가 포함될 수 있습니다. 대부분의 경우 이러한 구성 요소는 서로 다른 공급업체에서 만들고 판매합니다. 지금까지 IHV는 서로 통합하고 개별 구성 요소 간에 정보를 전송하기 위해 자체 프라이빗 API를 만들었습니다. 그러면 기존 WIN32 구성 애플리케이션이 이러한 프라이빗 API를 활용합니다.

UWP(유니버설 Windows 플랫폼)는 단일 애플리케이션이 다양한 디바이스에서 실행되도록 하는 API 집합을 제공합니다. UWP는 또한 Windows 10에서 실행되는 애플리케이션에 대한 고객의 기대가 된 새로운 모양과 느낌을 도입했습니다. 많은 OEM이 UWP에서 오디오 구성 애플리케이션을 빌드하려고 합니다. 그러나 UWP(AppContainer 샌드박스)의 핵심 보안 기능은 애플리케이션에서 오디오 하위 시스템의 다른 구성 요소로의 통신을 차단합니다. 이렇게 하면 UWP에서 이전에 구성 앱에서 사용했던 프라이빗 API에 액세스할 수 없게 됩니다.

Windows 10 릴리스 1703부터 오디오 모듈 UWP API를 사용하면 구성 애플리케이션 및 사용자 모드 구성 요소가 새 KS 속성 집합을 통해 검색할 수 있는 커널 및 하드웨어 계층의 모듈과 통신할 수 있습니다. 오디오 IHV 및 ISV는 Windows에서 제공하는 잘 정의된 인터페이스를 사용하여 하드웨어 모듈과 통신할 수 있는 애플리케이션 및 서비스를 작성할 수 있습니다. 오디오 모듈 API에 대한 자세한 내용은 Windows.Media.Devices 네임스페이스를 참조 하세요.

오디오 모듈 정의

이러한 정의는 오디오 모듈에만 적용됩니다.

용어 정의
오디오 모듈 상대적으로 원자성 함수를 수행하는 오디오 처리 논리의 고유한 조각입니다. 오디오 드라이버 또는 오디오 DSP에 상주할 수 있습니다. 오디오 모듈의 예로는 APO(오디오 처리 개체)가 있습니다.

일반 오디오 정의

이러한 정의는 일반적으로 오디오 드라이버로 작업할 때 사용됩니다.

용어 정의
OEM 주문자 상표 부착 제조업체
IHV 독립 하드웨어 공급업체
ISV 개별 소프트웨어 공급업체
HSA 하드웨어 지원 애플리케이션
UWP 유니버설 Windows 플랫폼
APO 오디오 처리 개체
DSP 디지털 신호 처리

아키텍처

오디오 모듈은 사용자 모드와 커널 모드 오디오 구성 요소 간에 메시지를 보내는 Windows 지원 메커니즘을 제공합니다. 중요한 차이점은 오디오 모듈이 전송 파이프라인을 표준화한다는 것입니다. 해당 전송에 대한 통신 프로토콜을 설정하지 않으며 ISV 및 IHV를 사용하여 프로토콜을 정의합니다. 기존 타사 디자인이 거의 변경되지 않고 오디오 모듈로 쉽게 마이그레이션할 수 있도록 하기 위한 것입니다.

<다이어그램 보류 중>

오디오 모듈 API는 KS 웨이브 필터와 초기화된 KS 핀(스트림)의 두 가지 대상 지정 방법을 통해 모듈에 대한 액세스를 제공합니다. 특정 모듈에 대한 배치 및 액세스는 구현에 따라 다릅니다.

HSA 및 기타 애플리케이션은 필터 핸들을 통해 사용 가능한 모듈에만 액세스할 수 있습니다. 스트림에 로드된 개별 API는 스트림 대상 오디오 모듈에 액세스할 수 있는 유일한 개체입니다.

API에 대한 자세한 내용은 Windows 오디오 처리 개체를 참조 하세요.

명령 보내기

오디오 모듈 클라이언트가 매개 변수를 쿼리하고 변경하는 방법은 커널의 오디오 모듈과 오디오 하위 시스템의 하드웨어 구성 요소로 명령을 보내는 것입니다. 오디오 모듈 API의 명령 구조는 느슨하게 정의되며 모듈이 검색되고 자신을 식별하는 방식을 공식화합니다. 그러나 관련 ISV 및 IHV에서 자세한 명령 구조를 설계하고 구현하여 보낼 수 있는 메시지와 예상 응답에 대한 프로토콜을 설정해야 합니다.

오디오 모듈 클라이언트에 대한 모듈 알림

또한 오디오 미니포트에는 클라이언트가 특정 모듈의 알림을 구독한 경우 오디오 모듈 클라이언트에 정보를 알리고 전달하는 방법이 있습니다. 이러한 알림에 전달된 정보는 오디오 모듈 API에 의해 정의되지 않고 ISV 및/또는 IHV에 의해 정의됩니다.

사용, 사용 안 함 및 일반 토폴로지 정보

오디오 모듈 API는 명령을 열거하고 모듈에 보내는 방법을 정의합니다. 그러나 API는 오디오 모듈 클라이언트가 특정 모듈을 사용하거나 사용하지 않도록 설정하는 방법을 명시적으로 정의하지 않습니다. 또한 클라이언트가 토폴로지 정보를 찾거나 모듈을 서로 관련하여 배치하는 방법을 설정하지 않습니다. IHV 및 ISV는 이 기능이 필요한지 확인하고 구현 방법을 결정할 수 있습니다.

전역 드라이버 모듈을 노출하는 것이 좋습니다. 전역 드라이버 모듈은 이러한 토폴로지 관련 요청에 대한 사용자 지정 명령을 처리합니다.

오디오 모듈 DDI

커널 스트리밍 오디오 모듈 속성

KSPROPSETID_AudioModule 식별되는 새 KS 속성 집합은 오디오 모듈과 관련된 세 가지 속성에 대해 정의되었습니다.

도우미 인터페이스가 제공되지 않는 경우 PortCls 미니포트 드라이버는 각 속성에 대한 응답을 직접 처리해야 합니다.

ksmedia.h:

#define STATIC_KSPROPSETID_AudioModule \
    0xc034fdb0, 0xff75, 0x47c8, 0xaa, 0x3c, 0xee, 0x46, 0x71, 0x6b, 0x50, 0xc6
DEFINE_GUIDSTRUCT("C034FDB0-FF75-47C8-AA3C-EE46716B50C6", KSPROPSETID_AudioModule);
#define KSPROPSETID_AudioModule DEFINE_GUIDNAMED(KSPROPSETID_AudioModule)

typedef enum {
    KSPROPERTY_AUDIOMODULE_DESCRIPTORS            = 1,  
    KSPROPERTY_AUDIOMODULE_COMMAND                = 2,
    KSPROPERTY_AUDIOMODULE_NOTIFICATION_DEVICE_ID = 3,
} KSPROPERTY_AUDIOMODULE;

오디오 모듈 설명자

KSPROPERTY_AUDIOMODULE_DESCRIPTORS 속성에 대한 지원은 드라이버를 오디오 모듈 인식으로 식별합니다. 속성은 필터 또는 핀 핸들을 통해 쿼리되고 KSPROPERTY는 DeviceIoControl 호출에 대한 입력 버퍼로 전달됩니다. KSAUDIOMODULE_DESCRIPTOR 오디오 하드웨어 내의 각 모듈을 설명하도록 정의되었습니다. 이 요청에 대한 응답으로 이러한 설명자의 배열이 반환됩니다.

ksmedia.h:

#define AUDIOMODULE_MAX_NAME_SIZE 128

typedef struct _KSAUDIOMODULE_DESCRIPTOR
{
    GUID    ClassId; 
    ULONG   InstanceId;
    ULONG   VersionMajor;
    ULONG   VersionMinor;
    WCHAR   Name[AUDIOMODULE_MAX_NAME_SIZE];
} KSAUDIOMODULE_DESCRIPTOR, *PKSAUDIOMODULE_DESCRIPTOR;

자세한 내용은 KSAUDIOMODULE_DESCRIPTOR 참조하세요.

오디오 모듈 명령

KSPROPERTY_AUDIOMODULE_COMMAND 속성을 지원하면 오디오 모듈 클라이언트가 오디오 모듈에서 매개 변수를 쿼리하고 설정하는 사용자 지정 명령을 보낼 수 있습니다. 필터 또는 핀 핸들을 통해 속성을 보낼 수 있으며 KSAUDIOMODULE_PROPERTY DeviceIoControl 호출에 대한 입력 버퍼로 전달됩니다. 클라이언트는 필요에 따라 입력 버퍼의 KSAUDIOMODULE_PROPERTY 바로 인접한 추가 정보를 보내 사용자 지정 명령을 보낼 수 있습니다.

ksmedia.h:

#define AUDIOMODULE_MAX_DATA_SIZE 64000

typedef struct _KSPAUDIOMODULE_PROPERTY
{
    KSPROPERTY Property;
    GUID       ClassId;
    ULONG      InstanceId;
} KSAUDIOMODULE_PROPERTY, *PKSPAUDIOMODULE_PROPERTY;

자세한 내용은 KSAUDIOMODULE_PROPERTY 참조하세요.

오디오 모듈 알림 디바이스 ID

미니포트가 알림을 알리고 오디오 모듈 클라이언트에 정보를 전달할 수 있도록 하려면 KSPROPERTY_AUDIOMODULE_NOTIFICATION_DEVICE_ID 지원이 필요합니다. 이 ID의 수명은 Windows 오디오 스택에 노출되고 활성 상태인 오디오 디바이스의 수명에 연결됩니다. 필터 또는 핀 핸들을 통해 속성을 보낼 수 있으며 KSPROPERTY는 DeviceIoControl 호출에 대한 입력 버퍼로 전달됩니다.

자세한 내용은 KSAUDIOMODULE_PROPERTY 참조하세요.

PortCls 도우미 - 오디오 모듈 알림

드라이버 개발자가 오디오 모듈 클라이언트에 알림을 보낼 수 있도록 새 포트 인터페이스가 추가되었습니다.

PortCls.h:

typedef struct _PCNOTIFICATION_BUFFER 
{
    UCHAR NotificationBuffer[1];
} PCNOTIFICATION_BUFFER, *PPCNOTIFICATION_BUFFER;

DECLARE_INTERFACE_(IPortClsNotifications,IUnknown)
{
    DEFINE_ABSTRACT_UNKNOWN()   // For IUnknown

    STDMETHOD_(NTSTATUS, AllocNotificationBuffer)
    (   THIS_
        _In_    POOL_TYPE       PoolType,
        _In_    USHORT          NumberOfBytes,
        _Out_   PPCNOTIFICATION_BUFFER* NotificationBuffer
    )   PURE;
    
    STDMETHOD_(void, FreeNotificationBuffer)
    (   THIS_
        _In_    PPCNOTIFICATION_BUFFER NotificationBuffer
    )   PURE;
    
    STDMETHOD_(void, SendNotificationBuffer)
    (   THIS_
        _In_    const GUID*     NotificationId,
        _In_    PPCNOTIFICATION_BUFFER NotificationBuffer
    )   PURE;
};

//
// Audio module notification definitions.
//
#define STATIC_KSNOTIFICATIONID_AudioModule \
    0x9C2220F0, 0xD9A6, 0x4D5C, 0xA0, 0x36, 0x57, 0x38, 0x57, 0xFD, 0x50, 0xD2
DEFINE_GUIDSTRUCT("9C2220F0-D9A6-4D5C-A036-573857FD50D2", KSNOTIFICATIONID_AudioModule);
#define KSNOTIFICATIONID_AudioModule DEFINE_GUIDNAMED(KSNOTIFICATIONID_AudioModule)

typedef struct _KSAUDIOMODULE_NOTIFICATION {
    union {
        struct {
            GUID        DeviceId;
            GUID        ClassId;
            ULONG       InstanceId;
            ULONG       Reserved;
        } ProviderId;
        LONGLONG        Alignment;
    };
} KSAUDIOMODULE_NOTIFICATION, *PKSAUDIOMODULE_NOTIFICATION;


자세한 내용은 다음을 참조하세요.

IPortClsNotifications

IPortClsNotifications::AllocNotificationBuffer

IPortClsNotifications::FreeNotificationBuffer

IPortClsNotifications::SendNotificationBuffer

호출 시퀀스

미니포트는 해당 포트를 호출하여 알림을 만들고 보냅니다. 일반 호출 순서는 이 다이어그램에 표시됩니다.

AudioIPortClsNotifications에 대한 호출 시퀀스를 보여 주는 다이어그램