확장 가능한 Wave-Format 설명자

다음 그림에서는 웨이브 오디오 스트림에 대한 데이터 형식 설명자를 보여줍니다.

오디오 스트림의 웨이브 형식 설명자를 보여 주는 다이어그램

그림에 표시된 것처럼 KSDATAFORMAT 구조에 따른 추가 형식 정보의 양은 데이터 형식에 따라 달라집니다.

오디오 시스템은 다음과 같은 여러 가지 방법으로 이러한 형식 설명자를 사용합니다.

  • 앞의 그림과 같은 형식 설명자는 미니포트 드라이버의 NewStream 메서드에 대한 호출 매개 변수로 전달됩니다(예: IMiniportWaveCyclic::NewStream 참조).

  • IMiniport::D ataRangeIntersection 메서드의 ResultantFormat 매개 변수는 메서드가 이전 그림에 표시된 것과 같은 형식 설명자를 작성하는 버퍼를 가리킵니다.

  • KSPROPERTY_PIN_DATAINTERSECTION get-property 요청은 이전 그림과 같은 형식 설명자를 검색합니다.

  • KSPROPERTY_PIN_PROPOSEDATAFORMAT set-property 요청은 이전 그림과 같은 형식 설명자를 허용합니다.

  • KsCreatePin 함수의 Connect 호출 매개 변수에 유사한 형식이 사용됩니다. 이 매개 변수는 서식 설명자가 포함된 버퍼의 시작 부분에 있는 KSPIN_CONNECT 구조를 가리킵니다. KSPIN_CONNECT 구조 바로 뒤에 오는 형식 설명자는 앞 그림과 같이 KSDATAFORMAT 구조체로 시작합니다.

KSDATAFORMAT 구조 다음에 나오는 형식 정보는 WAVEFORMATEXTENSIBLE 구조체여야 합니다. WAVEFORMATEXTENSIBLE은 WAVEFORMATEX보다 광범위한 형식을 설명할 수 있는 WAVEFORMATEX의 확장 버전입니다.

WAVEFORMAT는 사용되지 않으며 모든 버전의 Microsoft Windows에서 WDM 오디오 하위 시스템에 의해 지원되지 않습니다. PCMWAVEFORMAT 구조체는 더 이상 사용되지 않는 WAVEFORMAT의 확장 버전입니다.

WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX 및 WAVEFORMATEXTENSIBLE의 네 가지 웨이브 형식 구조체는 모두 wFormatTag부터 동일한 5개 멤버로 시작합니다. 앞의 그림은 동일한 구조체의 부분을 강조 표시하기 위해 서로 겹쳐진 이러한 4개의 구조를 보여 줍니다.

WAVEFORMATEXTENSIBLE은 Samples.wValidBitsPerSample부터 3개의 멤버를 추가하여 WAVEFORMATEX를 확장합니다. (샘플 은 다른 멤버인 wValidSamplesPerBlock이 일부 압축된 형식에 대해 wValidBitsPerSample 대신 사용되는 공용 구조체입니다.) 버퍼의 KSDATAFORMAT 구조체 끝 바로 뒤에 나오는 wFormatTag 멤버는 KSDATAFORMAT 다음에 나오는 형식 정보의 종류를 지정합니다.

WAVEFORMATEX와 달리 WAVEFORMATEXTENSIBLE은 다음을 수행할 수 있습니다.

  1. 샘플 컨테이너의 크기와 별도로 샘플당 비트 수를 지정합니다. 예를 들어 20비트 샘플은 3비트 컨테이너 내에 왼쪽 맞춤으로 저장할 수 있습니다. 샘플당 데이터 비트 수를 샘플 컨테이너 크기와 구분하지 못하는 WAVEFORMATEX는 이러한 형식을 명확하게 설명할 수 없습니다.

  2. 다중 채널 스트림의 오디오 채널에 특정 스피커 위치를 할당합니다. WAVEFORMATEX는 이 기능이 부족하며 모노 및 (2 채널) 스테레오 스트림만 적절하게 지원할 수 있습니다.

