WAVEFORMATEXTENSIBLE 구조체(ksmedia.h)

WAVEFORMATEXTENSIBLE 구조체는 오디오 웨이브 스트림의 형식을 지정합니다.

구문

typedef struct {
  WAVEFORMATEX Format;
  union {
    WORD wValidBitsPerSample;
    WORD wSamplesPerBlock;
    WORD wReserved;
  } Samples;
  DWORD        dwChannelMask;
  GUID         SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;

구성원

Format

스트림의 웨이브 데이터 형식을 지정합니다. 이 멤버는 WAVEFORMATEX 형식의 구조체입니다. WAVEFORMATEX의 wFormat 멤버는 WAVE_FORMAT_EXTENSIBLE 설정해야 합니다. WAVEFORMATEX의 wBitsPerSample 멤버는 각 샘플에 대한 컨테이너 크기로 명확하게 정의됩니다. 샘플 컨테이너는 항상 바이트 정렬되며 wBitsPerSample 은 8의 배수여야 합니다.

Samples

Samples.wValidBitsPerSample

샘플의 전체 자릿수를 비트 단위로 지정합니다. 이 멤버의 값은 Format 에 지정된 컨테이너 크기보다 작거나 같아야 합니다. wBitsPerSample 멤버입니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

Samples.wSamplesPerBlock

하나의 압축된 블록에 포함된 샘플 수를 지정합니다. 이 값은 각 블록 내에 고정된 수의 샘플이 있는 압축 형식에 대한 버퍼 요구 사항을 예측하는 데 유용합니다. 압축된 오디오 데이터의 각 블록에 샘플 수가 가변적인 경우 이 멤버를 0으로 설정합니다. 이 경우 버퍼 예측 및 버퍼 위치 정보를 다른 방법으로 가져와야 합니다.

Samples.wReserved

운영 체제에서 내부용으로 예약됩니다. 0으로 초기화합니다.

dwChannelMask

멀티채널 스트림의 채널을 스피커 위치에 할당하도록 지정합니다. 인코딩은 KSAUDIO_CHANNEL_CONFIG 구조체의 ActiveSpeakerPositions 멤버에 사용되는 것과 동일합니다. 자세한 내용은 설명 섹션을 참조하세요.

SubFormat

하위 폼을 지정합니다. 자세한 내용은 설명 섹션을 참조하세요.

설명

WAVEFORMATEXTENSIBLE은 WAVEFORMATEX 구조체의 확장된 형태입니다. WAVEFORMATEX는 WAVEFORMATEXTENSIBLE에서 설명할 수 있는 형식의 하위 집합만 명확하게 설명할 수 있습니다. WAVEFORMATEXTENSIBLE은 두 개 이상의 채널이 있는 형식을 명확하게 지정할 수 없거나 샘플당 유효한 비트 수가 샘플 컨테이너 크기와 같지 않은 WAVEFORMATEX의 제한 사항이 적용되지 않습니다. 자세한 내용은 오디오 데이터 형식 및 데이터 범위를 참조하세요.

샘플 전체 자릿수를 지정하는 wValidBitsPerSample 멤버는 Format 과 동일한 값을 포함하는 경우가 많습니다. 샘플 컨테이너 크기를 지정하는 wBitsPerSample 멤버입니다. 그러나 이러한 값은 다를 수 있습니다. 예를 들어 웨이브 데이터가 20비트 A/D 변환기에서 시작된 경우 wValidBitsPerSample 은 20이지만 형식 이어야 합니다. wBitsPerSample 은 24 또는 32일 수 있습니다. wValidBitsPerSample형식 보다 작은 경우 wBitsPerSample, 유효한 비트(실제 PCM 데이터)는 컨테이너 내에서 왼쪽에 정렬됩니다. 컨테이너의 가장 중요한 부분에서 사용되지 않는 비트는 0으로 설정해야 합니다.

샘플 컨테이너는 바이트 경계 및 Format 값에서 시작 및 종료됩니다. wBitsPerSample 은 항상 8의 배수여야 합니다. 또한 wValidBitsPerSample 의 값은 형식 값을 초과해서는 안 됩니다. wBitsPerSample. 드라이버는 이러한 규칙을 위반하는 웨이브 형식을 거부해야 합니다.

WAVEFORMATEXTENSIBLE 구조체의 dwChannelMask 멤버에는 다중 채널 스트림에 있는 채널을 나타내는 마스크가 포함되어 있습니다. 가장 중요한 비트는 왼쪽 앞 스피커를 나타내고, 다음 비트는 오른쪽 앞 스피커에 해당합니다. 다음 플래그 비트는 헤더 파일 Ksmedia.h 에 정의됩니다.

화자 위치 플래그 비트
SPEAKER_FRONT_LEFT 0x1
SPEAKER_FRONT_RIGHT 0x2
SPEAKER_FRONT_CENTER 0x4
SPEAKER_LOW_FREQUENCY 0x8
SPEAKER_BACK_LEFT 0x10
SPEAKER_BACK_RIGHT 0x20
SPEAKER_FRONT_LEFT_OF_CENTER 0x40
SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
SPEAKER_BACK_CENTER 0x100
SPEAKER_SIDE_LEFT 0x200
SPEAKER_SIDE_RIGHT 0x400
SPEAKER_TOP_CENTER 0x800
SPEAKER_TOP_FRONT_LEFT 0x1000
SPEAKER_TOP_FRONT_CENTER 0x2000
SPEAKER_TOP_FRONT_RIGHT 0x4000
SPEAKER_TOP_BACK_LEFT 0x8000
SPEAKER_TOP_BACK_CENTER 0x10000
SPEAKER_TOP_BACK_RIGHT 0x20000

dwChannelMask 에 지정된 채널은 맨 위에서 시작하여 앞의 표에 표시된 순서대로 있어야 합니다.

예를 들어 왼쪽 앞과 앞 중심만 지정한 경우 왼쪽 및 전면 중심은 인터리브 스트림의 채널 0과 1에 각각 있어야 합니다.

두 번째 예제로, nChannels ( Format 멤버의 경우 WAVEFORMATEX 참조)가 4로 설정되고 dwChannelMask 가 0x00000033 설정된 경우 오디오 채널은 전면 왼쪽, 앞 오른쪽, 뒤로, 오른쪽 스피커로 재생됩니다. 채널 데이터는 각 블록 내에서 해당 순서로 인터리브되어야 합니다.

미리 정의된 위치 이외의 채널 위치는 예약된 것으로 간주됩니다.

또는 채널 마스크를 Ksmedia.h 에 정의되고 표준 스피커 구성을 나타내는 이전 플래그의 비트 ORed 조합인 다음 상수 중 하나로 지정할 수 있습니다.

KSAUDIO_SPEAKER_MONO

KSAUDIO_SPEAKER_STEREO

KSAUDIO_SPEAKER_QUAD

KSAUDIO_SPEAKER_SURROUND

KSAUDIO_SPEAKER_5POINT1

KSAUDIO_SPEAKER_7POINT1

KSAUDIO_SPEAKER_DIRECTOUT

하드웨어 디바이스는 KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property 요청을 통해 이러한 스피커 구성 중 하나로 설정할 수 있습니다. 화자 구성 설정에 대한 자세한 내용은 KSAUDIO_CHANNEL_CONFIG 참조하세요.

일반적으로 nChannels 의 개수는 dwChannelMask 에 설정된 비트 수와 같지만 반드시 그렇지는 않습니다. nChannelsdwChannelMask에 설정된 비트 수보다 작으면 dwChannelMask 의 추가(가장 중요한) 비트는 무시됩니다. nChannelsdwChannelMask 에 설정된 비트 수를 초과하는 경우 해당 마스크 비트가 없는 채널은 실제 스피커 위치에 할당되지 않습니다. KSAUDIO_SPEAKER_DIRECTOUT 이외의 스피커 구성에서 KMixer( KMixer 시스템 드라이버 참조)와 같은 오디오 싱크는 이러한 초과 채널을 무시하고 해당 마스크 비트가 있는 채널만 혼합합니다.

KSAUDIO_SPEAKER_DIRECTOUT 스피커가 없는 구성을 나타내며 Ksmedia.h 에서 0으로 정의됩니다. 이 구성에서 오디오 디바이스는 디바이스의 첫 번째 포트에 첫 번째 채널을 렌더링하고, 두 번째 채널을 디바이스의 두 번째 포트로 렌더링합니다. 이를 통해 오디오 제작 애플리케이션은 디지털 믹서 또는 디지털 오디오 스토리지 디바이스(하드 디스크 또는 ADAT)와 같은 디바이스를 수정하지 않고 멀티채널 데이터를 직접 출력할 수 있습니다. 예를 들어 채널 0~30은 각각 드럼, 기타, 베이스, 음성 등을 포함할 수 있습니다. 이러한 종류의 원시 오디오 데이터의 경우 스피커 위치는 의미가 없으며 입력 또는 출력 스트림에 스피커 위치를 할당하면 KMixer와 같은 구성 요소가 원치 않는 형식 변환을 수행하여 부적절하게 개입할 수 있습니다. 디바이스가 원시 오디오 스트림을 처리할 수 없는 경우 스피커 구성을 KSAUDIO_SPEAKER_DIRECTOUT 변경하라는 요청을 거부해야 합니다. 자세한 내용은 DSSPEAKER_DIRECTOUT Speaker 구성을 참조하세요.

다중 채널 구성에 대한 자세한 내용은 오디오 기술 웹 사이트의 다중 채널 오디오 데이터 및 WAVE 파일 이라는 백서를 참조하세요.

SubFormat 멤버에는 웨이브 스트림에 대한 일반 데이터 형식을 지정하는 GUID가 포함되어 있습니다. 예를 들어 이 GUID는 스트림에 정수 PCM 데이터가 포함되도록 지정할 수 있습니다. 다른 멤버는 샘플 크기 및 채널 수와 같은 추가 정보를 제공합니다. SubFormat GUID의 의미는 WAVEFORMATEX 구조체의 wFormatTag 멤버에 있는 16비트 형식 태그의 의미와 비슷합니다.

WAVEFORMATEXTENSIBLE이 Windows 98 Second Edition에 도입되기 전에 WAVEFORMATEX는 웨이브 형식을 지정하는 데 선호되는 구조였습니다. 당시 공급업체는 공식 형식 태그를 형식에 할당할 수 있도록 Microsoft에 각 새 웨이브 형식을 등록해야 했습니다. 등록된 형식 태그 목록이 공용 헤더 파일 Mmreg.h 에 표시됩니다.

WAVEFORMATEXTENSIBLE을 사용하면 더 이상 형식을 등록할 필요가 없습니다. 공급업체는 필요에 따라 하위 폼 GUID를 새 형식에 독립적으로 할당할 수 있습니다. 그러나 Microsoft는 공용 헤더 파일 Ksmedia.h 에서 가장 인기 있는 SubFormat GUID 중 일부를 나열합니다. 새 SubFormat GUID를 정의하기 전에 공급업체는 Ksmedia.h 의 KSDATAFORMAT_SUBTYPE_ Xxx 상수 목록을 확인하여 특정 형식에 대해 적절한 GUID가 이미 정의되었는지 확인해야 합니다.

이전 버전과의 호환성을 위해 독립 실행형 WAVEFORMATEX 구조체로 지정할 수 있는 모든 웨이브 형식을 WAVEFORMATEXTENSIBLE 구조체로 정의할 수도 있습니다. 따라서 Mmreg.h의 모든 형식 태그에는 해당하는 SubFormat GUID가 있습니다. 다음 표에서는 몇 가지 일반적인 형식 태그와 해당 SubFormat GUID를 보여 줍니다.

서식 태그 SubFormat GUID
WAVE_FORMAT_PCM KSDATAFORMAT_SUBTYPE_PCM
WAVE_FORMAT_IEEE_FLOAT KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
WAVE_FORMAT_DRM KSDATAFORMAT_SUBTYPE_DRM
WAVE_FORMAT_ALAW KSDATAFORMAT_SUBTYPE_ALAW
WAVE_FORMAT_MULAW KSDATAFORMAT_SUBTYPE_MULAW
WAVE_FORMAT_ADPCM KSDATAFORMAT_SUBTYPE_ADPCM

자세한 내용은 서식 태그와 하위 서식 GUID 간 변환을 참조하세요.

WAVEFORMATEXTENSIBLE은 WAVEFORMATEX의 확장 버전이므로 WAVEFORMATEX에서만 설명할 수 없는 추가 형식을 설명할 수 있습니다. 공급업체는 웨이브 형식 태그가 없는 독점 형식을 식별하기 위해 자체 SubFormat GUID를 자유롭게 정의할 수 있습니다.

요구 사항

   
헤더 ksmedia.h(Mmreg.h, Ksmedia.h, Mmreg.h 포함)

참고 항목

KSAUDIO_CHANNEL_CONFIG

WAVEFORMATEX