User-Mode 오디오 구성 요소

Windows Vista에서 핵심 오디오 API는 사용자 모드 오디오 하위 시스템의 기초 역할을 합니다. 핵심 오디오 API는 사용자 모드 클라이언트를 커널 모드 오디오 드라이버 및 오디오 하드웨어와 분리하는 씬 계층의 사용자 모드 시스템 구성 요소로 구현됩니다. DirectSound 및 Windows 멀티미디어 함수와 같은 상위 수준 오디오 API는 핵심 오디오 API를 통해 오디오 디바이스에 액세스합니다. 또한 일부 오디오 애플리케이션은 핵심 오디오 API와 직접 통신합니다.

핵심 오디오 API는 오디오 엔드포인트 디바이스의 사용자에게 친숙한 개념을 지원합니다. 오디오 엔드포인트 디바이스는 사용자가 직접 조작하는 물리적 디바이스를 나타내는 소프트웨어 추상화입니다. 오디오 엔드포인트 디바이스의 예로는 스피커, 헤드폰 및 마이크가 있습니다. 자세한 내용은 오디오 엔드포인트 디바이스를 참조하세요.

다음 다이어그램에서는 핵심 오디오 API와 Windows Vista의 다른 사용자 모드 오디오 구성 요소와의 관계를 보여 줍니다.

사용자 모드 오디오 렌더링 구성 요소 다이어그램

간단히 하기 위해 앞의 다이어그램은 엔드포인트 디바이스에 대한 오디오 렌더링 데이터 경로만 표시합니다. 다이어그램은 오디오 캡처 데이터 경로를 표시하지 않습니다. 핵심 오디오 API에는 Audioses.dll 및 Mmdevapi.dll 사용자 모드 시스템 모듈에서 구현되는 MMDevice API, WASAPI, DeviceTopologyAPI 및 EndpointVolume API가 포함됩니다.

앞의 다이어그램에 표시된 것처럼 핵심 오디오 API는 다음과 같은 상위 수준 API에 대한 기초를 제공합니다.

  • 미디어 파운데이션
  • Windows 멀티미디어 waveXxxmixerXxx 함수
  • Directsound
  • DirectMusic

DirectSound, Windows 멀티미디어 오디오 함수 및 Media Foundation(스트리밍 오디오 렌더러 또는 SAR 구성 요소를 통해)은 핵심 오디오 API와 직접 통신합니다. DirectMusic은 DirectSound를 통해 핵심 오디오 API와 간접적으로 통신합니다.

WASAPI의 클라이언트는 엔드포인트 버퍼를 통해 엔드포인트 디바이스에 데이터를 전달합니다. 시스템 소프트웨어 및 하드웨어 구성 요소는 클라이언트에 대해 대체로 투명한 방식으로 엔드포인트 버퍼에서 엔드포인트 디바이스로의 데이터 이동을 관리합니다. 또한 잭 프레즌스 검색을 사용하여 오디오 어댑터에 연결하는 엔드포인트 디바이스의 경우 클라이언트는 물리적으로 존재하는 엔드포인트 디바이스에 대해서만 엔드포인트 버퍼를 만들 수 있습니다. 잭 프레즌스 검색에 대한 자세한 내용은 오디오 엔드포인트 디바이스를 참조하세요.

앞의 다이어그램은 두 가지 유형의 엔드포인트 버퍼를 보여 있습니다. WASAPI의 클라이언트가 공유 모드에서 스트림을 열면 클라이언트는 엔드포인트 버퍼에 오디오 데이터를 쓰고 Windows 오디오 엔진은 버퍼에서 데이터를 읽습니다. 이 모드에서 클라이언트는 오디오 하드웨어를 다른 프로세스에서 실행되는 다른 애플리케이션과 공유합니다. 오디오 엔진은 이러한 애플리케이션의 스트림을 혼합하고 하드웨어를 통해 결과 혼합을 재생합니다. 오디오 엔진은 소프트웨어에서 모든 스트림 처리 작업을 수행하는 사용자 모드 시스템 구성 요소(Audiodg.dll)입니다. 반면 클라이언트가 단독 모드로 스트림을 여는 경우 클라이언트는 오디오 하드웨어에 대한 단독 액세스 권한을 줍니다. 일반적으로 소수의 "pro 오디오" 또는 RTC 애플리케이션에만 전용 모드가 필요합니다. 다이어그램은 공유 모드 및 배타적 모드 스트림을 모두 보여 주지만 클라이언트가 공유 모드에서 스트림을 여는지 아니면 배타적 모드에서 스트림을 여는지 여부에 따라 이러한 두 스트림(및 해당 엔드포인트 버퍼) 중 하나만 존재합니다.

단독 모드에서 클라이언트는 엔드포인트 디바이스가 지원하는 오디오 형식으로 스트림을 열도록 선택할 수 있습니다. 공유 모드에서 클라이언트는 오디오 엔진에서 현재 사용 중인 혼합 형식(또는 혼합 형식과 유사한 형식)으로 스트림을 열어야 합니다. 오디오 엔진의 입력 스트림과 엔진의 출력 조합은 모두 이 형식입니다.

Windows 7에서는 공유 모드의 스트림에 대해 짧은 대기 시간 모드 라는 새로운 기능이 추가되었습니다. 이 모드에서 오디오 엔진은 대기 시간이 크게 감소하는 끌어오기 모드에서 실행됩니다. 이는 더 빠른 스트리밍을 위해 낮은 오디오 스트림 대기 시간이 필요한 통신 애플리케이션에 매우 유용합니다.

