• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:waveIn、waveOut系プログラミングについて)

waveIn、waveOut系プログラミングについて

このQ&Aのポイント
  • waveInとwaveOut系のプログラミングについて、メッセージ処理のタイミングや関数の関係について説明してください。
  • win32APIを用いた録音再生プログラムの作成中に、waveIn系とwaveOut系の関数の挙動とメッセージの関係を理解できていないので、教えてください。
  • 具体的には、waveInPrepareやwaveInAddBufferなどの関数がどのタイミングで行われるべきか、録音前に準備する必要性などが気になっています。また、MMSYSERR_~というエラーメッセージの調べ方も教えていただけると助かります。

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

  • ベストアンサー
noname#30727
noname#30727
回答No.1

1. MM_WIM_OPEN は、デバイスがオープンされた後に送られるとあるので、そのメッセージを受け取るまで、その他の処理をしないほうが良いように思いますが、waveInOpen から戻って来た時点で既にメッセージが送られていることが明かであれば、特に待たなくても支障は無いでしょう。 (私なら待ちますが) 2. k_shin さんの手順で正しいと思います。 waveInOpen (非同期) ↓ WM_WIM_OPEN メッセージ待ち ↓ waveInPrepareHeader (同期) ↓ waveInAddBuffer (同期) ↓ waveInStart (非同期) 3. 録音ボタンを押さない限り、入力デバイスが存在しなかったとしてもエラー表示をしなくてもよくなるので、プログラムの構造が単純化できる利点はあると思います。タイムラグが大きくて録音が必須な状況であれば、先に準備するべきですよね。 4. waveInOpen だけでも以下のような戻り値があると書いてありますね。 >MMSYSERR_ALLOCATED Specified resource is already allocated. >MMSYSERR_BADDEVICEID Specified device identifier is out of range. >MMSYSERR_NODRIVER No device driver is present. >MMSYSERR_NOMEM Unable to allocate or lock memory. >WAVERR_BADFORMAT Attempted to open with an unsupported waveform-audio format.

k_shin
質問者

お礼

ありがとうございます。 メッセージのタイミングについて教えて頂けたのは本当に助かりました。 MSDNについても調べ方のコツがわかってきたのでこのアドバイスを元に作成していこうと思います。 (検索は.comでないと駄目&関数のみ検索も不可なんですね。) なお、この質問投稿は今日1日待ってから締め切りたいと思います。 丁寧なご回答ありがとうございました。

k_shin
質問者

補足

補足というより追加質問なのですが メッセージを通るポイントに応じてVCのデバッグを使って値を見たのですが WAVEHDRのメンバのdwFlagsの値が18や3、1等の値をとていました。 フラグに使われる値のWHDR_BEGINLOOPが実際にどんな値か調べる為に printf("%d",WHDR_BEGINLOOP)というように、値を調べたところ、 WHDR_BEGINLOOP  4 WHDR_DONE     1 WHDR_ENDLOOP 8 WHDR_INQUEUE 16 WHDR_PREPARED 2 でした。 デバッグ中に現れた18,3にあたる数字はこの5つの中にないのですが どのような可能性が考えられるのでしょうか。 ちなみにwaveInOpenをした時が18,waveInDoneで3といった感じでした。ご意見お願いいたします。

すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#30727
noname#30727
回答No.2

>デバッグ中に現れた18,3にあたる数字はこの5つの中にないのですが dwFlags メンバはビットの集合です。 ですから、 3 = (1 | 2) = (WHDR_DONE | WHDR_PREPARED) 18 = (2 | 16) = (WHDR_PREPARED | WHDR_INQUEUE) と考えればいいです。 もちろん、たとえば WHDR_DONE かどうか見る場合は、 if (wavehdr.dwFlags & WHDR_DONE) のようにします。

k_shin
質問者

お礼

ありがとうございます。 大変参考になりました。 まだ再生はできませんが色々デバッグしてみます。 今日の0時まで一応締め切らずにおきます。 ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A