CreateThread と PlaySoundについて

[戻る]
n_n 2007/07/20(金) 23:05:58
以下のようなコード
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は効果音です。
何か問題があるのでしょうか?ご教授下さい。

wclrp ( 'o') [HomePage] 2007/07/20(金) 23:37:20
PlaySoundって同時再生できるとは説明にないね。
それに昔は同時再生できるサウンドカードなどはなかったし。
DirectSoundだか何か俺はしらんが別の方法ならできるらしい。

Ban 2007/07/21(土) 00:57:48
御意。同時に鳴らしたいならDirectX使ってください。

Ban 2007/07/21(土) 01:00:20
あ、waveOut系APIとかMCIでもいけた気がします…(自信なし

n_n 2007/07/21(土) 13:41:08
解決策を模索する中で、偶然発見した方法なんですが、
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を作れば上手くいき、スレッドではダメ。という理由は何なのでしょうか?
どなたかご教授下さい。

wclrp ( 'o') [HomePage] 2007/07/21(土) 15:09:24
推測だけど
PlaySoundが内部でどっちのスレッドから自分が呼ばれているかなんて
気にしていないんじゃないの。
そんなの面倒なだけだし。

複数同時に再生できることを考えて作られたAPIなら
識別子(ハンドルとかディスクリプタなど)を使えるようにして
鳴らした音を別のスレッドで止めたりできるように考えているはず。

EXEだと同時になるのはコンピュータの進歩でしょう。
昔はMediaPlayerで再生しながら、ビデオキャプチャでTVみながら、
更に他の音を出しながらって出来なかったような気がするけど、
正直なところどうだったかよく覚えていないなあ。

Ban 2007/07/21(土) 15:09:32
# 正式回答はMicrosoft社にインシデントを払って利くことになると思います。
# 以下、個人的な理解/見解です。

OSがミキシングしてくれるか否か、なのではないでしょうか。
・exeが違う(通常は無関係の別人が作ってる)
 ⇒OS側で他人のものに影響されないようにケアする仕様
・スレッドが違う(通常は同じ製作者か、一連のシステム)
 ⇒製作者の方で回避可能なので対応するように開発するべし。

元々、旧OS時代の下位互換機能というか、力を入れるAPIとは思えません。
(マルチメディア系は別途独立進化させているので直す力を入れるところとは思えない)
エラー音とか鳴らす程度なら今の機能で十分というか、
昔からそういう風にしか鳴らないものだったので…。

Ban 2007/07/21(土) 15:12:49
# かぶった…。

確かに昔のWindowsは鳴らなかったような気がします。
# DirectX5の頃にそんなのでDirectXに手を出したので…。

なので、MSがそこらだけ対応したのかな、と。

n_n 2007/07/21(土) 22:27:26
[[解決]]
ああ、なるほど(^_^)
ようやく納得がいきました。MS側の問題だったのですね。
スレッドのコーディングが間違ってなかって良かったです。
昔のWindows(Windows3.1やWindows95)では、あまりプログラミングをしていなかった
のでその辺は理解していませんでした。
DirectXが生まれた背景も垣間見られたような気がします。

古いスレッドには追加発言できません。