CreateThread と PlaySoundについて – プログラミング – Home

通知
すべてクリア

[解決済] CreateThread と PlaySoundについて


n_n
 n_n
(@n_n)
ゲスト
結合: 19年前
投稿: 31
Topic starter  

以下のようなコード
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')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

PlaySoundって同時再生できるとは説明にないね。
それに昔は同時再生できるサウンドカードなどはなかったし。
DirectSoundだか何か俺はしらんが別の方法ならできるらしい。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

御意。同時に鳴らしたいならDirectX使ってください。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

あ、waveOut系APIとかMCIでもいけた気がします…(自信なし


返信引用
n_n
 n_n
(@n_n)
ゲスト
結合: 19年前
投稿: 31
Topic starter  

解決策を模索する中で、偶然発見した方法なんですが、
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')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

推測だけど
PlaySoundが内部でどっちのスレッドから自分が呼ばれているかなんて
気にしていないんじゃないの。
そんなの面倒なだけだし。

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

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


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

# 正式回答はMicrosoft社にインシデントを払って利くことになると思います。
# 以下、個人的な理解/見解です。

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

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


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

# かぶった…。

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

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


返信引用
n_n
 n_n
(@n_n)
ゲスト
結合: 19年前
投稿: 31
Topic starter  

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました