디바이스 형식

오디오 애플리케이션의 경우 DirectSound 또는 Windows 멀티미디어 waveOutXxx 함수와 같은 상위 수준 오디오 API를 사용하는 이점은 API가 애플리케이션에서 사용하는 스트림 형식과 오디오 디바이스에서 사용하는 형식 간에 자동으로 변환된다는 것입니다. 반면, 핵심 오디오 API는 애플리케이션 스트림이 디바이스에서 사용하는 형식과 동일하거나 밀접하게 관련된 형식을 사용해야 하기 때문에 더 제한적입니다. 따라서 핵심 오디오 API를 사용하여 오디오 스트림을 재생하거나 녹음하는 애플리케이션은 스트림 형식 간의 변환의 일부 또는 전부를 수행해야 할 수 있습니다.

WASAPI를 사용하여 공유 모드 스트림을 관리하는 애플리케이션은 오디오 엔진을 사용하여 제한된 형식 변환만 수행할 수 있습니다. 오디오 엔진은 애플리케이션에서 사용하는 표준 PCM 샘플 크기와 엔진이 내부 처리에 사용하는 부동 소수점 샘플 간에 변환할 수 있습니다. 그러나 애플리케이션 스트림의 형식은 일반적으로 디바이스에서 사용하는 스트림 형식과 동일한 수의 채널과 동일한 샘플 속도를 가져야 합니다.

애플리케이션이 전용 모드에서 디바이스를 사용하는 경우 애플리케이션은 오디오 하드웨어에서 명시적으로 지원하는 스트림 형식을 사용해야 합니다. 전용 모드에서 애플리케이션 및 디바이스는 오디오 엔진의 개입 없이 오디오 데이터를 직접 교환합니다.

많은 오디오 디바이스는 PCM 및 비 PCM 스트림 형식을 모두 지원합니다. 그러나 오디오 엔진은 PCM 스트림만 혼합할 수 있습니다. 따라서 전용 모드 스트림만 PCM이 아닌 형식을 가질 수 있습니다. 또한 고정 데이터 속도가 있는 비 PCM 형식만 배타적 모드에서 지원됩니다. 고정 속도 비 PCM 형식의 예로는 디코딩되지 않고 디지털 형식의 소니/필립스 디지털 인터페이스(S/PDIF) 링크를 통과하는 48kHz WMA Pro(Windows Media Audio Professional) 오디오 스트림이 있습니다. S/PDIF를 통해 WMA Pro 스트림을 사용하는 방법에 대한 자세한 내용은 WMA Pro 데이터 범위 지정을 참조하세요.

WASAPI는 WAVEFORMATEX 또는 WAVEFORMATEXTENSIBLE 구조를 사용하여 스트림 형식을 지정합니다. WAVEFORMATEXTENSIBLE 구조체는 더 다양한 형식을 설명하기 위해 확장된 WAVEFORMATEX 구조체입니다. 독립 실행형 WAVEFORMATEX 구조체에서 설명할 수 있는 모든 형식은 WAVEFORMATEXTENSIBLE 구조체에서도 설명할 수 있습니다.

WAVEFORMATEXTENSIBLE 구조체의 첫 번째 멤버는 WAVEFORMATEX 구조체입니다. WAVEFORMATEX 구조체의 내용은 독립 실행형 WAVEFORMATEX 구조체인지 또는 WAVEFORMATEXTENSIBLE 구조체의 일부인지를 나타냅니다.

독립 실행형 WAVEFORMATEX 구조체는 하나 또는 두 개의 채널이 있는 형식과 8비트의 배수인 샘플 크기를 적절하게 설명할 수 있습니다. WAVEFORMATEX 구조체는 그 자체로 채널과 화자 위치의 매핑을 지정할 수 없습니다. 또한 WAVEFORMATEX 는 각 오디오 샘플에 대한 컨테이너 크기를 지정하지만 샘플에서 전체 자릿수의 비트 수를 지정할 수 없습니다(예: 24비트 컨테이너의 전체 자릿수 20비트). 반면 WAVEFORMATEXTENSIBLE 구조체는 스피커에 대한 채널 매핑과 각 샘플의 전체 자릿수를 모두 지정할 수 있습니다.

WAVEFORMATEXWAVEFORMATEXTENSIBLE에 대한 자세한 내용은 Windows DDK 설명서를 참조하세요.

Windows 7부터 WAVEFORMATEXTENSIBLE 은 IEC 61937 호환 인터페이스를 통해 인코딩된 오디오를 전송하기 위한 디바이스 형식을 나타내도록 확장되었습니다. 새 구조체에 대한 자세한 내용은 IEC 61937 Transmissions에 대한 형식 표현을 참조하세요.

디바이스 형식 지정

다음 WASAPI 메서드는 WAVEFORMATEXWAVEFORMATEXTENSIBLE 구조를 사용하여 스트림 형식을 설명합니다.

GetMixFormat 메서드는 오디오 엔진이 공유 모드 스트림의 내부 처리에 사용하는 스트림 형식을 검색합니다. 메서드는 항상 독립 실행형 WAVEFORMATEX 구조체 대신 WAVEFORMATEXTENSIBLE 구조 체를 사용하여 형식을 지정합니다.

