Wave 및 DirectSound 구성 요소
애플리케이션 프로그램은 사용자 모드와 커널 모드 구성 요소의 조합을 사용하여 웨이브 스트림을 캡처(입력)하고 렌더링(출력)합니다. 웨이브 스트림은 WAVEFORMATEX 또는 WAVEFORMATEXTENSIBLE 구조체로 데이터 형식을 설명하는 디지털 오디오 스트림입니다.
애플리케이션은 웨이브 렌더링 및 캡처에 다음 소프트웨어 인터페이스 중 하나를 사용할 수 있습니다.
Microsoft Windows 멀티미디어 웨이브아웃Xxx 및 waveInXxx 함수
DirectSound 및 DirectSoundCapture API
waveOutXxx 및 waveInXxx 함수의 동작은 레거시 웨이브 드라이버 및 디바이스의 기능을 기반으로 합니다. Windows 98부터 WDMAud 시스템 드라이버는 이러한 함수에 대한 호출을 WDM 오디오 드라이버로 명령으로 변환합니다. 그러나 이전 소프트웨어 및 하드웨어의 동작을 에뮬레이트하여 waveOutXxx 함수는 DirectSound API를 통해 사용할 수 있는 3차원 음향 효과 및 하드웨어 가속을 희생합니다. DirectSound 및 Windows 멀티미디어 웨이브 함수에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.
DirectSound 및 Windows 멀티미디어 웨이브 함수는 웨이브 및 DirectSound 스트림을 처리하는 오디오 필터 그래프를 빌드하는 SysAudio 시스템 드라이버의 클라이언트입니다. 그래프 빌드는 이러한 소프트웨어 인터페이스를 사용하는 애플리케이션에 투명합니다.
웨이브 구성 요소
다음 그림에서는 웨이브 애플리케이션이 웨이브 PCM 데이터로 구성된 디지털 오디오 스트림을 렌더링하거나 캡처하는 데 사용하는 사용자 모드 및 커널 모드 구성 요소를 보여 줍니다.
렌더링 구성 요소는 이전 그림의 왼쪽에 나타나고 캡처 구성 요소는 오른쪽에 나타납니다. 웨이브 미니포트 드라이버를 나타내는 상자가 어둡게 표시되어 공급업체에서 제공하는 구성 요소임을 나타냅니다. 그림의 다른 구성 요소는 시스템 제공입니다.
그림의 왼쪽 위에서 웨이브 렌더링(또는 "웨이브 아웃") 애플리케이션은 사용자 모드 WinMM 시스템 구성 요소에서 구현되는 waveOutXxx 함수를 통해 WDM 오디오 드라이버에 Winmm.dll. 애플리케이션은 파일에서 웨이브 오디오 샘플 블록을 읽고 waveOutWrite 함수를 호출하여 렌더링합니다.
사용자 모드 및 커널 모드 구성 요소(Wdmaud.drv 및 Wdmaud.sys)로 구성된 WDMAud는 waveOutWrite 호출에서 웨이브 데이터를 버퍼링하고 웨이브 스트림을 KMixer 시스템 드라이버로 출력합니다. 이 드라이버는 그림의 WDMAud 아래에 표시됩니다.
KMixer는 하나 이상의 원본에서 웨이브 PCM 스트림을 수신하고 함께 혼합하여 웨이브 PCM 형식인 단일 출력 스트림을 형성하는 시스템 구성 요소입니다.
KMixer는 웨이브 스트림을 WaveCyclic 또는 WavePci 디바이스에 출력합니다. 이 디바이스의 포트 및 미니포트 드라이버는 이전 그림의 왼쪽에 있는 KMixer 아래에 표시됩니다. 미니포트 드라이버는 포트 드라이버에 자신을 바인딩하여 기본 오디오 렌더링 디바이스를 나타내는 웨이브 필터를 형성합니다. 일반적인 렌더링 디바이스는 스피커 세트 또는 외부 오디오 단위를 구동하는 아날로그 신호를 출력합니다. 렌더링 디바이스는 S/PDIF 커넥터를 통해 디지털 오디오를 출력할 수도 있습니다. WaveCyclic 및 WavePci에 대한 자세한 내용은 웨이브 필터를 참조하세요.
또는 KMixer는 출력 스트림을 WaveCyclic 또는 WavePci 디바이스 대신 USBAudio 클래스 시스템 드라이버 (그림에 표시되지 않음)에 의해 제어되는 USB 오디오 디바이스에 전달할 수 있습니다.
어댑터 드라이버는 각각 GUID 값이 CLSID_PortWaveCyclic 또는 CLSID_PortWavePciPcNewPort를 호출하여 WaveCyclic 또는 WavePci 포트 드라이버의 instance 만듭니다.
이전 그림의 오른쪽에는 파일에 대한 웨이브 데이터를 캡처하는 애플리케이션을 지원하는 데 필요한 구성 요소가 표시됩니다. 웨이브 캡처(또는 "웨이브인") 애플리케이션은 WinMM 시스템 구성 요소에서 구현되는 waveInXxx 함수를 통해 WDM 오디오 드라이버와 통신합니다.
그림의 오른쪽 아래 모서리에서 웨이브 캡처 디바이스는 웨이브 미니포트 및 포트 드라이버에 의해 제어됩니다. WaveCyclic 또는 WavePci 형식일 수 있는 포트 및 미니포트 드라이버는 함께 바인딩되어 캡처 디바이스를 나타내는 웨이브 필터를 형성합니다. 이 장치는 일반적으로 마이크 또는 다른 오디오 소스에서 아날로그 신호를 캡처하고 웨이브 PCM 스트림으로 변환합니다. 디바이스는 S/PDIF 커넥터를 통해 디지털 오디오 스트림을 입력할 수도 있습니다.
웨이브 포트 드라이버는 해당 웨이브 스트림을 KMixer 또는 WDMAud에 직접 출력합니다. 스트림은 WDMAud가 수신하기 전에 샘플 속도를 변환해야 하는 경우 KMixer를 통과해야 합니다. 오디오 스트림의 동시 렌더링 및 캡처를 수행하는 시스템에는 그림과 같이 KMixer의 두 인스턴스가 필요할 수 있습니다. SysAudio는 필요에 따라 이러한 인스턴스를 자동으로 만듭니다.
또는 캡처된 웨이브 스트림의 원본은 WaveCyclic 또는 WavePci 디바이스 대신 USB 오디오 디바이스일 수 있습니다. 이 경우 USBAudio 드라이버(그림에 표시되지 않음)는 스트림을 KMixer에 전달합니다.
웨이브 스트림이 USB 디바이스 또는 WaveCyclic 또는 WavePci 디바이스에 의해 캡처되는지 여부에 관계없이 KMixer는 필요한 경우 스트림에서 샘플 속도 변환을 수행하지만 다른 스트림과 혼합하지 않습니다. KMixer는 결과 스트림을 WDMAud 시스템 드라이버의 절반인 커널 모드인 Wdmaud.sys 출력합니다. 사용자 모드 절반인 Wdmaud.drv는 Winmm.dll 구현되는 waveInXxx 함수를 통해 웨이브 스트림을 애플리케이션 프로그램에 출력합니다. 마지막으로, 그림 맨 위에서 웨이브 캡처 애플리케이션은 웨이브 데이터를 파일에 씁니다.
웨이브 캡처 애플리케이션이 waveInOpen 함수를 호출하여 캡처 스트림을 열 때 해당 콜백 루틴에 대한 포인터를 전달합니다. 웨이브 캡처 이벤트가 발생하면 운영 체제는 캡처 디바이스의 다음 웨이브 샘플 블록을 포함하는 버퍼를 사용하여 콜백 루틴을 호출합니다. 콜백에 대한 응답으로 애플리케이션은 다음 웨이브 데이터 블록을 파일에 씁니다.
DirectSound 구성 요소
다음 그림에서는 DirectSound 애플리케이션 프로그램에서 웨이브 데이터를 렌더링하거나 캡처하는 데 사용되는 사용자 모드 및 커널 모드 구성 요소를 보여 줍니다.
렌더링 구성 요소는 이전 그림의 왼쪽 절반에 표시되고 캡처 구성 요소는 오른쪽에 표시됩니다. 웨이브 미니포트 드라이버는 공급업체에서 제공하는 구성 요소임을 나타내기 위해 어두운 상자로 표시됩니다. 그림의 다른 구성 요소는 시스템 제공입니다.
그림의 왼쪽 위에서 DirectSound 애플리케이션은 파일의 웨이브 데이터를 사용자 모드 DirectSound 시스템 구성 요소 (Dsound.dll)가 관리하는 사운드 버퍼로 로드합니다. 이 구성 요소는 웨이브 스트림을 WaveCyclic 또는 WavePci 디바이스로 전송합니다. 이 디바이스의 포트 및 미니포트 드라이버는 그림의 왼쪽 아래에 표시됩니다. 디바이스에서 하드웨어 믹서 핀을 사용할 수 있는 경우 스트림은 KMixer를 우회하여 웨이브 포트 드라이버로 직접 전달됩니다. 그렇지 않으면 스트림이 먼저 KMixer를 통과하여 동시에 재생되는 다른 스트림과 혼합합니다. KMixer는 혼합 스트림을 포트 드라이버에 출력합니다.
이전과 마찬가지로 미니포트 드라이버는 포트 드라이버에 자신을 바인딩하여 기본 오디오 렌더링 디바이스를 나타내는 웨이브 필터를 형성합니다. 예를 들어 이 디바이스는 스피커 세트를 통해 스트림을 재생할 수 있습니다.
또는 WaveCyclic 또는 WavePci 디바이스 대신 USB 오디오 디바이스에서 웨이브 스트림을 렌더링할 수 있습니다. 이 경우 스트림은 KMixer를 바이패스할 수 없습니다. USBAudio 클래스 시스템 드라이버(그림에 표시되지 않음)는 항상 스트림을 KMixer에 전달합니다.
이전 그림의 오른쪽에는 DirectSoundCapture 애플리케이션을 지원하는 구성 요소가 표시됩니다. 애플리케이션은 WaveCyclic 또는 WavePci 캡처 디바이스에서 수신하는 웨이브 데이터를 기록합니다. 이 디바이스는 마이크에서 파동 스트림으로 아날로그 신호를 변환합니다. 디바이스의 웨이브 포트 및 미니포트 드라이버는 그림의 오른쪽 아래 모서리에 표시됩니다. 그림에 표시된 것처럼 포트 드라이버는 미니포트 드라이버에서 스트림을 입력으로 수신하고 사용자 모드 DirectSound 구성 요소, Dsound.dll 또는 KMixer를 통해 간접적으로 출력합니다. 이는 캡처 디바이스에서 하드웨어 캡처 핀을 사용할 수 있는지 여부에 따라 달라집니다.
또는 캡처된 웨이브 스트림의 원본은 USB 오디오 디바이스일 수 있습니다. 이 경우 스트림은 KMixer를 바이패스할 수 없습니다. USBAudio 드라이버(그림에 표시되지 않음)는 항상 스트림을 KMixer에 전달합니다.
KMixer가 캡처 스트림의 경로에 삽입되면 필요한 경우 스트림에서 샘플 속도 변환을 수행하지만 다른 스트림과 혼합하지는 않습니다.
이전 그림의 오른쪽 위 모서리에 있는 애플리케이션은 DirectSoundCapture 버퍼에서 웨이브 데이터를 읽고 파일에 씁니다.