19 #include <audiodefs.h> 23 #pragma warning(disable:4201) 24 #pragma warning(disable:4214) // nonstandard extension used : bit field types other than int 28 #define XACTUNALIGNED __unaligned 34 #pragma bitfield_order(push, lsb_to_msb) 37 #define WAVEBANK_HEADER_SIGNATURE 'DNBW' // WaveBank RIFF chunk signature 38 #define WAVEBANK_HEADER_VERSION 44 // Current wavebank file version 40 #define WAVEBANK_BANKNAME_LENGTH 64 // Wave bank friendly name length, in characters 41 #define WAVEBANK_ENTRYNAME_LENGTH 64 // Wave bank entry friendly name length, in characters 43 #define WAVEBANK_MAX_DATA_SEGMENT_SIZE 0xFFFFFFFF // Maximum wave bank data segment size, in bytes 44 #define WAVEBANK_MAX_COMPACT_DATA_SEGMENT_SIZE 0x001FFFFF // Maximum compact wave bank data segment size, in bytes 46 typedef DWORD WAVEBANKOFFSET;
52 #define WAVEBANK_TYPE_BUFFER 0x00000000 // In-memory buffer 53 #define WAVEBANK_TYPE_STREAMING 0x00000001 // Streaming 54 #define WAVEBANK_TYPE_MASK 0x00000001 56 #define WAVEBANK_FLAGS_ENTRYNAMES 0x00010000 // Bank includes entry names 57 #define WAVEBANK_FLAGS_COMPACT 0x00020000 // Bank uses compact format 58 #define WAVEBANK_FLAGS_SYNC_DISABLED 0x00040000 // Bank is disabled for audition sync 59 #define WAVEBANK_FLAGS_SEEKTABLES 0x00080000 // Bank includes seek tables. 60 #define WAVEBANK_FLAGS_MASK 0x000F0000 66 #define WAVEBANKENTRY_FLAGS_READAHEAD 0x00000001 // Enable stream read-ahead 67 #define WAVEBANKENTRY_FLAGS_LOOPCACHE 0x00000002 // One or more looping sounds use this wave 68 #define WAVEBANKENTRY_FLAGS_REMOVELOOPTAIL 0x00000004 // Remove data after the end of the loop region 69 #define WAVEBANKENTRY_FLAGS_IGNORELOOP 0x00000008 // Used internally when the loop region can't be used 70 #define WAVEBANKENTRY_FLAGS_MASK 0x00000008 76 #define WAVEBANKMINIFORMAT_TAG_PCM 0x0 // PCM data 77 #define WAVEBANKMINIFORMAT_TAG_XMA 0x1 // XMA data 78 #define WAVEBANKMINIFORMAT_TAG_ADPCM 0x2 // ADPCM data 79 #define WAVEBANKMINIFORMAT_TAG_WMA 0x3 // WMA data 81 #define WAVEBANKMINIFORMAT_BITDEPTH_8 0x0 // 8-bit data (PCM only) 82 #define WAVEBANKMINIFORMAT_BITDEPTH_16 0x1 // 16-bit data (PCM only) 87 #define WAVEBANKENTRY_XMASTREAMS_MAX 3 // enough for 5.1 channel audio 88 #define WAVEBANKENTRY_XMACHANNELS_MAX 6 // enough for 5.1 channel audio (cf. XAUDIOCHANNEL_SOURCEMAX) 94 #define WAVEBANK_DVD_SECTOR_SIZE 2048 95 #define WAVEBANK_DVD_BLOCK_SIZE (WAVEBANK_DVD_SECTOR_SIZE * 16) 101 #define WAVEBANK_ALIGNMENT_MIN 4 // Minimum alignment 102 #define WAVEBANK_ALIGNMENT_DVD WAVEBANK_DVD_SECTOR_SIZE // DVD-optimized alignment 108 typedef enum WAVEBANKSEGIDX
110 WAVEBANK_SEGIDX_BANKDATA = 0,
111 WAVEBANK_SEGIDX_ENTRYMETADATA,
112 WAVEBANK_SEGIDX_SEEKTABLES,
113 WAVEBANK_SEGIDX_ENTRYNAMES,
114 WAVEBANK_SEGIDX_ENTRYWAVEDATA,
115 WAVEBANK_SEGIDX_COUNT
116 } WAVEBANKSEGIDX, *LPWAVEBANKSEGIDX;
118 typedef const WAVEBANKSEGIDX *LPCWAVEBANKSEGIDX;
126 namespace XACTWaveBank
128 __inline
void SwapBytes(XACTUNALIGNED DWORD &dw)
143 dw = _byteswap_ulong(dw);
149 __inline
void SwapBytes(XACTUNALIGNED WORD &w)
164 w = _byteswap_ushort(w);
172 #endif // __cplusplus 187 XACTWaveBank::SwapBytes(dwOffset);
188 XACTWaveBank::SwapBytes(dwLength);
191 #endif // __cplusplus 205 DWORD dwTotalSamples;
211 XACTWaveBank::SwapBytes(dwStartSample);
212 XACTWaveBank::SwapBytes(dwTotalSamples);
215 #endif // __cplusplus 230 DWORD dwHeaderVersion;
237 XACTWaveBank::SwapBytes(dwSignature);
238 XACTWaveBank::SwapBytes(dwVersion);
239 XACTWaveBank::SwapBytes(dwHeaderVersion);
241 for(
int i = 0; i < WAVEBANK_SEGIDX_COUNT; i++)
243 Segments[i].SwapBytes();
247 #endif // __cplusplus 258 #define MAX_WMA_AVG_BYTES_PER_SEC_ENTRIES 7 260 static const DWORD aWMAAvgBytesPerSec[] =
277 #define MAX_WMA_BLOCK_ALIGN_ENTRIES 17 279 static const DWORD aWMABlockAlign[] =
310 DWORD wFormatTag : 2;
312 DWORD nSamplesPerSec : 18;
313 DWORD wBlockAlign : 8;
314 DWORD wBitsPerSample : 1;
323 XACTWaveBank::SwapBytes(dwValue);
326 WORD BitsPerSample()
const 328 if (wFormatTag == WAVEBANKMINIFORMAT_TAG_XMA)
329 return XMA_OUTPUT_SAMPLE_BITS;
330 if (wFormatTag == WAVEBANKMINIFORMAT_TAG_WMA)
332 if (wFormatTag == WAVEBANKMINIFORMAT_TAG_ADPCM)
336 return (wBitsPerSample == WAVEBANKMINIFORMAT_BITDEPTH_16) ? 16 : 8;
339 #define ADPCM_MINIWAVEFORMAT_BLOCKALIGN_CONVERSION_OFFSET 22 340 DWORD BlockAlign()
const 346 case WAVEBANKMINIFORMAT_TAG_PCM:
347 dwReturn = wBlockAlign;
350 case WAVEBANKMINIFORMAT_TAG_XMA:
351 dwReturn = nChannels * XMA_OUTPUT_SAMPLE_BITS / 8;
354 case WAVEBANKMINIFORMAT_TAG_ADPCM:
355 dwReturn = (wBlockAlign + ADPCM_MINIWAVEFORMAT_BLOCKALIGN_CONVERSION_OFFSET) * nChannels;
358 case WAVEBANKMINIFORMAT_TAG_WMA:
360 DWORD dwBlockAlignIndex = wBlockAlign & 0x1F;
361 if (dwBlockAlignIndex < MAX_WMA_BLOCK_ALIGN_ENTRIES)
362 dwReturn = aWMABlockAlign[dwBlockAlignIndex];
370 DWORD AvgBytesPerSec()
const 376 case WAVEBANKMINIFORMAT_TAG_PCM:
377 case WAVEBANKMINIFORMAT_TAG_XMA:
378 dwReturn = nSamplesPerSec * wBlockAlign;
381 case WAVEBANKMINIFORMAT_TAG_ADPCM:
383 DWORD blockAlign = BlockAlign();
384 DWORD samplesPerAdpcmBlock = AdpcmSamplesPerBlock();
385 dwReturn = blockAlign * nSamplesPerSec / samplesPerAdpcmBlock;
389 case WAVEBANKMINIFORMAT_TAG_WMA:
391 DWORD dwBytesPerSecIndex = wBlockAlign >> 5;
392 if (dwBytesPerSecIndex < MAX_WMA_AVG_BYTES_PER_SEC_ENTRIES)
393 dwReturn = aWMAAvgBytesPerSec[dwBytesPerSecIndex];
401 DWORD EncodeWMABlockAlign(DWORD dwBlockAlign, DWORD dwAvgBytesPerSec)
const 404 DWORD dwBlockAlignIndex = 0;
405 DWORD dwBytesPerSecIndex = 0;
407 for (; dwBlockAlignIndex < MAX_WMA_BLOCK_ALIGN_ENTRIES && dwBlockAlign != aWMABlockAlign[dwBlockAlignIndex]; dwBlockAlignIndex++);
409 if (dwBlockAlignIndex < MAX_WMA_BLOCK_ALIGN_ENTRIES)
411 for (; dwBytesPerSecIndex < MAX_WMA_AVG_BYTES_PER_SEC_ENTRIES && dwAvgBytesPerSec != aWMAAvgBytesPerSec[dwBytesPerSecIndex]; dwBytesPerSecIndex++);
413 if (dwBytesPerSecIndex < MAX_WMA_AVG_BYTES_PER_SEC_ENTRIES)
415 dwReturn = dwBlockAlignIndex | (dwBytesPerSecIndex << 5);
425 DWORD AdpcmSamplesPerBlock()
const 427 DWORD nBlockAlign = (wBlockAlign + ADPCM_MINIWAVEFORMAT_BLOCKALIGN_CONVERSION_OFFSET) * nChannels;
428 return nBlockAlign * 2 / (DWORD)nChannels - 12;
436 static ADPCMCOEFSET aCoef[7] = { { 256, 0}, {512, -256}, {0,0}, {192,64}, {240,0}, {460, -208}, {392,-232} };
437 memcpy( &fmt->aCoef, aCoef,
sizeof(aCoef) );
440 #endif // __cplusplus 467 DWORD dwFlagsAndDuration;
478 XACTWaveBank::SwapBytes(dwFlagsAndDuration);
480 PlayRegion.SwapBytes();
481 LoopRegion.SwapBytes();
484 #endif // __cplusplus 497 DWORD dwLengthDeviation : 11;
503 XACTWaveBank::SwapBytes(*(LPDWORD)
this);
506 #endif // __cplusplus 520 CHAR szBankName[WAVEBANK_BANKNAME_LENGTH];
521 DWORD dwEntryMetaDataElementSize;
522 DWORD dwEntryNameElementSize;
531 XACTWaveBank::SwapBytes(dwFlags);
532 XACTWaveBank::SwapBytes(dwEntryCount);
533 XACTWaveBank::SwapBytes(dwEntryMetaDataElementSize);
534 XACTWaveBank::SwapBytes(dwEntryNameElementSize);
535 XACTWaveBank::SwapBytes(dwAlignment);
536 CompactFormat.SwapBytes();
537 XACTWaveBank::SwapBytes(BuildTime.dwLowDateTime);
538 XACTWaveBank::SwapBytes(BuildTime.dwHighDateTime);
541 #endif // __cplusplus 551 fmt->NumStreams = (WORD)( (nChannels + 1) / 2 );
555 case 1: fmt->ChannelMask = SPEAKER_MONO;
break;
556 case 2: fmt->ChannelMask = SPEAKER_STEREO;
break;
557 case 3: fmt->ChannelMask = SPEAKER_2POINT1;
break;
558 case 4: fmt->ChannelMask = SPEAKER_QUAD;
break;
559 case 5: fmt->ChannelMask = SPEAKER_4POINT1;
break;
560 case 6: fmt->ChannelMask = SPEAKER_5POINT1;
break;
561 case 7: fmt->ChannelMask = SPEAKER_5POINT1 | SPEAKER_BACK_CENTER;
break;
562 case 8: fmt->ChannelMask = SPEAKER_7POINT1;
break;
563 default: fmt->ChannelMask = 0;
break;
566 fmt->SamplesEncoded = entry->Duration;
567 fmt->BytesPerBlock = 65536;
569 fmt->PlayBegin = entry->PlayRegion.dwOffset;
570 fmt->PlayLength = entry->PlayRegion.dwLength;
572 if (entry->LoopRegion.dwTotalSamples > 0)
574 fmt->LoopBegin = entry->LoopRegion.dwStartSample;
575 fmt->LoopLength = entry->LoopRegion.dwTotalSamples;
576 fmt->LoopCount = 0xff;
585 fmt->EncoderVersion = 4;
587 fmt->BlockCount = blockCount;
591 #pragma bitfield_order(pop) 597 #endif // __XACTWB_H__ Definition: xact3wb.h:178
Definition: xact3wb.h:202
Definition: xact3wb.h:516
Definition: audiodefs.h:131
Definition: xact3wb.h:494
Definition: xact3wb.h:450