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