音楽を多重起動するには?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
parapara

音楽を多重起動するには?

#1

投稿記事 by parapara » 18年前

3Dゲームとかで一片に敵を倒すと、敵の断末魔が重なって聞こえてきますが、
あのように、同じ音を多重起動するにはどうすればいいんでしょうか?
分かり難いかもしれませんが、どうぞよろしくお願いします。
一応考えて見ましたが、どこが悪いのかわかりません。
#define _WIN32_WINNT 0x400
#include<windows.h>
#define PRT_CLASS "Prt_Class"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nCmdShow)
{
	WNDCLASSEX wcex;
	HWND hWnd;
	MSG msg;
	wcex.cbSize=sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
	wcex.lpfnWndProc=(WNDPROC)WndProc;
	wcex.cbClsExtra=0;
	wcex.cbWndExtra=0;
	wcex.hInstance=hInstance;
	wcex.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
	wcex.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wcex.lpszMenuName=NULL;
	wcex.lpszClassName=PRT_CLASS;
	wcex.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
	RegisterClassEx(&wcex);

	hWnd=CreateWindow(PRT_CLASS,
		"親ウィンドウ",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		640,
		480,
		NULL,
		NULL,
		hInstance,
		NULL);
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);
	while(GetMessage(&msg,NULL,0,0)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,
						 UINT message,
						 WPARAM wParam,
						 LPARAM lParam)
{
	static ThreadParam param;
	DWORD dwID;
	static MCI_OPEN_PARMS mop;
	int iErr;
	TCHAR strErr[255];
	switch(message){//音楽
		case WM_CREATE:
			mop.dwCallback=(DWORD)hWnd;
			mop.lpstrDeviceType=(LPCTSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
			mop.lpstrElementName=TEXT("test.wav");
			iErr=mciSendCommand(NULL,MCI_OPEN,
				MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,
				(DWORD)&mop);
			if(iErr){
				mciGetErrorString(iErr,strErr,1024);
				MessageBox(hWnd,strErr,NULL,MB_OK);
				return(-1);
			}
			return(0);
		case WM_LBUTTONDOWN:
			param.mop=mop;
			param.owner=hWnd;
			CreateThread(NULL,0,ThreadFunc,(LPVOID)¶m,0,&dwID);
			//mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
			return(0);
		case WM_RBUTTONDOWN:
			mciSendCommand(mop.wDeviceID,MCI_STOP,0,0);
			mciSendCommand(mop.wDeviceID,MCI_SEEK,
				MCI_SEEK_TO_START,0);
			return(0);
		case WM_DESTROY:
			mciSendCommand(mop.wDeviceID,MCI_CLOSE,0,0);
			PostQuitMessage(0);
			return(0);
		default:
			return DefWindowProc(hWnd,message,wParam,lParam);
	}
}

parapara

Re:音楽を多重起動するには?

#2

投稿記事 by parapara » 18年前

環境は OS:Windows XP pro、処理系:VS.NET2003を使用しています。
どうかよろしくお願いします。

ibis

Re:音楽を多重起動するには?

#3

投稿記事 by ibis » 18年前

PlaySound関数を使うと簡単ですよ。
ただ、winmm.libをリンクする必要がありますが。
これを使うと、音を再生しながらでも別の処理ができます。

ソースコードは流し読みしただけなのでよくわかりませんが、
もしスレッドを再生の為に作っているのなら、
この関数を使えばマルチスレッドは必要無くなるかと思います。

parapara

Re:音楽を多重起動するには?

#4

投稿記事 by parapara » 18年前

ありがとうございます。早速試してみます。

バグ

Re:音楽を多重起動するには?

#5

投稿記事 by バグ » 18年前

あれ?PlaySound関数は多重起動できないんじゃないですか?
同じファイルを連続して再生すると、再生~停止~再生~停止となるので、エコーがかかったようには聞こえないと思います。

parapara

Re:音楽を多重起動するには?

#6

投稿記事 by parapara » 18年前

PlaySoundは以前にも試してみて、駄目だったので、自分のやり方が悪かったのかと思い、
もう一度試してみましたが、
バグ様の言う通りでした。PlaySoundは多重起動できませんでした。
あと私の勉強してる本にはPlaySoundは処理が重い&wavファイルのみなのでキャラクターの声などに
限定したほうがいいかもしれないようなことが書かれていました。
間違っても、バックグラウンドミュージックには使わないほうが良さそうなことが書かれていました。
MCIは軽くて、様々な圧縮形式に対応してるので、これを使うのがよいと書かれておりました。

ibis様バグ様アドバイスありがとうございます。
自己解決しました。勉強不足でした。ありがとうございました。

ibis

Re:音楽を多重起動するには?

#7

投稿記事 by ibis » 18年前

誤情報失礼しました。
同ファイルを多重にってのはできないのですね。

閉鎖

“C言語何でも質問掲示板” へ戻る