• 締切済み

WindowsマルチメディアのwaveOutに関する質問です。

WindowsマルチメディアのwaveOutに関する質問です。 複数のWaveOutデバイスにそれぞれ別の音を出すためにwinmm.libを使ってプログラムを組みました。 waveOutGetNumDevs:デバイス数取得 waveOutGetDevCaps:デバイス列挙 waveOutOpen:デバイスのオープン(CALLBACK_FUNCTIONでコールバック使用) ※バッファを10KB×3用意 waveOutPrepareHeader:送信準備 waveOutWrite:送信 コールバック関数: WOM_DONE→ データがあれば終了バッファに新しいデータを充当 waveOutPrepareHeader:送信準備 waveOutWrite:送信 データが無ければデバイスを閉じる と、これで目的の音を鳴らす事は出来たのですが、再生終了後にデバイスを閉じようとすると処理が戻ってきません。 waveOutReset:リセット(これが戻ってこない) waveOutUnprepareHeader:ブロックの解放 waveOutClose:クローズ(リセットをコメントにした場合、これも戻ってこない) そこで質問です。 1.コールバック内からクローズする事に問題はあるのでしょうか。 2.途中で再生を止めようと思い、再生途中でwaveOutResetを行おうとしても同様の現象が起きるのですが、どうやって止めるのが妥当なのでしょうか。 3.参考になるサイトやコード等があれば教えて頂きたいです。 よろしくお願いします。 VisualStudio2008 VC++9 Windows 7 Pro

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

コールバック関数の処理ですが switch(msg){ case WOM_OPEN : break; case WOM_DONE : if(ほにゃらら) { waveOutClose(ハンドル); break; } break; case WOM_CLOSE: waveOutUnprepareHeader(引数); break; } こんな感じになると思います

yamaj_biz
質問者

補足

ご指摘の位置にwaveOutCloseを持ってきてみましたが、やはりそこで止まってしまいますねぇ。 コールバック内の処理なのでメインの処理は動いてますが…。 waveOutCloseが実行されていないからだと思いますが、WOM_CLOSEには来ないですしね。

