日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【XAudio2】7.如何加载音频数据文件

發布時間:2024/9/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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結構體。

?

  • WAVEFORMATEXTENSIBLE wfx = {0}; XAUDIO2_BUFFER buffer = {0};
  • 2.用CreateFile打開音頻文件

  • #ifdef _XBOX char * strFileName = "game:\\media\\MusicMono.wav"; #else TCHAR * strFileName = _TEXT("media\\MusicMono.wav"); #endif // Open the file HANDLE hFile = CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL );if( INVALID_HANDLE_VALUE == hFile )return HRESULT_FROM_WIN32( GetLastError() );if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, 0, NULL, FILE_BEGIN ) )return HRESULT_FROM_WIN32( GetLastError() );
  • 3.在音頻文件中定位"RIFF"塊,和檢查文件類型

  • DWORD dwChunkSize; DWORD dwChunkPosition; //check the file type, should be fourccWAVE or 'XWMA' FindChunk(hFile,fourccRIFF,dwChunkSize, dwChunkPosition ); DWORD filetype; ReadChunkData(hFile,&filetype,sizeof(DWORD),dwChunkPosition); if (filetype != fourccWAVE)return S_FALSE;
  • 4.定位"fmt" 塊,然后復制內容到WAVEFORMATEXTENSIBLE結構體

  • FindChunk(hFile,fourccFMT, dwChunkSize, dwChunkPosition ); ReadChunkData(hFile, &wfx, dwChunkSize, dwChunkPosition );
  • 5.定位"data"塊,然后讀取內容到一個緩存

  • //fill out the audio data buffer with the contents of the fourccDATA chunk FindChunk(hFile,fourccDATA,dwChunkSize, dwChunkPosition ); BYTE * pDataBuffer = new BYTE[dwChunkSize]; ReadChunkData(hFile, pDataBuffer, dwChunkSize, dwChunkPosition);
  • 6.填充一個XAUDIO2_BUFFER 結構體

  • buffer.AudioBytes = dwChunkSize; //buffer containing audio data buffer.pAudioData = pDataBuffer; //size of the audio buffer in bytes buffer.Flags = XAUDIO2_END_OF_STREAM; // tell the source voice not to expect any data after this buffer
  • 總結

    以上是生活随笔為你收集整理的【XAudio2】7.如何加载音频数据文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。