【XAudio2】7.如何加载音频数据文件
7.如何加載音頻數據文件
本主題描述的步驟來填充所需的結構在XAudio2播放音頻數據。以下步驟加載“fmt”和“data”塊的一個音頻文件,并使用它們來填充WAVEFORMATEXTENSIBLE結構和一個XAUDIO2_BUFFER結構。
- 準備解析音頻文件。
- 填充XAudio2結構即興重復的內容塊。?
準備解析音頻文件。
支持的音頻文件XAudio2使用資源文件交換格式(RIFF)。Resource Interchange File Format (RIFF)主題描述了RIFF。音頻數據在RIFF文件中是通過遍歷加載可用的RIFF塊。以下代碼展示了查找塊并從塊中加載數據。
-
從RIFF文件查找一個塊(chunk)
請注意
windows是小端,Xbox 360是大端。音頻文件上創建Windows使用Xbox 360需要的部分或全部數據交換字節序在運行時,或音頻文件需要被處理在運行時執行字節交換。有關更多信息,請參見音頻數據和字節順序。
- #ifdef _XBOX //Big-Endian #define fourccRIFF 'RIFF' #define fourccDATA 'data' #define fourccFMT 'fmt ' #define fourccWAVE 'WAVE' #define fourccXWMA 'XWMA' #define fourccDPDS 'dpds' #endif#ifndef _XBOX //Little-Endian #define fourccRIFF 'FFIR' #define fourccDATA 'atad' #define fourccFMT ' tmf' #define fourccWAVE 'EVAW' #define fourccXWMA 'AMWX' #define fourccDPDS 'sdpd' #endif HRESULT FindChunk(HANDLE hFile, DWORD fourcc, DWORD & dwChunkSize, DWORD & dwChunkDataPosition) {HRESULT hr = S_OK;if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, 0, NULL, FILE_BEGIN ) )return HRESULT_FROM_WIN32( GetLastError() );DWORD dwChunkType;DWORD dwChunkDataSize;DWORD dwRIFFDataSize = 0;DWORD dwFileType;DWORD bytesRead = 0;DWORD dwOffset = 0;while (hr == S_OK){DWORD dwRead;if( 0 == ReadFile( hFile, &dwChunkType, sizeof(DWORD), &dwRead, NULL ) )hr = HRESULT_FROM_WIN32( GetLastError() );if( 0 == ReadFile( hFile, &dwChunkDataSize, sizeof(DWORD), &dwRead, NULL ) )hr = HRESULT_FROM_WIN32( GetLastError() );switch (dwChunkType){case fourccRIFF:dwRIFFDataSize = dwChunkDataSize;dwChunkDataSize = 4;if( 0 == ReadFile( hFile, &dwFileType, sizeof(DWORD), &dwRead, NULL ) )hr = HRESULT_FROM_WIN32( GetLastError() );break;default:if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, dwChunkDataSize, NULL, FILE_CURRENT ) )return HRESULT_FROM_WIN32( GetLastError() ); }dwOffset += sizeof(DWORD) * 2;if (dwChunkType == fourcc){dwChunkSize = dwChunkDataSize;dwChunkDataPosition = dwOffset;return S_OK;}dwOffset += dwChunkDataSize;if (bytesRead >= dwRIFFDataSize) return S_FALSE;}return S_OK;}
- 在定位數據塊位置后再讀取。
一旦發現所需的塊,它可以通過調整文件讀取數據指針塊的數據部分的開始。下面的函數是讀取的被找到的數據塊的例子。 - HRESULT ReadChunkData(HANDLE hFile, void * buffer, DWORD buffersize, DWORD bufferoffset) {HRESULT hr = S_OK;if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, bufferoffset, NULL, FILE_BEGIN ) )return HRESULT_FROM_WIN32( GetLastError() );DWORD dwRead;if( 0 == ReadFile( hFile, buffer, buffersize, &dwRead, NULL ) )hr = HRESULT_FROM_WIN32( GetLastError() );return hr; }
填充XAudio2的結構體通過RIFF塊。
為了讓XAudio2播放音頻源的聲音,它需要一個WAVEFORMATEX結構和一個XAUDIO2_BUFFER結構。WAVEFORMATEX結構可能是一個更大的結構如WAVEFORMATEXTENSIBLE包含WAVEFORMATEX結構作為它的第一個成員。有關更多信息,請參見WAVEFORMATEX主題頁面。
在這個例子一個WAVEFORMATEXTENSIBLE被用于允許加載PCM音頻文件,并且超過兩個通道。
以下步驟說明使用上述功能填充WAVEFORMATEXTENSIBLE結構和一個XAUDIO2_BUFFER結構。在這種情況下,音頻文件被加載包含PCM數據,并將只包含一個“RIFF”,“fmt”和“data”的塊。其他格式可能包含額外的塊類型在Resource Interchange File Format (RIFF)。
1.定義?WAVEFORMATEXTENSIBLE 和 XAUDIO2_BUFFER結構體。
?
2.用CreateFile打開音頻文件
3.在音頻文件中定位"RIFF"塊,和檢查文件類型
4.定位"fmt" 塊,然后復制內容到WAVEFORMATEXTENSIBLE結構體
5.定位"data"塊,然后讀取內容到一個緩存
6.填充一個XAUDIO2_BUFFER 結構體
總結
以上是生活随笔為你收集整理的【XAudio2】7.如何加载音频数据文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【XAduio2】6.如何枚举音频设备
- 下一篇: 【XAudio2】8.怎么播放音效