関連するQ&A

  •  waveOutOpen関数で分からないことがあります。

     waveOutOpen関数で分からないことがあります。 waveOutOpen関数を使ってマルチバッファリングを行っています。 初期化段階でwaveOutOpenを二つ使いMM_WOM_DONEでストリーム 再生をしているのですが、別の場所でwaveOutOpenをやるとそこか ら音が途切れ途切れになります。 できれば複数再生をしたいのですが、waveOut系は複数再生が不可能 なんでしょうか? データブロックとかと関係がありそうなんですがいまいち分かりません。 この原因を知りたいのですが、教えてください。

  • 音声キャプチャーと再生の同期を取るには

    VC++でプログラムしています。 waveInOpenとwaveOutOpenを使って、0.5秒間隔で音声キャプチャーしたデーターを加工して即再生したいのですが、同時に起動したキャプチャーと再生は何時間でもずれることはないでしょうか? 同期を取る方法を教えてください。 現在、録音再生の両方のバッファーが終わるのを待ってデーターを移しています。 録音再生共0.5秒のバッファーを2組用意して切り替えています。

  • LinuxのTCPIP

    LinuxのTCPIP実装についてご教示ください。 (C言語をベースとして記載します) 例えば、Kernelとしてはデータを受信していて、アプリケーションがrecv()等の関数で データを引き抜いていない状態でのSocketのCloseはRSTの送信になりFINにはならないと 理解しています。 このとき、send()にデータが残っていた場合でもRST送信するのだから、 送信バッファのデータは破棄され、送信されないというKernel側の実装になっている という理解で良いのでしょうか? #送信バッファのデータというのは、アプリケーション側がsend()しており、実際にパケットは #送信されていない状態(パケットキャプチャされていない状態)としてください 手元で試していると、受信バッファにデータが残っている、かつ送信バッファにも 残っている場合はRST送信され、送信バッファにあるデータも送信されない 受信バッファにデータが残っていない状態で送信後すぐにCloseしても送信が完了してから FINされるように見えています。 ずらずらと書いたのですが、要は受信バッファにデータがある・なしでClose()の挙動が変わり RST送信か、FIN送信になるというのはWeb上でKernelの実装によるものというのを 見つけましたが、その状態、かつ送信バッファにデータが残っている場合は、 RSTだと送信されず、FINだと送信されないという違いがあるので、 Kernel側の意図された実装なのかどうかを知りたいです。

  • wave系関数のエラーについて

    引き続きwave系のプログラムについての質問をさせて頂きます。  waveInUnPrepared関数で戻り値に5つまりMMSYSERR_INVALHANDLEが返ってくる原因について。  APIによる録音再生プログラムを作っています。 マイクによる録音をしている途中で停止ボタンを押すと waveInResetを呼び出し、MM_WIM_DATAを受け取ったら waveInCloseをし、最後にMM_WIM_CLOSEでwaveInUnPreparedを行い録音終了とするようにました。 ですがwaveInReset、waveInCloseはともに戻り値が0なのですがwaveInUnPreparedは戻り値が5でした。MMSYS.hによると5はMMSYSERR_INVALHANDLEということでした。 現在このプログラムは録音を開始してバッファがいっぱいになったら(3秒)録音を終了する、そのバッファ分再生する。ということはできるですが録音中(3秒以内)に停止ボタンを押してその分だけ再生すると言うことができません。 MMSYSERR_INVALHANDLEが発生する原因についてどのようなものが考えられるのでしょうか。 なおバッファ分の録音&再生時にも戻り値は5でした。 手順 録音ボタン→録音処理→(3秒以内に)停止ボタン→MM_WIM_DATAでwaveInClose→MM_WIM_CLOSEでwaveInUnPrepared 環境 VC+6.0 win2000

  • windows API  「mciSendString」 の連続再生について

    VISUAL BASIC 6.0 で音楽再生ソフトを作ろうとしました。 windows API の「mciSendString」を使って、 例1のようにすると b.wav の音楽しか再生されません。 そこで、例2のようにすると、a.wav と b.wav が再生されましたが、 曲の途中では、"pause" と "resume" の命令が効きません。 連続再生ができて、曲の途中でも "pause" や "resume" の命令が効く方法を知りたいのですが、ご指導をお願いします。 <例1> Call mciSendString("open c:\a.wav ", "", 0, 0) Call mciSendString("play c:\a.wav ", "", 0, 0) Call mciSendString("close c:\a.wav ", "", 0, 0) Call mciSendString("open c:\b.wav ", "", 0, 0) Call mciSendString("play c:\b.wav ", "", 0, 0) Call mciSendString("close c:\b.wav ", "", 0, 0) <例2> Call mciSendString("open c:\a.wav ", "", 0, 0) Call mciSendString("play c:\a.wav wait ", "", 0, 0) Call mciSendString("close c:\a.wav ", "", 0, 0) Call mciSendString("open c:\b.wav ", "", 0, 0) Call mciSendString("play c:\b.wav wait ", "", 0, 0) Call mciSendString("close c:\b.wav ", "", 0, 0)

  • コンソールアプリケーションの表示

    コンソールアプリケーションが画面に文字を表示するときの処理はどうなってるのでしょうか。途中まで調べてみましたが分からなくなりました。 GetStdHandle 関数でスクリーンバッファのハンドルを得てそのバッファにWriteFile 関数を使ってデータを書き込む。この後の処理は画面に表示しなければならないのでデバイスコンテキストとか絡んでくるんでしょうか? ご助言ください。

  • flush()とclose()について

    Javaを独習Javaで独習しています。現在、入出力の所まできたのですが、Writerクラスのclose()とflush()の違いがわかりません。それぞれのメソッドの意味はわかるのですがそれらを使う目的がわかりません。flush()は「バッファ付けデータをそのストリームで表されている物理デバイスに書き込む」とあるのですが、サンプルには(バッファ付け文字ストリームの単元にも)flush()は一度も出てこずclose()のみで書き込みが行われています。探したのですが独習Javaのサンプルの中には結局flush()は一度も出てきませんでした。この二つの違いはなんなのでしょうか?初心者のためわかりにくい質問かとは思いますがよろしくお願いします。

    • ベストアンサー
    • Java
  • MediaPlayer9について

    友のWinMEにMediaPlayer9をDL成功して(こぶしでねっと)を聞こうとしましたが、バッファ終了準備完了と表示されますが、再生されない。Playerの模様も動いてないです。どうしたら聞くことが出きるでしょうか?私のWin98は巧く受信でき、楽しんでます。友に楽しんでもらおうと思ったのが仇になってしまい困ってます。どうか教えてください。

  • RS232 通信(2)

    PC_b のプログラムです よろしくお願い申し上げます Private Sub cmdPort1_Click() '変数宣言省略 ' 使用するシリアルポートを設定します。 Port1.PortNumber = 3 ' 通信条件を設定します。 Port1.BaudRate = 9600 Port1.DataBits = 8 Port1.StopBits = 1 Port1.Parity = parNone ' 受信バッファのサイズを設定します。 Port1.InputBufferSize = 4096 ' 送信バッファのサイズを設定します。 Port1.OutputBufferSize = 4096 ' フロー制御の種類を設定します。 Port1.Handshaking = hsRtsCts ' シリアルポートをオープンします。 blnOpenRet = Port1.Open(3, 9600, 8, 1, hsRtsCts, parNone, _ 10000, 10000, iomBlocking) On Error Resume Next ' 使用するシリアルポート、通信条件を設定し、 ' シリアルポートをオープンします。 ' 文字列にCR+LFを付けてデータを送信します。 lngOutputRet = Port1.Output("abcdefg1234" & Chr(&HD) & Chr(&HA)) ' 受信処理を行います。 lngInputRet = Port1.Input(strInputString, 5) ' 送信バッファにデータが残っている場合、 ' すべてが送信されるまで待機します。 Do DoEvents Loop Until Port1.OutputBufferByteCount = 0 ' 送信バッファと受信バッファをクリアします。 Port1.ClearOutputBuffer Port1.ClearInputBuffer 'オープンしているシリアルポートをクローズします。 If Port1.Opened Then ' シリアルポートをクローズします。 Port1.Close End If End Sub 関連URL:http://www.okweb.ne.jp/kotaeru.php3?q=453883

  • インターネットラジオ

    インターネットラジオでオールナイトニッポンを聞いていたのですが、メディアプレーヤーをバージョンアップしたら途中で切れたり、聞けなかったりするようになりました。 メディアプレーヤー7.1から9.0にアップしました。 オールナイトニッポンのサーバーにつなぐと、バッファ終了後に準備完了となってそのあと動きません。 どうすればいいでしょうか?

専門家に質問してみよう