Пример #1
0
//=============================================================================
// 初期化
//=============================================================================
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;
}
Пример #2
0
//=============================================================================
// 初期化
//=============================================================================
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;
}
Пример #3
0
//=============================================================================
// 初期化
//=============================================================================
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;
}