PlaySoundでSND_SYNC(同期)させると途中で音楽が止まります

このQ&Aのポイント
  • 特定のフォルダにある音楽(.wav)ファイルを順々に再生する音楽再生プレイヤーを作成中です。
  • しかし、PlaySound関数でSND_SYNCを使うと、途中で音楽が止まり、次の曲が再生されます。
  • 一時的にASYNCを使い、_getch()関数で待機しているが、解決策は見つかっていないようです。
回答を見る
  • ベストアンサー

PlaySoundでSND_SYNC(同期)させると途中で音楽が止まります、、

現在、特定のフォルダにある音楽(.wav)ファイルを検索して、パスを受け取り、それを順々に再生する、簡単な音楽再生プレイヤーを作成しようと思っています。 そこで問題となっているのが、同期を取るSND_SYNCなのですが、通常なら音楽が終了するまで待機するはずなのですが、 http://social.msdn.microsoft.com/forums/ja-JP/vsgeneralja/thread/4795014f-c428-43f1-a6b8-2267f26cde81 こちらにもあるとおり、途中で止まり、次の曲が再生されます。 そしてその曲も途中で止まり・・が続きます。 ASYNCにすると最後まで再生されるのですが、一番最後の曲のみ再生になります。 一応、応急処置として、ASYNCを宣言し、_getch();にて一時待たせていますが、 どうにかならないものでしょうか、、。もしかしたら音楽ファイルのサイズの問題かもしれませんが・・。 とりあえず検索は正常動作しているので、playsoundを行う関数は、 void prays(char *fname) {    printf("%sを再生します。\n",fname);    char T[100];    sprintf(T,"wavfile\\%s",fname);    PlaySound(T, NULL, SND_FILENAME| SND_ASYNC |SND_NOSTOP );//    _getch();    return ; } 環境 OS:winXP コンパイラ=BCC55(PSDK) 言語=C(メイン)、C++、WIN32API 回答お願いします。。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.1

PlaySound、sndPlaySoundをSND_SYNCで鳴らすと「最後のデータをユーザーバッファにセットし終わった瞬間」に制御が戻って来ます。 DirectSoundがインストールされている環境では、オーディオ再生は 複数のユーザーバッファ        ↓ ソフトウェアオーディオミキサー        ↓ マスターバッファ        ↓ サウンド再生ハードウェア        ↓ スピーカーからの音声 と言う構造になっています。 なので、「最後のデータをユーザーバッファにセットし終わった瞬間」には、そのデータは再生が終わっていません。 正確な「再生が終了した瞬間」を知るには「ユーザーバッファに再生すべきデータが無くなって、バッファが空っぽになった瞬間」を知る必要があります。 なお、SND_ASYNCは「呼び出したら、音を鳴らしっぱなしにしたまま、すぐに戻ってくる」ので、1曲目を鳴らした瞬間に2曲目を鳴らし、2曲目を鳴らした瞬間に3曲目を鳴らし、と、瞬時に全曲を再生してしまい、結果的に「一番最後の曲のみ再生」して終わりになってしまいます。 「本当に曲が鳴り終わったのを知る」には「サウンドバッファの監視」が必要です。 そして、バッファの監視を行うには、PlaySound、sndPlaySoundは使えないので、自分でバッファを用意し、バッファへのデータ転送、データ転送が終わったバッファの再生開始などを自分で行う必要があります。 オーディオプレーヤーは「そんなに簡単に作れるような代物ではない」ので、覚悟して作りましょう。

zellfess
質問者

お礼

返事が遅くなりました。 SND_SYNCはそういう定義が含まれていたのですね。 対処方法に関しても、とても参考になりました。 有難う御座いました。

