/*************************************************************************** * * 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 // 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__