264 lines
10 KiB
C
264 lines
10 KiB
C
|
/***************************************************************************
|
||
|
*
|
||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
*
|
||
|
* File: audiodefs.h
|
||
|
* Content: Basic constants and data types for audio work.
|
||
|
*
|
||
|
* Remarks: This header file defines all of the audio format constants and
|
||
|
* structures required for XAudio2 and XACT work. Providing these
|
||
|
* in a single location avoids certain dependency problems in the
|
||
|
* legacy audio headers (mmreg.h, mmsystem.h, ksmedia.h).
|
||
|
*
|
||
|
* NOTE: Including the legacy headers after this one may cause a
|
||
|
* compilation error, because they define some of the same types
|
||
|
* defined here without preprocessor guards to avoid multiple
|
||
|
* definitions. If a source file needs one of the old headers,
|
||
|
* it must include it before including audiodefs.h.
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifndef __AUDIODEFS_INCLUDED__
|
||
|
#define __AUDIODEFS_INCLUDED__
|
||
|
|
||
|
#include <windef.h> // For WORD, DWORD, etc.
|
||
|
|
||
|
#pragma pack(push, 1) // Pack structures to 1-byte boundaries
|
||
|
|
||
|
|
||
|
/**************************************************************************
|
||
|
*
|
||
|
* WAVEFORMATEX: Base structure for many audio formats. Format-specific
|
||
|
* extensions can be defined for particular formats by using a non-zero
|
||
|
* cbSize value and adding extra fields to the end of this structure.
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifndef _WAVEFORMATEX_
|
||
|
|
||
|
#define _WAVEFORMATEX_
|
||
|
typedef struct tWAVEFORMATEX
|
||
|
{
|
||
|
WORD wFormatTag; // Integer identifier of the format
|
||
|
WORD nChannels; // Number of audio channels
|
||
|
DWORD nSamplesPerSec; // Audio sample rate
|
||
|
DWORD nAvgBytesPerSec; // Bytes per second (possibly approximate)
|
||
|
WORD nBlockAlign; // Size in bytes of a sample block (all channels)
|
||
|
WORD wBitsPerSample; // Size in bits of a single per-channel sample
|
||
|
WORD cbSize; // Bytes of extra data appended to this struct
|
||
|
} WAVEFORMATEX;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
// Defining pointer types outside of the #if block to make sure they are
|
||
|
// defined even if mmreg.h or mmsystem.h is #included before this file
|
||
|
|
||
|
typedef WAVEFORMATEX *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;
|
||
|
typedef const WAVEFORMATEX *PCWAVEFORMATEX, *LPCWAVEFORMATEX;
|
||
|
|
||
|
|
||
|
/**************************************************************************
|
||
|
*
|
||
|
* WAVEFORMATEXTENSIBLE: Extended version of WAVEFORMATEX that should be
|
||
|
* used as a basis for all new audio formats. The format tag is replaced
|
||
|
* with a GUID, allowing new formats to be defined without registering a
|
||
|
* format tag with Microsoft. There are also new fields that can be used
|
||
|
* to specify the spatial positions for each channel and the bit packing
|
||
|
* used for wide samples (e.g. 24-bit PCM samples in 32-bit containers).
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifndef _WAVEFORMATEXTENSIBLE_
|
||
|
|
||
|
#define _WAVEFORMATEXTENSIBLE_
|
||
|
typedef struct
|
||
|
{
|
||
|
WAVEFORMATEX Format; // Base WAVEFORMATEX data
|
||
|
union
|
||
|
{
|
||
|
WORD wValidBitsPerSample; // Valid bits in each sample container
|
||
|
WORD wSamplesPerBlock; // Samples per block of audio data; valid
|
||
|
// if wBitsPerSample=0 (but rarely used).
|
||
|
WORD wReserved; // Zero if neither case above applies.
|
||
|
} Samples;
|
||
|
DWORD dwChannelMask; // Positions of the audio channels
|
||
|
GUID SubFormat; // Format identifier GUID
|
||
|
} WAVEFORMATEXTENSIBLE;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
typedef WAVEFORMATEXTENSIBLE *PWAVEFORMATEXTENSIBLE, *LPWAVEFORMATEXTENSIBLE;
|
||
|
typedef const WAVEFORMATEXTENSIBLE *PCWAVEFORMATEXTENSIBLE, *LPCWAVEFORMATEXTENSIBLE;
|
||
|
|
||
|
|
||
|
|
||
|
/**************************************************************************
|
||
|
*
|
||
|
* Define the most common wave format tags used in WAVEFORMATEX formats.
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifndef WAVE_FORMAT_PCM // Pulse Code Modulation
|
||
|
|
||
|
// If WAVE_FORMAT_PCM is not defined, we need to define some legacy types
|
||
|
// for compatibility with the Windows mmreg.h / mmsystem.h header files.
|
||
|
|
||
|
// Old general format structure (information common to all formats)
|
||
|
typedef struct waveformat_tag
|
||
|
{
|
||
|
WORD wFormatTag;
|
||
|
WORD nChannels;
|
||
|
DWORD nSamplesPerSec;
|
||
|
DWORD nAvgBytesPerSec;
|
||
|
WORD nBlockAlign;
|
||
|
} WAVEFORMAT, *PWAVEFORMAT, NEAR *NPWAVEFORMAT, FAR *LPWAVEFORMAT;
|
||
|
|
||
|
// Specific format structure for PCM data
|
||
|
typedef struct pcmwaveformat_tag
|
||
|
{
|
||
|
WAVEFORMAT wf;
|
||
|
WORD wBitsPerSample;
|
||
|
} PCMWAVEFORMAT, *PPCMWAVEFORMAT, NEAR *NPPCMWAVEFORMAT, FAR *LPPCMWAVEFORMAT;
|
||
|
|
||
|
#define WAVE_FORMAT_PCM 0x0001
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#ifndef WAVE_FORMAT_ADPCM // Microsoft Adaptive Differental PCM
|
||
|
|
||
|
// Replicate the Microsoft ADPCM type definitions from mmreg.h.
|
||
|
|
||
|
typedef struct adpcmcoef_tag
|
||
|
{
|
||
|
short iCoef1;
|
||
|
short iCoef2;
|
||
|
} ADPCMCOEFSET;
|
||
|
|
||
|
#pragma warning(push)
|
||
|
#pragma warning(disable:4200) // Disable zero-sized array warnings
|
||
|
|
||
|
typedef struct adpcmwaveformat_tag {
|
||
|
WAVEFORMATEX wfx;
|
||
|
WORD wSamplesPerBlock;
|
||
|
WORD wNumCoef;
|
||
|
ADPCMCOEFSET aCoef[]; // Always 7 coefficient pairs for MS ADPCM
|
||
|
} ADPCMWAVEFORMAT;
|
||
|
|
||
|
#pragma warning(pop)
|
||
|
|
||
|
#define WAVE_FORMAT_ADPCM 0x0002
|
||
|
|
||
|
#endif
|
||
|
|
||
|
// Other frequently used format tags
|
||
|
|
||
|
#ifndef WAVE_FORMAT_UNKNOWN
|
||
|
#define WAVE_FORMAT_UNKNOWN 0x0000 // Unknown or invalid format tag
|
||
|
#endif
|
||
|
|
||
|
#ifndef WAVE_FORMAT_IEEE_FLOAT
|
||
|
#define WAVE_FORMAT_IEEE_FLOAT 0x0003 // 32-bit floating-point
|
||
|
#endif
|
||
|
|
||
|
#ifndef WAVE_FORMAT_MPEGLAYER3
|
||
|
#define WAVE_FORMAT_MPEGLAYER3 0x0055 // ISO/MPEG Layer3
|
||
|
#endif
|
||
|
|
||
|
#ifndef WAVE_FORMAT_DOLBY_AC3_SPDIF
|
||
|
#define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092 // Dolby Audio Codec 3 over S/PDIF
|
||
|
#endif
|
||
|
|
||
|
#ifndef WAVE_FORMAT_WMAUDIO2
|
||
|
#define WAVE_FORMAT_WMAUDIO2 0x0161 // Windows Media Audio
|
||
|
#endif
|
||
|
|
||
|
#ifndef WAVE_FORMAT_WMAUDIO3
|
||
|
#define WAVE_FORMAT_WMAUDIO3 0x0162 // Windows Media Audio Pro
|
||
|
#endif
|
||
|
|
||
|
#ifndef WAVE_FORMAT_WMASPDIF
|
||
|
#define WAVE_FORMAT_WMASPDIF 0x0164 // Windows Media Audio over S/PDIF
|
||
|
#endif
|
||
|
|
||
|
#ifndef WAVE_FORMAT_EXTENSIBLE
|
||
|
#define WAVE_FORMAT_EXTENSIBLE 0xFFFE // All WAVEFORMATEXTENSIBLE formats
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/**************************************************************************
|
||
|
*
|
||
|
* Define the most common wave format GUIDs used in WAVEFORMATEXTENSIBLE
|
||
|
* formats. Note that including the Windows ksmedia.h header after this
|
||
|
* one will cause build problems; this cannot be avoided, since ksmedia.h
|
||
|
* defines these macros without preprocessor guards.
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifdef __cplusplus // uuid() and __uuidof() are only available in C++
|
||
|
|
||
|
#ifndef KSDATAFORMAT_SUBTYPE_PCM
|
||
|
struct __declspec(uuid("00000001-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_PCM_STRUCT;
|
||
|
#define KSDATAFORMAT_SUBTYPE_PCM __uuidof(KSDATAFORMAT_SUBTYPE_PCM_STRUCT)
|
||
|
#endif
|
||
|
|
||
|
#ifndef KSDATAFORMAT_SUBTYPE_ADPCM
|
||
|
struct __declspec(uuid("00000002-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_ADPCM_STRUCT;
|
||
|
#define KSDATAFORMAT_SUBTYPE_ADPCM __uuidof(KSDATAFORMAT_SUBTYPE_ADPCM_STRUCT)
|
||
|
#endif
|
||
|
|
||
|
#ifndef KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
|
||
|
struct __declspec(uuid("00000003-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_IEEE_FLOAT_STRUCT;
|
||
|
#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT __uuidof(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT_STRUCT)
|
||
|
#endif
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/**************************************************************************
|
||
|
*
|
||
|
* Speaker positions used in the WAVEFORMATEXTENSIBLE dwChannelMask field.
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifndef SPEAKER_FRONT_LEFT
|
||
|
#define SPEAKER_FRONT_LEFT 0x00000001
|
||
|
#define SPEAKER_FRONT_RIGHT 0x00000002
|
||
|
#define SPEAKER_FRONT_CENTER 0x00000004
|
||
|
#define SPEAKER_LOW_FREQUENCY 0x00000008
|
||
|
#define SPEAKER_BACK_LEFT 0x00000010
|
||
|
#define SPEAKER_BACK_RIGHT 0x00000020
|
||
|
#define SPEAKER_FRONT_LEFT_OF_CENTER 0x00000040
|
||
|
#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x00000080
|
||
|
#define SPEAKER_BACK_CENTER 0x00000100
|
||
|
#define SPEAKER_SIDE_LEFT 0x00000200
|
||
|
#define SPEAKER_SIDE_RIGHT 0x00000400
|
||
|
#define SPEAKER_TOP_CENTER 0x00000800
|
||
|
#define SPEAKER_TOP_FRONT_LEFT 0x00001000
|
||
|
#define SPEAKER_TOP_FRONT_CENTER 0x00002000
|
||
|
#define SPEAKER_TOP_FRONT_RIGHT 0x00004000
|
||
|
#define SPEAKER_TOP_BACK_LEFT 0x00008000
|
||
|
#define SPEAKER_TOP_BACK_CENTER 0x00010000
|
||
|
#define SPEAKER_TOP_BACK_RIGHT 0x00020000
|
||
|
#define SPEAKER_RESERVED 0x7FFC0000
|
||
|
#define SPEAKER_ALL 0x80000000
|
||
|
#define _SPEAKER_POSITIONS_
|
||
|
#endif
|
||
|
|
||
|
#ifndef SPEAKER_STEREO
|
||
|
#define SPEAKER_MONO (SPEAKER_FRONT_CENTER)
|
||
|
#define SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)
|
||
|
#define SPEAKER_2POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY)
|
||
|
#define SPEAKER_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER)
|
||
|
#define SPEAKER_QUAD (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
|
||
|
#define SPEAKER_4POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
|
||
|
#define SPEAKER_5POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
|
||
|
#define SPEAKER_7POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER)
|
||
|
#define SPEAKER_5POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)
|
||
|
#define SPEAKER_7POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#pragma pack(pop)
|
||
|
|
||
|
#endif // #ifndef __AUDIODEFS_INCLUDED__
|