대기 시간이 짧은 오디오 스트림을 관리하는 애플리케이션은 Windows Vista의 MMCSS(멀티미디어 클래스 스케줄러 서비스)를 사용하여 엔드포인트 버퍼에 액세스하는 애플리케이션 스레드의 우선 순위를 높일 수 있습니다. MMCSS를 사용하면 우선 순위가 낮은 애플리케이션에 대한 CPU 리소스를 거부하지 않고 오디오 애플리케이션을 높은 우선 순위로 실행할 수 있습니다. MMCSS는 작업 이름에 따라 스레드에 우선 순위를 할당합니다. 예를 들어 Windows Vista는 오디오 스트림을 관리하는 스레드에 대해 작업 이름 "Audio" 및 "Pro Audio"를 지원합니다. 기본적으로 "Pro Audio" 스레드의 우선 순위는 "오디오" 스레드보다 높습니다. MMCSS에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요.

핵심 오디오 API는 PCM 및 비 PCM 스트림 형식을 모두 지원합니다. 그러나 오디오 엔진은 PCM 스트림만 혼합할 수 있습니다. 따라서 전용 모드 스트림만 PCM이 아닌 형식을 가질 수 있습니다. 자세한 내용은 디바이스 형식을 참조하세요.

오디오 엔진은 애플리케이션이 실행되는 프로세스와는 별개인 자체 보호된 프로세스에서 실행됩니다. 공유 모드 스트림을 지원하기 위해 Windows 오디오 서비스(이전 다이어그램에서 "오디오 서비스"라는 레이블이 지정된 상자)는 애플리케이션과 오디오 엔진 모두에서 액세스할 수 있는 프로세스 간 엔드포인트 버퍼를 할당합니다. 단독 모드의 경우 엔드포인트 버퍼는 애플리케이션과 오디오 하드웨어 모두에서 액세스할 수 있는 메모리에 상주합니다.

Windows 오디오 서비스는 Windows 오디오 정책을 구현하는 모듈입니다. 오디오 정책은 시스템이 동일한 오디오 하드웨어를 사용하기 위해 공유하고 경쟁하는 여러 애플리케이션의 오디오 스트림 간의 상호 작용에 적용되는 내부 규칙 집합입니다. Windows 오디오 서비스는 오디오 엔진에 대한 컨트롤 매개 변수를 설정하여 오디오 정책을 구현합니다. 오디오 서비스의 의무는 다음과 같습니다.

  • 사용자가 시스템에서 추가하거나 제거하는 오디오 디바이스를 추적합니다.
  • 시스템의 오디오 디바이스에 할당된 역할을 모니터링합니다.
  • 유사한 클래스의 오디오 콘텐츠(콘솔, 멀티미디어 및 통신)를 생성하는 작업 그룹에서 오디오 스트림을 관리합니다.
  • 다양한 유형의 오디오 콘텐츠 각각에 대해 결합된 출력 스트림("서브믹스")의 볼륨 수준을 제어합니다.
  • 오디오 스트림에 대한 데이터 경로의 처리 요소에 대해 오디오 엔진에 알릴 수 있습니다.

일부 버전의 Windows에서는 Windows 오디오 서비스가 기본적으로 사용하지 않도록 설정되어 있으며 시스템이 오디오를 재생하기 전에 명시적으로 켜져 있어야 합니다.

앞의 다이어그램에 표시된 예제에서 엔드포인트 디바이스는 오디오 어댑터에 연결된 스피커 집합입니다. 클라이언트 애플리케이션은 엔드포인트 버퍼에 오디오 데이터를 쓰고 오디오 엔진은 버퍼에서 엔드포인트 디바이스로 데이터를 전송하는 세부 정보를 처리합니다.

앞의 다이어그램에서 "오디오 드라이버"라는 레이블이 지정된 상자는 시스템에서 제공하는 드라이버 구성 요소와 공급업체에서 제공하는 드라이버 구성 요소의 조합일 수 있습니다. PCI 또는 PCI Express 버스의 오디오 어댑터의 경우 시스템은 어댑터의 다양한 오디오 기능에 대한 포트 드라이버 집합을 구현하는 포트 클래스 시스템 드라이버(Portcls.sys)를 제공하고 하드웨어 공급업체는 포트 드라이버에 대한 디바이스별 작업을 처리하기 위해 미니포트 드라이버 집합을 구현하는 어댑터 드라이버를 제공합니다. PCI 또는 PCI Express 버스의 고화질 오디오 컨트롤러 및 코덱의 경우 시스템은 어댑터 드라이버(Hdaudio.sys)를 제공하며 공급업체에서 제공하는 드라이버가 필요하지 않습니다. USB 버스의 오디오 어댑터의 경우 시스템은 AVStream 클래스 시스템 드라이버(Ks.sys)와 USB 오디오 드라이버(Usbaudio.sys)를 제공합니다. 다시 말하지만 공급업체에서 제공하는 드라이버가 필요하지 않습니다.

간단히 하기 위해 앞의 다이어그램에는 렌더링 스트림만 표시됩니다. 그러나 핵심 오디오 API는 캡처 스트림도 지원합니다. 공유 모드에서는 여러 클라이언트가 오디오 하드웨어 디바이스에서 캡처된 스트림을 공유할 수 있습니다. 단독 모드에서는 한 클라이언트가 디바이스에서 캡처된 스트림에 대한 단독 액세스 권한을 가 둡 수 있습니다.

프로그래밍 가이드