WAVEFORMATEX의 레거시 사용

WAVEFORMATEX에서 설명하는 모든 형식은 WAVEFORMATEXTENSIBLE에서도 설명할 수 있습니다. WAVEFORMATEX 구조를 WAVEFORMATEXTENSIBLE로 변환하는 방법에 대한 자세한 내용은 서식 태그와 하위 형식 GUID 간 변환을 참조하세요.

WAVEFORMATEX는 샘플 크기가 8비트 또는 16비트인 형식을 설명하는 데 충분하지만 WAVEFORMATEXTENSIBLE은 16비트보다 큰 샘플 정밀도로 형식을 적절하게 설명하는 데 필요합니다. 다음 두 가지 예제를 살펴보세요.

  • 샘플 전체 자릿수가 24비트인 스트림은 효율적인 처리를 위해 32비트 컨테이너 크기를 사용할 수 있지만 데이터 손실 없이 스토리지 효율성을 개선하기 위해 24비트 컨테이너를 사용하도록 변환할 수 있습니다.

  • 24비트 샘플 데이터로 스트림을 처리할 때 20비트 정밀도만 제공하는 렌더링 디바이스는 디더링을 사용하여 출력 신호의 충실도를 향상시킬 수 있습니다. 그러나 디더링에는 추가 처리 시간이 필요하며 원래 스트림이 20비트까지만 정확하면 추가 처리가 필요하지 않습니다.

이러한 두 예제에서 샘플 정밀도와 컨테이너 크기가 모두 알려진 경우에만 처리와 스토리지 효율성 간에 적절한 절충을 만들면서 신호 품질을 유지할 수 있습니다.

WAVEFORMATEX 또는 WAVEFORMATEXTENSIBLE 구조체에서 간단한 형식을 명확하게 설명할 수 있는 경우 오디오 드라이버는 형식을 설명하는 구조체 중 하나를 선택할 수 있습니다. 그러나 오디오 드라이버는 일반적으로 WAVEFORMATEX를 사용하여 8비트 또는 16비트 샘플로 모노 및 (2 채널) 스테레오 PCM 형식을 지정했으며, 일부 이전 애플리케이션에서는 모든 오디오 드라이버가 WAVEFORMATEX를 사용하여 이러한 형식을 지정할 것으로 예상할 수 있습니다.

드라이버가 WAVEFORMATEX 또는 WAVEFORMATEXTENSIBLE 구조체로 명확하게 지정할 수 있는 오디오 형식을 지원하는 경우 드라이버는 클라이언트 애플리케이션 또는 구성 요소가 구조를 지정하는 데 사용하는 두 구조체 중 어느 구조체에 관계없이 형식을 인식해야 합니다. 예를 들어 오디오 디바이스가 44.1kHz, 16비트 스테레오 PCM 형식을 지원하는 경우 미니포트 드라이버의 KSPROPERTY_PIN_PROPOSEDATAFORMAT 속성 처리기와 NewStream 메서드의 구현은 형식이 WAVEFORMATEX 또는 WAVEFORMATEXTENSIBLE 구조체로 지정되었는지 여부에 관계없이 해당 형식을 수락해야 합니다.

형식 데이터의 처리를 간소화하기 위해 드라이버는 일반적으로 WAVEFORMATEXTENSIBLE 구조를 사용하여 형식을 내부적으로 나타냅니다. 이 방법을 사용하려면 입력 WAVEFORMATEX 구조체를 내부 WAVEFORMATEXTENSIBLE 표현으로 변환하거나 내부 WAVEFORMATEXTENSIBLE 표현을 출력 WAVEFORMATEX 구조체로 변환해야 할 수 있습니다.

WAVEFORMATEXTENSIBLE에서 dwBitsPerSample 은 컨테이너 크기이고 wValidBitsPerSample 은 샘플당 유효한 데이터 비트 수입니다. 컨테이너는 항상 메모리에서 바이트 정렬되며 컨테이너 크기는 8비트의 배수로 지정되어야 합니다.