IsFormatSupported 메서드는 오디오 엔드포인트 디바이스가 특정 스트림 형식을 지원하는지 여부를 나타냅니다. 호출자는 스트림 형식이 공유 모드 또는 배타적 모드에서 사용할지 여부를 지정해야 합니다. 공유 모드 형식의 경우 메서드는 오디오 엔진을 쿼리하여 지정된 형식을 지원하는지 여부를 확인합니다. 전용 모드 형식의 경우 메서드는 디바이스 드라이버를 쿼리합니다. 일부 디바이스 드라이버는 독립 실행형 WAVEFORMATEX 구조체로 형식을 지정하는 경우 1채널 또는 2채널 PCM 형식을 지원한다고 보고하지만 WAVEFORMATEXTENSIBLE 구조체로 지정된 경우 동일한 형식을 거부합니다. 이러한 드라이버에서 신뢰할 수 있는 결과를 얻으려면 전용 모드 애플리케이션은 각 1채널 또는 2채널 PCM 형식에 대해 IsFormatSupported 를 두 번 호출해야 합니다. 한 호출은 독립 실행형 WAVEFORMATEX 구조를 사용하여 형식을 지정하고 다른 호출은 WAVEFORMATEXTENSIBLE 구조를 사용하여 동일한 형식을 지정해야 합니다.

애플리케이션에서 GetMixFormat 또는 IsFormatSupported 를 사용하여 공유 모드 또는 배타적 모드 스트림에 적합한 형식을 찾은 후 애플리케이션은 Initialize 메서드를 호출하여 해당 형식으로 스트림을 초기화할 수 있습니다. GetMixFormat 메서드에서 가져온 혼합 형식과 동일하지 않지만 채널 수와 혼합 형식과 동일한 샘플 속도를 갖는 형식으로 공유 모드 스트림을 초기화하려는 애플리케이션은 성공할 가능성이 높습니다. Initialize를 호출하기 전에 애플리케이션은 IsFormatSupported를 호출하여 Initialize가 형식을 수락할지 확인할 수 있습니다.

오디오 엔진이 공유 모드 스트림의 내부 처리에 사용하는 혼합 형식은 오디오 엔드포인트 디바이스가 공유 모드에서 사용하는 스트림 형식과 밀접하게 관련되어 있지만 반드시 동일하지는 않습니다. Mmsys.cpl Windows 멀티미디어 제어판을 통해 사용자는 오디오 엔드포인트 디바이스가 공유 모드에서 작동할 때 사용할 스트림 형식을 선택할 수 있습니다. 단계는 다음과 같습니다.

  1. Mmsys.cpl 실행하려면 명령 프롬프트 창을 열고 다음 명령을 입력합니다.

    컨트롤 mmsys.cpl

    또는 작업 표시줄의 오른쪽에 있는 알림 영역에서 스피커 아이콘을 마우스 오른쪽 단추로 클릭하고 재생 장치 또는 기록 장치를 선택하여 Mmsys.cpl 실행할 수 있습니다.

  2. Mmsys.cpl 창이 열리면 재생 디바이스 목록 또는 기록 디바이스 목록에서 디바이스를 선택하고 속성을 클릭합니다.

  3. 속성 창이 열리면 고급을 클릭하고 기본 형식이라는 레이블이 지정된 상자의 사용 가능한 형식 목록에서 형식을 선택합니다.

예를 들어 사용자가 재생 디바이스에 사용할 수 있는 형식 목록에서 다음 기본 형식을 선택한다고 가정합니다.

2 채널, 16비트, 44100Hz(CD 품질)

이 형식은 디바이스가 공유 모드에서 작동할 때 이후에 사용할 형식입니다. Windows Vista에서 오디오 엔진은 공유 모드 스트림의 내부 처리에 이 형식의 약간 수정된 버전을 사용합니다. 오디오 엔진은 동일한 수의 채널(2개)과 동일한 샘플 속도(44100Hz)의 형식을 사용하지만 샘플을 처리하기 전에 부동 소수점 숫자로 변환합니다. 오디오 엔진은 디바이스를 통해 재생하기 전에 출력 조합의 부동 소수점 샘플을 16비트 정수로 변환합니다.

애플리케이션은 오디오 엔드포인트 디바이스의 PKEY_AudioEngine_DeviceFormat 속성을 쿼리하여 사용자가 디바이스에 대해 선택한 공유 모드 형식을 가져올 수 있습니다. 디바이스의 속성을 쿼리하는 방법에 대한 자세한 내용은 디바이스 속성을 참조하세요.

일부 애플리케이션은 디바이스의 PKEY_AudioEngine_DeviceFormat 속성에 지정된 형식이 디바이스에서 배타적 모드 스트림을 여는 데 적합한 형식이라고 할 수 있습니다. 단독 모드 스트림을 관리하는 다른 애플리케이션에는 디바이스와의 복잡한 형식 협상을 요구하는 추가 요구 사항이 있을 수 있습니다. 일반적으로 이러한 애플리케이션 중 하나는 목록의 시작 부분에 기본 설정 형식을 사용하여 적절한 형식 목록을 생성합니다. 그런 다음 애플리케이션은 디바이스에서 지원하는 형식을 발견할 때까지 목록의 시작 부분에서 시작하여 목록의 각 연속 형식으로 IsFormatSupported 를 반복적으로 호출합니다.

오디오 엔드포인트 디바이스