//============================================================================= // 初期化 //============================================================================= bool Sound::Initialize(HWND hWnd) { HRESULT hr; //---------------------------- // COMライブラリの初期化 //---------------------------- CoInitializeEx(nullptr, COINIT_MULTITHREADED); //---------------------------- // XAudio2オブジェクトの作成 //---------------------------- hr = XAudio2Create(&m_xAudio2, 0); if(FAILED(hr)) { MessageBox(hWnd, "XAudio2オブジェクトの作成に失敗!", "警告!", MB_ICONWARNING); // COMライブラリの終了処理 CoUninitialize(); return false; } //---------------------------- // マスターボイスの生成 //---------------------------- hr = m_xAudio2->CreateMasteringVoice(&m_masteringVoice); if(FAILED(hr)) { MessageBox(hWnd, "マスターボイスの生成に失敗!", "警告!", MB_ICONWARNING); // XAudio2オブジェクトの開放 SafeRelease(m_xAudio2); // COMライブラリの終了処理 CoUninitialize(); return false; } //---------------------------- // サウンドデータの初期化 //---------------------------- DWORD dwChunkSize = 0; DWORD dwChunkPosition = 0; DWORD dwFiletype = 0; WAVEFORMATEXTENSIBLE wfx; XAUDIO2_BUFFER buffer; HANDLE file; char str[512]; for(int cnt = 0; cnt < SOUND_MAX; ++cnt) { dwChunkSize = 0; dwChunkPosition = 0; dwFiletype = 0; //---------------------------- // バッファのクリア //---------------------------- memset(&wfx, 0, sizeof(WAVEFORMATEXTENSIBLE)); memset(&buffer, 0, sizeof(XAUDIO2_BUFFER)); //---------------------------- // パス連結 //---------------------------- memset(str, 0, sizeof(str)); strcpy_s(str, _sound_path); strcat_s(str, sizeof(str), _sound_data[cnt].fileName); //---------------------------- // サウンドデータファイルの生成 //---------------------------- file = CreateFile(str, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr); if(file == INVALID_HANDLE_VALUE) { MessageBox(hWnd, "サウンドデータファイルの生成に失敗!(1)", "警告!", MB_ICONWARNING); //return HRESULT_FROM_WIN32(GetLastError()); return false; } if(SetFilePointer(file, 0, nullptr, FILE_BEGIN) == INVALID_SET_FILE_POINTER) {// ファイルポインタを先頭に移動 MessageBox(hWnd, "サウンドデータファイルの生成に失敗!(2)", "警告!", MB_ICONWARNING); //return HRESULT_FROM_WIN32(GetLastError()); return false; } //---------------------------- // WAVEファイルのチェック //---------------------------- hr = CheckChunk(file, 'FFIR', &dwChunkSize, &dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "WAVEファイルのチェックに失敗!(1)", "警告!", MB_ICONWARNING); return false; } hr = ReadChunkData(file, &dwFiletype, sizeof(DWORD), dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "WAVEファイルのチェックに失敗!(2)", "警告!", MB_ICONWARNING); return false; } if(dwFiletype != 'EVAW') { MessageBox(hWnd, "WAVEファイルのチェックに失敗!(3)", "警告!", MB_ICONWARNING); return false; } //---------------------------- // フォーマットチェック //---------------------------- hr = CheckChunk(file, ' tmf', &dwChunkSize, &dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "フォーマットチェックに失敗!(1)", "警告!", MB_ICONWARNING); return false; } hr = ReadChunkData(file, &wfx, dwChunkSize, dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "フォーマットチェックに失敗!(2)", "警告!", MB_ICONWARNING); return false; } //---------------------------- // オーディオデータ読み込み //---------------------------- hr = CheckChunk(file, 'atad', &m_sizeAudio[cnt], &dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "オーディオデータ読み込みに失敗!(1)", "警告!", MB_ICONWARNING); return false; } m_dataAudio[cnt] = (BYTE*)malloc(m_sizeAudio[cnt]); hr = ReadChunkData(file, m_dataAudio[cnt], m_sizeAudio[cnt], dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "オーディオデータ読み込みに失敗!(2)", "警告!", MB_ICONWARNING); return false; } //---------------------------- // ソースボイスの生成 //---------------------------- hr = m_xAudio2->CreateSourceVoice(&m_sourceVoice[cnt], &(wfx.Format)); if(FAILED(hr)) { MessageBox(hWnd, "ソースボイスの生成に失敗!", "警告!", MB_ICONWARNING); return false; } memset(&buffer, 0, sizeof(XAUDIO2_BUFFER)); buffer.AudioBytes = m_sizeAudio[cnt]; buffer.pAudioData = m_dataAudio[cnt]; buffer.Flags = XAUDIO2_END_OF_STREAM; buffer.LoopCount = 0; //---------------------------- // オーディオバッファの登録 //---------------------------- m_sourceVoice[cnt]->SubmitSourceBuffer(&buffer); } return true; }
//============================================================================= // 初期化 //============================================================================= HRESULT InitSound(HWND hWnd) { HRESULT hr; // COMライブラリの初期化 CoInitializeEx(NULL, COINIT_MULTITHREADED); // XAudio2オブジェクトの作成 hr = XAudio2Create(&g_pXAudio2, 0); if(FAILED(hr)) { MessageBox(hWnd, "XAudio2オブジェクトの作成に失敗!", "警告!", MB_ICONWARNING); // COMライブラリの終了処理 CoUninitialize(); return E_FAIL; } // マスターボイスの生成 hr = g_pXAudio2->CreateMasteringVoice(&g_pMasteringVoice); if(FAILED(hr)) { MessageBox(hWnd, "マスターボイスの生成に失敗!", "警告!", MB_ICONWARNING); if(g_pXAudio2) { // XAudio2オブジェクトの開放 g_pXAudio2->Release(); g_pXAudio2 = NULL; } // COMライブラリの終了処理 CoUninitialize(); return E_FAIL; } // サウンドデータの初期化 for(int nCntSound = 0; nCntSound < SOUND_LABEL_MAX; nCntSound++) { HANDLE hFile; DWORD dwChunkSize = 0; DWORD dwChunkPosition = 0; DWORD dwFiletype; WAVEFORMATEXTENSIBLE wfx; XAUDIO2_BUFFER buffer; // バッファのクリア memset(&wfx, 0, sizeof(WAVEFORMATEXTENSIBLE)); memset(&buffer, 0, sizeof(XAUDIO2_BUFFER)); // サウンドデータファイルの生成 hFile = CreateFile(g_aParam[nCntSound].pFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(hFile == INVALID_HANDLE_VALUE) { MessageBox(hWnd, "サウンドデータファイルの生成に失敗!(1)", "警告!", MB_ICONWARNING); return HRESULT_FROM_WIN32(GetLastError()); } if(SetFilePointer(hFile, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) {// ファイルポインタを先頭に移動 MessageBox(hWnd, "サウンドデータファイルの生成に失敗!(2)", "警告!", MB_ICONWARNING); return HRESULT_FROM_WIN32(GetLastError()); } // WAVEファイルのチェック hr = CheckChunk(hFile, 'FFIR', &dwChunkSize, &dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "WAVEファイルのチェックに失敗!(1)", "警告!", MB_ICONWARNING); return S_FALSE; } hr = ReadChunkData(hFile, &dwFiletype, sizeof(DWORD), dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "WAVEファイルのチェックに失敗!(2)", "警告!", MB_ICONWARNING); return S_FALSE; } if(dwFiletype != 'EVAW') { MessageBox(hWnd, "WAVEファイルのチェックに失敗!(3)", "警告!", MB_ICONWARNING); return S_FALSE; } // フォーマットチェック hr = CheckChunk(hFile, ' tmf', &dwChunkSize, &dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "フォーマットチェックに失敗!(1)", "警告!", MB_ICONWARNING); return S_FALSE; } hr = ReadChunkData(hFile, &wfx, dwChunkSize, dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "フォーマットチェックに失敗!(2)", "警告!", MB_ICONWARNING); return S_FALSE; } // オーディオデータ読み込み hr = CheckChunk(hFile, 'atad', &g_aSizeAudio[nCntSound], &dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "オーディオデータ読み込みに失敗!(1)", "警告!", MB_ICONWARNING); return S_FALSE; } g_apDataAudio[nCntSound] = (BYTE*)malloc(g_aSizeAudio[nCntSound]); hr = ReadChunkData(hFile, g_apDataAudio[nCntSound], g_aSizeAudio[nCntSound], dwChunkPosition); if(FAILED(hr)) { MessageBox(hWnd, "オーディオデータ読み込みに失敗!(2)", "警告!", MB_ICONWARNING); return S_FALSE; } // ソースボイスの生成 hr = g_pXAudio2->CreateSourceVoice(&g_apSourceVoice[nCntSound], &(wfx.Format)); if(FAILED(hr)) { MessageBox(hWnd, "ソースボイスの生成に失敗!", "警告!", MB_ICONWARNING); return S_FALSE; } // バッファの値設定 memset(&buffer, 0, sizeof(XAUDIO2_BUFFER)); buffer.AudioBytes = g_aSizeAudio[nCntSound]; buffer.pAudioData = g_apDataAudio[nCntSound]; buffer.Flags = XAUDIO2_END_OF_STREAM; buffer.LoopCount = 0; // オーディオバッファの登録 g_apSourceVoice[nCntSound]->SubmitSourceBuffer(&buffer); } return S_OK; }
//============================================================================= // 初期化 //============================================================================= HRESULT Sound::Init(void) { HWND hWnd = Window::Instance()->hWnd(); HRESULT hr; // COMライブラリの初期化 CoInitializeEx(NULL,COINIT_MULTITHREADED); // XAudio2オブジェクトの作成 hr = XAudio2Create(&XAudio2Device,0); if (FAILED(hr)) { MessageBox(hWnd,"XAudio2オブジェクトの作成に失敗!","警告!",MB_ICONWARNING); // COMライブラリの終了処理 CoUninitialize(); return E_FAIL; } // マスターボイスの生成 hr = XAudio2Device->CreateMasteringVoice(&MasteringVoice); if (FAILED(hr)) { MessageBox(hWnd,"マスターボイスの生成に失敗!","警告!",MB_ICONWARNING); if (XAudio2Device) { // XAudio2オブジェクトの開放 XAudio2Device->Release(); XAudio2Device = NULL; } // COMライブラリの終了処理 CoUninitialize(); return E_FAIL; } // サウンドデータの初期化 for (int cnt = 1; cnt < MAX_SOUND; cnt++) { HANDLE file; DWORD chunkSize = 0; DWORD chunkPosition = 0; DWORD fileType; WAVEFORMATEXTENSIBLE format; XAUDIO2_BUFFER buffer; // バッファのクリア memset(&format,0,sizeof(WAVEFORMATEXTENSIBLE)); memset(&buffer,0,sizeof(XAUDIO2_BUFFER)); // サウンドデータファイルの生成 file = CreateFile(Param[cnt].FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); if (file == INVALID_HANDLE_VALUE) { SourceVoice[cnt] = nullptr; continue; //MessageBox(hWnd,"サウンドデータファイルの生成に失敗!(1)","警告!",MB_ICONWARNING); //return HRESULT_FROM_WIN32(GetLastError()); } if (SetFilePointer(file,0,NULL,FILE_BEGIN) == INVALID_SET_FILE_POINTER) {// ファイルポインタを先頭に移動 MessageBox(hWnd,"サウンドデータファイルの生成に失敗!(2)","警告!",MB_ICONWARNING); return HRESULT_FROM_WIN32(GetLastError()); } // WAVEファイルのチェック hr = CheckChunk(file,'FFIR',&chunkSize,&chunkPosition); if (FAILED(hr)) { MessageBox(hWnd,"WAVEファイルのチェックに失敗!(1)","警告!",MB_ICONWARNING); return S_FALSE; } hr = ReadChunkData(file,&fileType,sizeof(DWORD),chunkPosition); if (FAILED(hr)) { MessageBox(hWnd,"WAVEファイルのチェックに失敗!(2)","警告!",MB_ICONWARNING); return S_FALSE; } if (fileType != 'EVAW') { MessageBox(hWnd,"WAVEファイルのチェックに失敗!(3)","警告!",MB_ICONWARNING); return S_FALSE; } // フォーマットチェック hr = CheckChunk(file,' tmf',&chunkSize,&chunkPosition); if (FAILED(hr)) { MessageBox(hWnd,"フォーマットチェックに失敗!(1)","警告!",MB_ICONWARNING); return S_FALSE; } hr = ReadChunkData(file,&format,chunkSize,chunkPosition); if (FAILED(hr)) { MessageBox(hWnd,"フォーマットチェックに失敗!(2)","警告!",MB_ICONWARNING); return S_FALSE; } // オーディオデータ読み込み hr = CheckChunk(file,'atad',&AudioSize[cnt],&chunkPosition); if (FAILED(hr)) { MessageBox(hWnd,"オーディオデータ読み込みに失敗!(1)","警告!",MB_ICONWARNING); return S_FALSE; } AudioData[cnt] = (BYTE*)malloc(AudioSize[cnt]); hr = ReadChunkData(file,AudioData[cnt],AudioSize[cnt],chunkPosition); if (FAILED(hr)) { MessageBox(hWnd,"オーディオデータ読み込みに失敗!(2)","警告!",MB_ICONWARNING); return S_FALSE; } // ソースボイスの生成 hr = XAudio2Device->CreateSourceVoice(&SourceVoice[cnt],&(format.Format)); if (FAILED(hr)) { MessageBox(hWnd,"ソースボイスの生成に失敗!","警告!",MB_ICONWARNING); return S_FALSE; } memset(&buffer,0,sizeof(XAUDIO2_BUFFER)); buffer.AudioBytes = AudioSize[cnt]; buffer.pAudioData = AudioData[cnt]; buffer.Flags = XAUDIO2_END_OF_STREAM; buffer.LoopCount = 0; // オーディオバッファの登録 SourceVoice[cnt]->SubmitSourceBuffer(&buffer); //ステータスの初期化 Volume[cnt] = 0; ChangeVolume[cnt] = 0; FadeFlag[cnt] = false; } return S_OK; }