ぼく用あれこれまとめ
XAudio2でのオーディオファイル解析
最終更新:
bokuyo
-
view
XAudio2でのオーディオファイル解析
オーディオファイルの解析
Xbox360とWindowsで使えるよう指定
#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
- (Windowsはリトルエンディアン方式で、Xbox360はビッグエンディアン方式)
- MSDN - オーディオ データとエンディアン
- ogg対応の場合は注意。oggのov_read();メソッドでリトルエンディアンorアビッグエンディアンを決めてるから。
オーディオファイルを解析する関数
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; }