#include // PCM形式のWAVEファイルを読み込む // char *lpFileName:ファイルの名前を指すポインタ // WAVEFORMATEX *lpwfe:データを格納するWAVEFORMATEX構造体を指すポインタ // WAVEHDR *lpwhdr:データを格納するWAVEHDR構造体を指すポインタ // 戻り値:0(成功) or 負値(失敗) int LoadWaveFile(char *lpFileName,WAVEFORMATEX *lpwfe,WAVEHDR *lpwhdr) { HANDLE fh=CreateFile(lpFileName,GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(fh==INVALID_HANDLE_VALUE){ MessageBox(NULL,"ファイルを開けません",lpFileName,MB_OK); return -1; } DWORD dwFileSize=GetFileSize(fh,NULL); BYTE *lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwFileSize); DWORD dwReadSize; ReadFile(fh,lpBuf,dwFileSize,&dwReadSize,NULL); CloseHandle(fh); char str[4]; strncpy(str,(char*)(lpBuf+8),4); if(strncmp(str,"WAVE",4)){ HeapFree(GetProcessHeap(),0,lpBuf); MessageBox(NULL,"WAVEファイルを指定して下さい",lpFileName,MB_OK); return -2; } CopyMemory(lpwfe,lpBuf+20,16); // フォーマット情報をコピー if(lpwfe->wFormatTag != WAVE_FORMAT_PCM){ HeapFree(GetProcessHeap(),0,lpBuf); MessageBox(NULL,"PCM形式のWAVEファイルを指定して下さい",lpFileName,MB_OK); return -3; } strncpy(str,(char*)(lpBuf+36),4); int offset; if(!strncmp(str,"fact",4)) offset=56; // factチャンクが有る else if(!strncmp(str,"data",4)) offset=44; // dataチャンク(factチャンクが無い) else{ HeapFree(GetProcessHeap(),0,lpBuf); MessageBox(NULL,"正体不明のファイルです",lpFileName,MB_OK); return -4; } // 波形データをコピー DWORD size=*(DWORD*)(lpBuf+offset-4); BYTE *lpWave=(BYTE*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size); CopyMemory(lpWave,lpBuf+offset,size); HeapFree(GetProcessHeap(),0,lpBuf); lpwhdr->lpData=(LPSTR)lpWave; lpwhdr->dwBufferLength=size; lpwhdr->dwFlags=WHDR_BEGINLOOP | WHDR_ENDLOOP; lpwhdr->dwLoops=1; return 0; } // WAVEファイルの終了処理 // HWAVEOUT hWaveOut:ウェーブフォームオーディオ出力デバイスのハンドル // WAVEHDR *lpwhdr:クリーンアップするデータブロックを識別するWAVEHDR構造体を指すポインタ void CloseWaveFile(HWAVEOUT hWaveOut,WAVEHDR *lpwhdr) { waveOutReset(hWaveOut); waveOutUnprepareHeader(hWaveOut,lpwhdr,sizeof(WAVEHDR)); waveOutClose(hWaveOut); if(lpwhdr->lpData){ HeapFree(GetProcessHeap(),0,lpwhdr->lpData); lpwhdr->lpData=NULL; }; }