비 PCM 지원 배경

몇 가지 문제로 인해 이전 버전의 Microsoft Windows에서 waveOut 및 DirectSound API를 통해 PCM이 아닌 형식을 지원하지 못했습니다. 이러한 문제 및 해결 방법은 아래에 설명되어 있습니다.

waveOut API

waveOut 애플리케이션을 VxD 웨이브 드라이버와 분리하는 소프트웨어 계층은 상당히 얇습니다. 사용자 지정 웨이브 형식을 지원하는 드라이버 및 애플리케이션은 운영 체제가 형식을 이해하는지 여부에 관계없이 해당 형식으로 데이터를 스트리밍할 수 있습니다.

그러나 Windows 2000 및 Windows 98에서 WDM 오디오 프레임워크는 waveOut API(및 DirectShow의 waveOut 렌더러)에서 처리되는 모든 오디오 데이터를 커널 오디오 믹서인 KMixer 시스템 드라이버 (Kmixer.sys)를 통과하도록 강제합니다. waveOutOpen 호출은 드라이버가 형식을 지원하는지 여부에 관계없이 KMixer가 형식을 지원하는 경우에만 성공합니다.

KMixer는 모든 WDM 운영 체제에서 WAVE_FORMAT_PCM 처리합니다. Windows 2000 이상 및 Windows 98 SE는 KMixer를 확장하여 WAVE_FORMAT_IEEE_FLOAT 뿐만 아니라 PCM 및 IEEE 부동 소수점 형식의 WAVEFORMATEXTENSIBLE 변형도 지원합니다. KMixer는 PCM이 아닌 형식을 지원하지 않으므로 KMixer를 통해 PCM이 아닌 데이터를 전달하려는 시도가 실패합니다.

Windows는 PCM이 아닌 오디오 데이터가 단순히 KMixer를 우회할 수 있도록 하여 PCM이 아닌 형식을 지원합니다. 특히 waveOut 비 PCM 데이터는 먼저 KMixer를 통과하는 대신 PortCls(또는 USBAudio)로 직접 흐릅니다. PCM이 아닌 데이터의 혼합은 하드웨어에서 수행해야 하지만 AC-3 또는 WMA Pro와 같은 형식의 비 PCM 데이터를 사용하는 애플리케이션은 일반적으로 혼합이 필요하지 않으며 드라이버는 일반적으로 해당 형식의 하드웨어 혼합을 지원하지 않습니다.

DirectSound API

레거시 waveOut 드라이버 및 VxD 드라이버에서 DirectSound는 기본 버퍼와 보조 버퍼 모두에 대해 WAVEFORMATEX(WAVEFORMATEXTENSIBLE 아님) PCM 형식을 지원하며 샘플당 8비트 또는 16비트, 하나 또는 두 개의 채널, 샘플링 속도는 100Hz에서 100kHz 사이입니다. VxD 드라이버는 협력 수준이 DSSCL_WRITEPRIMARY 설정될 때 기본 버퍼에 허용되는 형식을 추가로 제한할 수 있습니다(DirectX SDK의 IDirectSoundBuffer::SetFormat 메서드 설명 참조). Windows Me 또는 Windows XP에서는 이러한 제한 사항이 변경되지 않았습니다.

WDM 드라이버는 WAVEFORMATEX 및 WAVEFORMATEXTENSIBLE 형식 모두에서 PCM 형식을 지원할 수 있습니다. Windows 2000 이상, Windows Me 및 Windows 98 SE의 경우 드라이버는 WAVEFORMATEX 및 WAVEFORMATEXTENSIBLE 형식 모두에서 기본 및 보조 DSBCAPS_LOCSOFTWARE 버퍼(KMixer가 혼합)에 대한 WAVE_FORMAT_IEEE_FLOAT 형식을 지원할 수도 있습니다.

기본 버퍼의 데이터 형식을 지정하기 위해 SetFormat을 호출하면 사운드 카드 선택한 최종 혼합 형식에 간접적인 영향만 있습니다. 기본 버퍼 개체는 IDirectSound3DListener 인터페이스를 가져오고 디바이스의 전역 볼륨 및 팬을 설정하는 데 사용되지만 사운드 카드 단일 출력 스트림을 나타내지는 않습니다. 대신 KMixer는 여러 DSSCL_WRITEPRIMARY DirectSound 클라이언트를 동시에 실행할 수 있도록 기본 버퍼 데이터를 혼합합니다.

Windows 2000 및 Windows 98에서 DirectSound는 PCM 데이터만 지원합니다. DirectSound의 렌더러를 사용하는 DirectShow도 마찬가지입니다. 드라이버가 형식을 지원하는 경우에도 PCM이 아닌 형식의 CreateSoundBuffer 호출은 항상 실패합니다. 실패는 두 가지 이유로 발생합니다. 먼저 DirectSound가 KS 핀을 만들 때마다 IDirectSoundBuffer 개체를 만드는 데 사용되는 WAVEFORMATEX 구조체의 wFormatTag 멤버에서 하위 형식을 파생시키는 대신 KSDATAFORMAT_SUBTYPE_PCM 자동으로 지정합니다. 둘째, DirectSound는 클라이언트 요청이 DirectSound 버퍼의 이동, 볼륨 또는 빈도 컨트롤에 관계없이 볼륨 및 SRC(샘플 속도 변환) 노드(KSNODETYPE_VOLUMEKSNODETYPE_SRC)가 있어야 합니다. 데이터가 KMixer를 통과하거나 디바이스가 하드웨어 혼합을 수행하는 경우 이 요구 사항이 충족됩니다. 그러나 PCM이 아닌 형식의 경우 KMixer는 데이터 경로에 없으며 드라이버 자체는 일반적으로 하드웨어 혼합을 수행하라는 메시지가 표시될 때 실패합니다.

Windows XP 이상 및 Windows Me는 DirectSound 애플리케이션이 PCM이 아닌 형식을 사용하지 못하도록 하는 제한 사항을 제거합니다. DirectSound 8 이상 버전은 올바른 형식 하위 형식을 사용하며 더 이상 모든 데이터 경로에 볼륨 및 SRC 노드가 자동으로 필요하지 않습니다.