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 값은 Format 값을 초과해서는 안 됩니다. 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 Configuration을 참조하세요.

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

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

WINDOWS 98 Second Edition에서 WAVEFORMATEXTENSIBLE이 도입되기 전에는 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