#include // PCM形式のWAVEデータをリソースから読み込む // ResourceName:リソース名 // lpwfe:データを格納するWAVEFORMATEX構造体 // lpwhdr:データを格納するWAVEHDR構造体 // 戻り値:0(成功) or 0以外(失敗) int waveInRsc(LPCTSTR ResourceName,LPWAVEFORMATEX lpwfe,LPWAVEHDR lpwhdr) { HRSRC hrs=FindResource(NULL,ResourceName,"WAVE"); if(hrs==NULL){ MessageBox(NULL,"指定したリソースは存在しません",ResourceName,MB_OK); return 1; } HGLOBAL hgWave=LoadResource(NULL,hrs); LPBYTE lpWave=(LPBYTE)LockResource(hgWave); char str[4]; strncpy(str,(char*)(lpWave+8),4); if(strncmp(str,"WAVE",4)){ MessageBox(NULL,"WAVEデータを指定して下さい",ResourceName,MB_OK); return 2; } CopyMemory(lpwfe,lpWave+20,16); // フォーマット情報をコピー if(lpwfe->wFormatTag != WAVE_FORMAT_PCM){ MessageBox(NULL,"PCM形式のWAVEデータを指定して下さい",ResourceName,MB_OK); return 3; } strncpy(str,(char*)(lpWave+36),4); int offset; if(!strncmp(str,"data",4)) offset=44; // factチャンクが無い else offset=56; // factチャンクが有る lpwhdr->lpData=(LPSTR)(lpWave+offset); lpwhdr->dwBufferLength=*(LPDWORD)(lpWave+offset-4); lpwhdr->dwFlags=0; lpwhdr->dwLoops=1; return 0; } // WAVEデータを閉じます // hWaveOut:ウェーブフォームオーディオ出力デバイスのハンドル // lpwhdr:クリーンアップするデータブロックを識別するWAVEHDR構造体のアドレス void waveClose(HWAVEOUT hWaveOut,LPWAVEHDR lpwhdr) { waveOutReset(hWaveOut); waveOutUnprepareHeader(hWaveOut,lpwhdr,sizeof(WAVEHDR)); waveOutClose(hWaveOut); }