ぼく用あれこれまとめ

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;
}



参考文献

記事メニュー
目安箱バナー