以下のようなコード
DWORD WINAPI Sound1(LPVOID)
{
PlaySound(Sound1.wav,NULL,SND_ASYNC);
Sleep(100);
}
DWORD WINAPI Sound2(LPVOID)
{
PlaySound(Sound2.wav,NULL,SND_ASYNC);
Sleep(100);
}
void Button1Click()//プッシュボタンを押すと走る関数
{
for(int i = 0; i < 100; i++)
{
CreateThread(NULL,0,Sound1,NULL,0,NULL);
CreateThread(NULL,0,Sound2,NULL,0,NULL);
Sleep(100);
}
}
としてみたのですが、Sound2しか鳴っていないように聞こえます。
ちなみにSound1.wav Sound2.wavは効果音です。
何か問題があるのでしょうか?ご教授下さい。
PlaySoundって同時再生できるとは説明にないね。
それに昔は同時再生できるサウンドカードなどはなかったし。
DirectSoundだか何か俺はしらんが別の方法ならできるらしい。
御意。同時に鳴らしたいならDirectX使ってください。
あ、waveOut系APIとかMCIでもいけた気がします…(自信なし
解決策を模索する中で、偶然発見した方法なんですが、
Sound1.exe,Sound2.exeをつくる。
Sound1.exe,Sound2.exeのプロシージャの中で
case WM_APP:
PlaySound(Sound1.wav,NULL,SND_ASYNC);//Sound2.exeではSound2.wav
break;
と記述して、
呼び出す側で
for(int i = 0; i < 100; i++)
{
SendMessage(hWndSound1,WM_APP,0,0);//hWndSound1はSound1.exeのWindowHandle
SendMessage(hWndSound2,WM_APP,0,0);//hWndSound2はSound2.exeのWindowHandle
Sleep(100);
}
とすると両方の音が聞こえてきます。
*.exeを作れば上手くいき、スレッドではダメ。という理由は何なのでしょうか?
どなたかご教授下さい。
推測だけど
PlaySoundが内部でどっちのスレッドから自分が呼ばれているかなんて
気にしていないんじゃないの。
そんなの面倒なだけだし。
複数同時に再生できることを考えて作られたAPIなら
識別子(ハンドルとかディスクリプタなど)を使えるようにして
鳴らした音を別のスレッドで止めたりできるように考えているはず。
EXEだと同時になるのはコンピュータの進歩でしょう。
昔はMediaPlayerで再生しながら、ビデオキャプチャでTVみながら、
更に他の音を出しながらって出来なかったような気がするけど、
正直なところどうだったかよく覚えていないなあ。
# 正式回答はMicrosoft社にインシデントを払って利くことになると思います。
# 以下、個人的な理解/見解です。
OSがミキシングしてくれるか否か、なのではないでしょうか。
・exeが違う(通常は無関係の別人が作ってる)
⇒OS側で他人のものに影響されないようにケアする仕様
・スレッドが違う(通常は同じ製作者か、一連のシステム)
⇒製作者の方で回避可能なので対応するように開発するべし。
元々、旧OS時代の下位互換機能というか、力を入れるAPIとは思えません。
(マルチメディア系は別途独立進化させているので直す力を入れるところとは思えない)
エラー音とか鳴らす程度なら今の機能で十分というか、
昔からそういう風にしか鳴らないものだったので…。
# かぶった…。
確かに昔のWindowsは鳴らなかったような気がします。
# DirectX5の頃にそんなのでDirectXに手を出したので…。
なので、MSがそこらだけ対応したのかな、と。
ああ、なるほど(^_^)
ようやく納得がいきました。MS側の問題だったのですね。
スレッドのコーディングが間違ってなかって良かったです。
昔のWindows(Windows3.1やWindows95)では、あまりプログラミングをしていなかった
のでその辺は理解していませんでした。
DirectXが生まれた背景も垣間見られたような気がします。