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
音楽を多重起動するには?
-
ibis
Re:音楽を多重起動するには?
PlaySound関数を使うと簡単ですよ。
ただ、winmm.libをリンクする必要がありますが。
これを使うと、音を再生しながらでも別の処理ができます。
ソースコードは流し読みしただけなのでよくわかりませんが、
もしスレッドを再生の為に作っているのなら、
この関数を使えばマルチスレッドは必要無くなるかと思います。
ただ、winmm.libをリンクする必要がありますが。
これを使うと、音を再生しながらでも別の処理ができます。
ソースコードは流し読みしただけなのでよくわかりませんが、
もしスレッドを再生の為に作っているのなら、
この関数を使えばマルチスレッドは必要無くなるかと思います。
-
バグ
Re:音楽を多重起動するには?
あれ?PlaySound関数は多重起動できないんじゃないですか?
同じファイルを連続して再生すると、再生~停止~再生~停止となるので、エコーがかかったようには聞こえないと思います。
同じファイルを連続して再生すると、再生~停止~再生~停止となるので、エコーがかかったようには聞こえないと思います。
-
parapara
Re:音楽を多重起動するには?
PlaySoundは以前にも試してみて、駄目だったので、自分のやり方が悪かったのかと思い、
もう一度試してみましたが、
バグ様の言う通りでした。PlaySoundは多重起動できませんでした。
あと私の勉強してる本にはPlaySoundは処理が重い&wavファイルのみなのでキャラクターの声などに
限定したほうがいいかもしれないようなことが書かれていました。
間違っても、バックグラウンドミュージックには使わないほうが良さそうなことが書かれていました。
MCIは軽くて、様々な圧縮形式に対応してるので、これを使うのがよいと書かれておりました。
ibis様バグ様アドバイスありがとうございます。
自己解決しました。勉強不足でした。ありがとうございました。
もう一度試してみましたが、
バグ様の言う通りでした。PlaySoundは多重起動できませんでした。
あと私の勉強してる本にはPlaySoundは処理が重い&wavファイルのみなのでキャラクターの声などに
限定したほうがいいかもしれないようなことが書かれていました。
間違っても、バックグラウンドミュージックには使わないほうが良さそうなことが書かれていました。
MCIは軽くて、様々な圧縮形式に対応してるので、これを使うのがよいと書かれておりました。
ibis様バグ様アドバイスありがとうございます。
自己解決しました。勉強不足でした。ありがとうございました。