ぼく用あれこれまとめ
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;
}