関連するQ&A

  • wavの連続再生ってどうやるの?

    WindowsでC++のプログラミングをやっています。 wavで3つの音楽ファイルを連続再生させたいのですがどうすればよいのでしょうか?? 1曲を1回再生なら PlaySound("c:\\01.wav",NULL,SND_FILENAME | SND_ASYNC | NULL ); で、できたのですが、3曲連続で再生させようとしても PlaySound("c:\\01.wav",NULL,SND_FILENAME | SND_ASYNC | NULL ); PlaySound("c:\\02.wav",NULL,SND_FILENAME | SND_ASYNC | NULL ); PlaySound("c:\\03.wav",NULL,SND_FILENAME | SND_ASYNC | NULL ); とすると03.wavだけが再生されてしまいます。 実際全部再生されているのでしょうけど前のが全部再生されないうちに次のが再生されてしまっているのだと思います。 01.wavが1曲全部再生してから02.wavを再生させるようにするにはどうすればよいのでしょうか。 どなたかよろしくお願いします><

  • 再生音声の音量を変更する関数を教えてください.

    みなさんこんにちは. 今,VisualStudio.Net2005を使って簡易な音声再生ソフトを作ろうと考えております. PlaySound( L"soundfilename.wav", NULL, (int)(SND_ASYNC | SND_FILENAME)); の関数で引数の音声ファイルを再生することまではできましたが,再生中の音声のボリュームを変更する方法が分かりません. どなたか,再生中の音声のボリュームを変更する方法や関数を知っているかたがいらっしゃたら教えていただきたく存じ上げます. 何卒よろしくお願いいたします.

  • excelで音声再生時に並行して別の操作をしたい

    下記のようなプログラムで音声再生をしていますが、再生が全部終了するまで別の操作ができません。再生と並行してスクロールなど別の操作もできるようにするにはどのように書き換えればよいでしょうか? Declare Function PlaySound Lib "Winmm.dll" Alias "PlaySoundA" _ (ByVal pszSound As String, _ ByVal hmod As Long, _ ByVal fdwSound As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Const SND_ASYNC = &H1& '再生後すぐに制御を戻す Public Const SND_SYNC = &H0& '再生が完了するまで制御を戻さない Sub C列再生() EN = Range("A65536").End(xlUp).Row For I = 2 To EN INF = ThisWorkbook.Path & "\ONSEI-n\" & Range("C" & I).Value & ".WAV" PlaySound INF, 0, SND_SYNC '再生が完了するまで制御を戻さない Sleep 1000 '1000mS待ち Next I End Sub Sub A列再生() EN = Range("A65536").End(xlUp).Row For I = 2 To EN INF = ThisWorkbook.Path & "\ONSEI\" & Range("A" & I).Value & ".WAV" PlaySound INF, 0, SND_SYNC '再生が完了するまで制御を戻さない Sleep 1000 '1000mS待ち Next I End Sub

  • 作成した音楽CDの音が途中で進めなくなる。

    こんにちは。もしよろしければお答えください。 OSはXPで、Windows Media PlayerでwmaやMp3を音楽をCDにいれています。 どちらもちゃんと聞けるのですが、たまに再生途中で曲が止まり、その場の音がぎゅるぎゅると変な音を立てて発せられます。 そうなるのは、18曲入れた内の1っ曲だったり続けて3曲だったりで、曲の出だしだけだったり途中からだったりします。 早送りをしてその部分を飛ばしたりその曲を飛ばしたりすると、あとは何事もなく聴けます。CDにいれる前に聞いた時は普通でした。 なお、再生するオーディオ機器は色々変えてみたのですが同じようになるので、再生機器の問題ではないと思います。 いったい何がいけないのでしょうか!? ご返答よろしくお願い致します。

  • 再生を途中でとめておく

    こんばんは。 ipod nano 第4世代を使っています。 音楽の再生について、質問させてください。 ある曲の再生を途中でとめて、またその曲を聴くとき、前回とめた位置から聞くことはできないでしょうか? たとえば、Aという曲を聴いていて途中でとめて、Bという曲を再生する。その後Aの曲に戻る際、以前Aを止めたところから聴けるかどうか、をお伺いしたいのです。 設定によって可能なものでしょうか? よろしくお願いします。

  • [C言語、Win32API] 音楽を途中から再生する

    Visual C++ 6.0 でWindowsアプリケーションプログラミングをしています。 音楽(mp3形式)を再生するのは高レベルMCIまたは中レベルMCIで出来るのですが、曲を途中から再生する、ということは可能なのでしょうか? もし、やり方があれば、教えていただけると有難いです。 よろしくお願いします。

  • 「Visual C++ 2008 Express」の「PlaySoun

    「Visual C++ 2008 Express」の「PlaySound」関数について。 サイコロゲームが完成したのでBGMを入れようと思い 「PlaySound」関数を使ったところエラーに沢山阻まれうまくいきません。 --作成した経路&環境&やりたいこと-- 「Windows フォームアプリケーション」→「ソリューションも作成」 DirectXなしで「wav」ファイルを読みこみたい。 動画を添付してますが一応コードを乗せときますね。 --------------------------------------------------------------- #pragma once //ここから追加 #pragma comment(lib,"winmm.lib") #include <stdio.h> #include <windows.h> #include <mmsystem.h> //ここまで追加 namespace WinFAPI_S {  ~~省略~~ (一番下の方まできて・・・) #pragma endregion //ここから追加 int main(){ PlaySound("霊夢テーマ2.wav",NULL, SND_FILENAME | SND_NOSTOP | SND_SYNC); } }; } ------------------------------------------------------------- これをビルドすると「\Form1.h(74) : error C2664: 'PlaySoundW' : 1 番目の引数を 'const char [16]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)」 というエラーがでてしまう困っております。 このエラーを解決するにはどうしたらよいでしょうか? またソースの書き方などが間違っているとか、アドバイスなどがございましたら言ってください。 それではよろしくお願いいたします。

  • ボーダフォン902T でCDの音楽が再生できますか?

    ボーダフォン 902Tを使用しています。 携帯がウォークマン代わりにならないかと試行錯誤しています。 CDの音楽を何らかの形式のファイルに変換し、 SDカードに保存→902Tで聴く方法はありますか? 着メロと同じmmfファイルにすることはできましたが、 曲の途中で再生が止まってしまいます。 取説に「メディアプレイヤーはMPEG4形式のものが再生可能」と書いてありましたが どうしてもできません。 1曲丸ごと再生可能な方法があれば教えてください。

  • 音楽とのシンクロについて

    三日前からFlashMXをいじり始めた 超初心者ですm(_ _)m 音楽とアニメーションをシンクロさせたいのですが どーも効率よくいきません。 1、音楽の再生を一度はじめると止まらない   (現状・・制御→サウンドのミュートにて止める) 2、音楽途中から再生できない   (毎回頭から聞いて目測でシンボルを配置) 3、シーンに音楽を配置したとき曲の最後が何フレーム   目にあるかわからない。   (50フレームごとに空白キーフレームを    挿入して波形がでてきたらまた50F後に    空白キーフレームをの繰り返し) 4、パブリッシュしたときにシンクロしてない・・・・   このようなことがクリアできるともうちょっと   早くて手の込んだことができるような気がするので   すが・・・教えてください

    • ベストアンサー
    • Flash
  • 【WMP10.0】CD-R書き込み途中でCDが排出される

    WMP10.0を用いてCD-Rに音楽を書き込んでいるのですが、 6曲目の書き込み途中でCDが排出されてしまいます。 このとき、試しにその排出されたCDを再生してみると、やはりその6曲目の途中で再生が終わります。 6曲目の音楽がいけないのかと思い、書き込みリストから6曲目を省くのですが、 やはり6曲目(別の音楽)の書き込み途中でCDが排出されてしまいます。 何か解決方法など分かる方がいらっしゃいましたらよろしくお願いします。

専門家に質問してみよう