Created
January 27, 2014 17:02
-
-
Save hirosof/8652602 to your computer and use it in GitHub Desktop.
RIFFファイル読み込みクラス
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
CHSRIFFReader Class | |
- RIFF(Resource Interchange File Format) Reader Class - | |
Copyright (C) 2014 HiroakiSoftware. All rights reserved. | |
*/ | |
#include "CHSRIFFReader.hpp" | |
CHSRIFFReader::CHSRIFFReader(TCHAR *lpszRiffFilePath) { | |
this->hFile = NULL; | |
memset(this->szFilePath, 0, sizeof(this->szFilePath)); | |
if (lpszRiffFilePath) this->Open(lpszRiffFilePath); | |
} | |
CHSRIFFReader::~CHSRIFFReader() { | |
this->Close(); | |
} | |
bool CHSRIFFReader::OpenedCallBack(void) { | |
return true; | |
} | |
bool CHSRIFFReader::BeforeCloseCallBack(void) { | |
return true; | |
} | |
bool CHSRIFFReader::Open(TCHAR *lpszRiffFilePath) { | |
if (!lpszRiffFilePath) return false; | |
if (this->hFile) return false; | |
HANDLE FileHandle; | |
FileHandle = CreateFile(lpszRiffFilePath , GENERIC_READ , FILE_SHARE_READ , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL); | |
if (FileHandle == INVALID_HANDLE_VALUE) { | |
return false; | |
} | |
THSRIFF_CHUNKHEADER header; | |
DWORD readsize = 0; | |
SetFilePointer(FileHandle , 0 , 0 , FILE_BEGIN); | |
ReadFile(FileHandle , &header , sizeof(header) , &readsize , 0); | |
if (readsize != sizeof(header)) { | |
CloseHandle(FileHandle); | |
return false; | |
} | |
if (_strnicmp(header.Name, "RIFF", 4)) { | |
CloseHandle(FileHandle); | |
return false; | |
} | |
LARGE_INTEGER li; | |
if (GetFileSizeEx(FileHandle, &li) == false) { | |
CloseHandle(FileHandle); | |
return false; | |
} | |
if (li.QuadPart != (header.Size + 8)) { | |
CloseHandle(FileHandle); | |
return false; | |
} | |
SetFilePointer(FileHandle , 0 , 0 , FILE_BEGIN); | |
this->hFile = FileHandle; | |
lstrcpy(this->szFilePath , lpszRiffFilePath); | |
if (this->OpenedCallBack() == false) { | |
this->Close(); | |
return false; | |
} | |
return true; | |
} | |
bool CHSRIFFReader::Close(void) { | |
if (this->hFile == NULL) return false; | |
if (this->BeforeCloseCallBack() == false) return false; | |
CloseHandle(this->hFile); | |
this->hFile = NULL; | |
memset(this->szFilePath, 0, sizeof(this->szFilePath)); | |
return true; | |
} | |
bool CHSRIFFReader::CheckPresent(void) { | |
if (this->hFile) return true; | |
return false; | |
} | |
bool CHSRIFFReader::GetFilePath(TCHAR *lpszRiffFilePath) { | |
if ((this->hFile)&&(lstrlen(this->szFilePath))) { | |
if (lpszRiffFilePath) { | |
lstrcpy(lpszRiffFilePath , this->szFilePath); | |
return true; | |
} | |
return false; | |
} | |
return false; | |
} | |
//ファイルのサイズを取得 | |
UINT32 CHSRIFFReader::GetFileSize(void) { | |
if (this->hFile) { | |
LARGE_INTEGER li; | |
if (GetFileSizeEx(this->hFile, &li) == false) { | |
return 0; | |
} | |
return (UINT32)li.QuadPart; | |
} | |
return 0; | |
} | |
//RIFFチャンクのデータサイズ(ファイルサイズ-8)を取得 | |
UINT32 CHSRIFFReader::GetRiffDataSize(void) { | |
if (this->hFile) { | |
SetFilePointer(this->hFile , 4 , 0 , FILE_BEGIN); | |
UINT32 size; | |
DWORD rs = 0; | |
ReadFile(this->hFile , &size , 4 , &rs , 0); | |
if (rs != 4) return 0; | |
return size; | |
} | |
return 0; | |
} | |
bool CHSRIFFReader::GetIdentifier(char *lpFileType) { | |
if (this->hFile == NULL) return false; | |
char Type[4]; | |
DWORD dwLoad = 0; | |
SetFilePointer(this->hFile , 8 , 0 , FILE_BEGIN); | |
ReadFile(this->hFile , Type , 4 , &dwLoad , 0); | |
if (dwLoad != 4) return false; | |
memcpy(lpFileType , Type , 4); | |
return true; | |
} | |
bool CHSRIFFReader::CheckIdentifier(char *lpFileType) { | |
char FileType[4]; | |
if (this->GetIdentifier(FileType)) { | |
if (_strnicmp(FileType , lpFileType , 4))return false; | |
return true; | |
} | |
return false; | |
} | |
//指定したチャンクの位置を取得する | |
bool CHSRIFFReader::GetChunkPos(char *lpChunkName, UINT32 *lpChunkPos) { | |
LARGE_INTEGER LI; | |
char ChunkText[5]; | |
THSRIFF_CHUNKHEADER ChunkHeader; | |
bool bFound = false; | |
DWORD rs; | |
//引数などに問題あるかを確認 | |
if(!this->hFile | !lpChunkName)return FALSE; | |
if((lstrlenA(lpChunkName)>=5) || (lstrlenA(lpChunkName)==0))return FALSE; | |
//検索対象のチャンク名の準備(lpChunkの文字列のサイズに最大3バイトの空白を追加する。) | |
int iChunkTextNums = lstrlenA(lpChunkName); | |
memset(ChunkText,0,5); | |
memcpy(ChunkText,lpChunkName,iChunkTextNums); | |
if(iChunkTextNums!=4)memset(ChunkText+iChunkTextNums,' ',(4-iChunkTextNums)); | |
//スタート位置 | |
LI.QuadPart = DHSRIFF_FIRSTSUBCHUNKPOS; | |
/* | |
以下に提示したいずれかの条件に該当するまで無限ループでスキャン | |
条件1:見つかる | |
条件2:ファイルの終端にたどり着く | |
条件3:ループ内で使用した関数でエラーが起きた | |
*/ | |
while (1) { | |
//ファイルポインタの移動に失敗した場合はループから外れる | |
if(!SetFilePointerEx(this->hFile,LI,NULL,FILE_BEGIN))break; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はループから外れる | |
if(ReadFile(this->hFile,&ChunkHeader,8,&rs,NULL)==NULL)break; | |
//8バイト読めていなければループから外れる | |
if(rs != 8)break; | |
//指定されたチャンクならばCKFound = TRUE として ループを外れる(成功) | |
if(!_strnicmp(ChunkText,ChunkHeader.Name,4)){ | |
bFound = true; | |
break; | |
} | |
/* | |
次ループでの読み込み位置を次の手順で計算 | |
手順1.チャンクサイズが奇数ならば1加算して偶数にする | |
手順2.手順1の結果 + 8をする。 | |
手順3.LI.QuadPartに手順2の結果を加算 | |
*/ | |
//chunksizeが奇数ならば1加算して偶数にする | |
if (ChunkHeader.Size % 2)ChunkHeader.Size++; | |
//LI.QuadPartに次のチャンクへのオフセットを加算する | |
LI.QuadPart += ChunkHeader.Size + 8; | |
} | |
if (bFound == false) return false; | |
if (lpChunkPos) *lpChunkPos = (UINT32)LI.QuadPart; | |
return true; | |
} | |
//指定したチャンクのサイズを取得する | |
bool CHSRIFFReader::GetChunkSize(char *lpChunkName, UINT32 *lpChunkSize) { | |
UINT32 ChunkPos; | |
if (!lpChunkSize)return false; | |
if (this->GetChunkPos(lpChunkName, &ChunkPos)) { | |
LARGE_INTEGER li; | |
DWORD rs; | |
THSRIFF_CHUNKHEADER ChunkHeader; | |
li.QuadPart = ChunkPos; | |
//ファイルポインタの移動に失敗した場合はfalseを返す | |
if(!SetFilePointerEx(this->hFile,li,NULL,FILE_BEGIN))return false; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はfalseを返す | |
if(ReadFile(this->hFile,&ChunkHeader,8,&rs,NULL)==NULL)return false; | |
*lpChunkSize = ChunkHeader.Size; | |
return true; | |
} | |
return false; | |
} | |
//指定したチャンクのデータを取得する | |
UINT32 CHSRIFFReader::GetChunkData(char *lpChunkName, void *lpValueData, UINT32 ValueDataSize) { | |
UINT32 ChunkPos; | |
UINT32 ChunkSize; | |
UINT32 LoadSize; | |
DWORD readSize; | |
if (!lpValueData)return 0; | |
if (this->GetChunkPos(lpChunkName, &ChunkPos)) { | |
if (this->GetChunkSize(lpChunkName, &ChunkSize)) { | |
LoadSize = (ChunkSize < ValueDataSize) ? ChunkSize : ValueDataSize; | |
LARGE_INTEGER li; | |
li.QuadPart = ChunkPos + 8; | |
//ファイルポインタの移動に失敗した場合はfalseを返す | |
if(!SetFilePointerEx(this->hFile,li,NULL,FILE_BEGIN))return 0; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はfalseを返す | |
if(ReadFile(this->hFile,lpValueData,LoadSize,&readSize,NULL)==NULL)return 0; | |
return readSize; | |
} | |
} | |
return 0; | |
} | |
//チャンクを列挙する | |
bool CHSRIFFReader::EnumChunk(LPFHSRIFFENUMPROC pProc) { | |
if (!pProc) return false; | |
LARGE_INTEGER LI; | |
LI.QuadPart = DHSRIFF_FIRSTSUBCHUNKPOS; | |
THSRIFF_CHUNKHEADER ChunkHeader; | |
bool bFound = false; | |
DWORD rs; | |
char ChunkType[5] = { 0 }; | |
THSRIFF_ENUMCHUNKINFO info; | |
/* | |
以下に提示したいずれかの条件に該当するまで無限ループでスキャン | |
条件1:ファイルの終端にたどり着く | |
条件2:ループ内で使用した関数でエラーが起きた | |
*/ | |
while (1) { | |
memset(&info, 0, sizeof(THSRIFF_ENUMCHUNKINFO)); | |
//ファイルポインタの移動に失敗した場合はループから外れる | |
if(!SetFilePointerEx(this->hFile,LI,NULL,FILE_BEGIN))break; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はループから外れる | |
if(ReadFile(this->hFile,&ChunkHeader,8,&rs,NULL)==NULL)break; | |
//8バイト読めていなければループから外れる | |
if(rs != 8)break; | |
//LISTチャンクならそのタイプを取得 | |
if (!_strnicmp("LIST", ChunkHeader.Name, 4)) { | |
//4バイトの読み込みに成功した場合のみコールバック関数に渡す構造体にコピー | |
if (ReadFile(this->hFile, ChunkType, 4, &rs, NULL)) { | |
if (rs == 4) { | |
lstrcpyA(info.Type , ChunkType); | |
} | |
} | |
} | |
info.Position = (UINT32)LI.QuadPart; | |
info.Size = ChunkHeader.Size; | |
memcpy(info.Name , ChunkHeader.Name , 4); | |
//コールバック関数を呼んで、falseが返ってきたら列挙を終了する | |
if (pProc(this , &info) == false) break; | |
/* | |
次ループでの読み込み位置を次の手順で計算 | |
手順1.チャンクサイズが奇数ならば1加算して偶数にする | |
手順2.手順1の結果 + 8をする。 | |
手順3.LI.QuadPartに手順2の結果を加算 | |
*/ | |
//chunksizeが奇数ならば1加算して偶数にする | |
if (ChunkHeader.Size % 2)ChunkHeader.Size++; | |
//LI.QuadPartに次のチャンクへのオフセットを加算する | |
LI.QuadPart += ChunkHeader.Size + 8; | |
} | |
return true; | |
} | |
//指定したLISTチャンクの位置を取得 | |
bool CHSRIFFReader::GetListChunkPos(char *lpType, UINT32 *lpChunkPos) { | |
LARGE_INTEGER LI; | |
char TypeText[5]; | |
THSRIFF_LISTCHUNKHEADER ListChunkHeader; | |
bool bFound = false; | |
DWORD rs; | |
//引数などに問題あるかを確認 | |
if(!this->hFile | !lpType)return FALSE; | |
if((lstrlenA(lpType)>=5) || (lstrlenA(lpType)==0))return FALSE; | |
//検索対象のチャンク名の準備(lpChunkの文字列のサイズに最大3バイトの空白を追加する。) | |
int iTypeTextNums = lstrlenA(lpType); | |
memset(TypeText,0,5); | |
memcpy(TypeText,lpType,iTypeTextNums); | |
if(iTypeTextNums!=4)memset(TypeText+iTypeTextNums,' ',(4-iTypeTextNums)); | |
//スタート位置 | |
LI.QuadPart = DHSRIFF_FIRSTSUBCHUNKPOS; | |
/* | |
以下に提示したいずれかの条件に該当するまで無限ループでスキャン | |
条件1:見つかる | |
条件2:ファイルの終端にたどり着く | |
条件3:ループ内で使用した関数でエラーが起きた | |
*/ | |
while (1) { | |
//ファイルポインタの移動に失敗した場合はループから外れる | |
if(!SetFilePointerEx(this->hFile,LI,NULL,FILE_BEGIN))break; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はループから外れる | |
if(ReadFile(this->hFile,&ListChunkHeader,sizeof(THSRIFF_LISTCHUNKHEADER),&rs,NULL)==NULL)break; | |
//8バイト読めていなければループから外れる | |
if(rs != sizeof(THSRIFF_LISTCHUNKHEADER))break; | |
//指定されたチャンクならばCKFound = TRUE として ループを外れる(成功) | |
if(!_strnicmp("LIST",ListChunkHeader.ChunkHeader.Name,4)){ | |
if (!_strnicmp(TypeText, ListChunkHeader.Type, 4)) { | |
bFound = true; | |
break; | |
} | |
} | |
/* | |
次ループでの読み込み位置を次の手順で計算 | |
手順1.チャンクサイズが奇数ならば1加算して偶数にする | |
手順2.手順1の結果 + 8をする。 | |
手順3.LI.QuadPartに手順2の結果を加算 | |
*/ | |
//chunksizeが奇数ならば1加算して偶数にする | |
if (ListChunkHeader.ChunkHeader.Size % 2)ListChunkHeader.ChunkHeader.Size++; | |
//LI.QuadPartに次のチャンクへのオフセットを加算する | |
LI.QuadPart += ListChunkHeader.ChunkHeader.Size + 8; | |
} | |
if (bFound == false) return false; | |
if (lpChunkPos) *lpChunkPos = (UINT32)LI.QuadPart; | |
return true; | |
} | |
//指定したLISTチャンクのサイズを取得 | |
bool CHSRIFFReader::GetListChunkSize(char *lpType, UINT32 *lpChunkSize) { | |
UINT32 ChunkPos; | |
if (!lpChunkSize)return false; | |
if (this->GetListChunkPos(lpType, &ChunkPos)) { | |
LARGE_INTEGER li; | |
DWORD rs; | |
THSRIFF_CHUNKHEADER ChunkHeader; | |
li.QuadPart = ChunkPos; | |
//ファイルポインタの移動に失敗した場合はfalseを返す | |
if(!SetFilePointerEx(this->hFile,li,NULL,FILE_BEGIN))return false; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はfalseを返す | |
if(ReadFile(this->hFile,&ChunkHeader,8,&rs,NULL)==NULL)return false; | |
*lpChunkSize = ChunkHeader.Size; | |
return true; | |
} | |
return false; | |
} | |
//指定したLISTチャンクにある指定したサブチャンクの位置を取得 | |
bool CHSRIFFReader::GetListSubChunkPos(char *lpType, char *lpChunkName, UINT32 *lpChunkPos) { | |
LARGE_INTEGER LI; | |
char ChunkText[5]; | |
THSRIFF_CHUNKHEADER ChunkHeader; | |
bool bFound = false; | |
DWORD rs; | |
//引数などに問題あるかを確認 | |
if(!this->hFile | !lpChunkName)return FALSE; | |
if((lstrlenA(lpChunkName)>=5) || (lstrlenA(lpChunkName)==0))return FALSE; | |
//検索対象のチャンク名の準備(lpChunkの文字列のサイズに最大3バイトの空白を追加する。) | |
int iChunkTextNums = lstrlenA(lpChunkName); | |
memset(ChunkText,0,5); | |
memcpy(ChunkText,lpChunkName,iChunkTextNums); | |
if(iChunkTextNums!=4)memset(ChunkText+iChunkTextNums,' ',(4-iChunkTextNums)); | |
//スタート位置 | |
UINT32 ListPos , ListSize , QuitPos; | |
if(this->GetListChunkPos(lpType ,&ListPos) == false) return false; | |
if(this->GetListChunkSize(lpType ,&ListSize) == false) return false; | |
ListSize -= 4; | |
LI.QuadPart = ListPos + 12; | |
QuitPos = ListPos + 12 + ListSize; | |
/* | |
以下に提示したいずれかの条件に該当するまで無限ループでスキャン | |
条件1:見つかる | |
条件2:ファイルの終端にたどり着く | |
条件3:ループ内で使用した関数でエラーが起きた | |
*/ | |
while (1) { | |
//ファイルポインタの移動に失敗した場合はループから外れる | |
if(!SetFilePointerEx(this->hFile,LI,NULL,FILE_BEGIN))break; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はループから外れる | |
if(ReadFile(this->hFile,&ChunkHeader,8,&rs,NULL)==NULL)break; | |
//8バイト読めていなければループから外れる | |
if(rs != 8)break; | |
//指定されたチャンクならばCKFound = TRUE として ループを外れる(成功) | |
if(!_strnicmp(ChunkText,ChunkHeader.Name,4)){ | |
bFound = true; | |
break; | |
} | |
/* | |
次ループでの読み込み位置を次の手順で計算 | |
手順1.チャンクサイズが奇数ならば1加算して偶数にする | |
手順2.手順1の結果 + 8をする。 | |
手順3.LI.QuadPartに手順2の結果を加算 | |
*/ | |
//chunksizeが奇数ならば1加算して偶数にする | |
if (ChunkHeader.Size % 2)ChunkHeader.Size++; | |
//LI.QuadPartに次のチャンクへのオフセットを加算する | |
LI.QuadPart += ChunkHeader.Size + 8; | |
if (LI.QuadPart >= QuitPos) break; | |
} | |
if (bFound == false) return false; | |
if (lpChunkPos) *lpChunkPos = (UINT32)LI.QuadPart; | |
return true; | |
} | |
//指定したLISTチャンクにあるサブチャンクを列挙する | |
bool CHSRIFFReader::EnumListSubChunk(char *lpType, LPFHSRIFFENUMPROC pProc) { | |
if (!pProc) return false; | |
LARGE_INTEGER LI; | |
//スタート位置 | |
UINT32 ListPos , ListSize , QuitPos; | |
if(this->GetListChunkPos(lpType ,&ListPos) == false) return false; | |
if(this->GetListChunkSize(lpType ,&ListSize) == false) return false; | |
ListSize -= 4; | |
LI.QuadPart = ListPos + 12; | |
QuitPos = ListPos + 12 + ListSize; | |
THSRIFF_CHUNKHEADER ChunkHeader; | |
bool bFound = false; | |
DWORD rs; | |
char ChunkType[5] = { 0 }; | |
THSRIFF_ENUMCHUNKINFO info; | |
/* | |
以下に提示したいずれかの条件に該当するまで無限ループでスキャン | |
条件1:ファイルの終端にたどり着く | |
条件2:ループ内で使用した関数でエラーが起きた | |
*/ | |
while (1) { | |
memset(&info, 0, sizeof(THSRIFF_ENUMCHUNKINFO)); | |
lstrcpyA(info.Type , lpType); | |
//ファイルポインタの移動に失敗した場合はループから外れる | |
if(!SetFilePointerEx(this->hFile,LI,NULL,FILE_BEGIN))break; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はループから外れる | |
if(ReadFile(this->hFile,&ChunkHeader,8,&rs,NULL)==NULL)break; | |
//8バイト読めていなければループから外れる | |
if(rs != 8)break; | |
info.Position = (UINT32)LI.QuadPart; | |
info.Size = ChunkHeader.Size; | |
memcpy(info.Name , ChunkHeader.Name , 4); | |
//コールバック関数を呼んで、falseが返ってきたら列挙を終了する | |
if (pProc(this , &info) == false) break; | |
/* | |
次ループでの読み込み位置を次の手順で計算 | |
手順1.チャンクサイズが奇数ならば1加算して偶数にする | |
手順2.手順1の結果 + 8をする。 | |
手順3.LI.QuadPartに手順2の結果を加算 | |
*/ | |
//chunksizeが奇数ならば1加算して偶数にする | |
if (ChunkHeader.Size % 2)ChunkHeader.Size++; | |
//LI.QuadPartに次のチャンクへのオフセットを加算する | |
LI.QuadPart += ChunkHeader.Size + 8; | |
if (LI.QuadPart >= QuitPos) break; | |
} | |
return true; | |
} | |
//指定したLISTチャンクにある指定したサブチャンクのサイズを取得 | |
bool CHSRIFFReader::GetListSubChunkSize(char *lpType, char *lpChunkName, UINT32 *lpChunkSize) { | |
UINT32 ChunkPos; | |
if (!lpChunkSize)return false; | |
if (this->GetListSubChunkPos(lpType , lpChunkName, &ChunkPos)) { | |
LARGE_INTEGER li; | |
DWORD rs; | |
THSRIFF_CHUNKHEADER ChunkHeader; | |
li.QuadPart = ChunkPos; | |
//ファイルポインタの移動に失敗した場合はfalseを返す | |
if(!SetFilePointerEx(this->hFile,li,NULL,FILE_BEGIN))return false; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はfalseを返す | |
if(ReadFile(this->hFile,&ChunkHeader,8,&rs,NULL)==NULL)return false; | |
*lpChunkSize = ChunkHeader.Size; | |
return true; | |
} | |
return false; | |
} | |
//指定したLISTチャンクにある指定したサブチャンクを取得 | |
UINT32 CHSRIFFReader::GetListSubChunkData(char *lpType, char *lpChunkName, void *lpValueData, UINT32 ValueDataSize) { | |
UINT32 ChunkPos; | |
UINT32 ChunkSize; | |
UINT32 LoadSize; | |
DWORD readSize; | |
if (!lpValueData)return 0; | |
if (this->GetListSubChunkPos(lpType , lpChunkName, &ChunkPos)) { | |
if (this->GetListSubChunkSize(lpType , lpChunkName, &ChunkSize)) { | |
LoadSize = (ChunkSize < ValueDataSize) ? ChunkSize : ValueDataSize; | |
LARGE_INTEGER li; | |
li.QuadPart = ChunkPos + 8; | |
//ファイルポインタの移動に失敗した場合はfalseを返す | |
if(!SetFilePointerEx(this->hFile,li,NULL,FILE_BEGIN))return 0; | |
//8バイト(チャンク名+チャンクサイズ)分の読み込みに失敗した場合はfalseを返す | |
if(ReadFile(this->hFile,lpValueData,LoadSize,&readSize,NULL)==NULL)return 0; | |
return readSize; | |
} | |
} | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
CHSRIFFReader Class | |
- RIFF(Resource Interchange File Format) Reader Class Header - | |
Copyright (C) 2014 HiroakiSoftware. All rights reserved. | |
*/ | |
#pragma once | |
#include <Windows.h> | |
#include <tchar.h> | |
#define DHSRIFF_FIRSTSUBCHUNKPOS 12 | |
struct THSRIFF_CHUNKHEADER { | |
char Name[4]; | |
UINT32 Size; | |
}; | |
struct THSRIFF_LISTCHUNKHEADER { | |
THSRIFF_CHUNKHEADER ChunkHeader; | |
char Type[4]; | |
}; | |
struct THSRIFF_ENUMCHUNKINFO { | |
UINT32 Position; | |
char Name[5]; | |
UINT32 Size; | |
char Type[5]; /*LIST Chunk Only*/ | |
}; | |
class CHSRIFFReader; | |
typedef bool (__stdcall *LPFHSRIFFENUMPROC)(CHSRIFFReader *pReader ,THSRIFF_ENUMCHUNKINFO *lpInfo); | |
class CHSRIFFReader { | |
protected: | |
TCHAR szFilePath[MAX_PATH]; //ファイル名 | |
HANDLE hFile; //ファイルハンドル | |
virtual bool OpenedCallBack(void); | |
virtual bool BeforeCloseCallBack(void); | |
public: | |
CHSRIFFReader(TCHAR *lpszRiffFilePath = nullptr); | |
~CHSRIFFReader(); | |
//RIFFファイルを開く | |
bool Open(TCHAR *lpszRiffFilePath); | |
//RIFFファイルを閉じる | |
bool Close(void); | |
//RIFFファイルが開かれてるかの確認 | |
bool CheckPresent(void); | |
//開かれているファイルのパスを取得する | |
bool GetFilePath(TCHAR *lpszRiffFilePath); | |
//ファイルのサイズを取得 | |
UINT32 GetFileSize(void); | |
//RIFFチャンクのデータサイズ(ファイルサイズ-8)を取得 | |
UINT32 GetRiffDataSize(void); | |
//RIFFファイルの識別子を照会する | |
bool CheckIdentifier(char *lpFileType); | |
//RIFFファイルの識別子を取得する | |
bool GetIdentifier(char *lpFileType); | |
//指定したチャンクの位置を取得する | |
bool GetChunkPos(char *lpChunkName , UINT32 *lpChunkPos); | |
//指定したチャンクのサイズを取得する | |
bool GetChunkSize(char *lpChunkName , UINT32 *lpChunkSize); | |
//指定したチャンクのデータを取得する | |
UINT32 GetChunkData(char *lpChunkName , void *lpValueData , UINT32 ValueDataSize); | |
//チャンクを列挙する | |
bool EnumChunk(LPFHSRIFFENUMPROC pProc); | |
//指定したLISTチャンクの位置を取得 | |
bool GetListChunkPos(char *lpType , UINT32 *lpChunkPos); | |
//指定したLISTチャンクのサイズを取得 | |
bool GetListChunkSize(char *lpType , UINT32 *lpChunkSize); | |
//指定したLISTチャンクにある指定したサブチャンクの位置を取得 | |
bool GetListSubChunkPos(char *lpType , char *lpChunkName , UINT32 *lpChunkPos); | |
//指定したLISTチャンクにあるサブチャンクを列挙する | |
bool EnumListSubChunk(char *lpType , LPFHSRIFFENUMPROC pProc); | |
//指定したLISTチャンクにある指定したサブチャンクのサイズを取得 | |
bool GetListSubChunkSize(char *lpType , char *lpChunkName , UINT32 *lpChunkSize); | |
//指定したLISTチャンクにある指定したサブチャンクを取得 | |
UINT32 GetListSubChunkData(char *lpType , char *lpChunkName , void *lpValueData , UINT32 ValueDataSize); | |
}; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment