• ベストアンサー

WAVEの音量を個別に変更する方法

みなさんこんにちは. 今,VisualStudio.Net2003を使ってWAVEの音量調節を可能にしたいです。 waveOut系の関数でWAVEデータを管理しているのですが、WAVEファイル一つだけに絞って音量調節したいのですが、よく分かりません。 waveOutsetVolumeだとマスターボリュームを弄るようなので殆どのアプリに影響がでてしまいます。 どなたか,再生中の音声のボリュームを変更する方法や関数を知っているかたがいらっしゃたら教えていただきたく存じ上げます. 何卒よろしくお願いいたします.

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

waveOutWrite は WAVEHDR 構造体のメンバ lpData がさすバッファにあるデータを再生するので, そこにあるデータを (WAV 的な意味で) いじれば何とでもなります. 最大値と最小値との差を大きくすれば音量も大きくなりますし, 差を小さくすれば音量も小さくなります. もちろん適当なエフェクトを掛けることも可能です. まあ, 当然わかると思いますが, この方法は「これから再生しようとするデータ」の音量を調節するものでしかありません. つまり, 「今まさに再生中のデータ」とか「すでに waveOutWrite に渡してしまったデータ」の音量をこの方法で調節することはできません.

DEADSPACE566
質問者

お礼

 返信ありがとうございます。 lpData内のデータでいいんですね。 しかし、気になることがあるのですが、「今まさに再生中のデータ」とあるのですが、 WAVEファイルの読み込み途中での再生ということでしょうか? WAVEファイルのデータをlpDataに読み込ませている途中だとできないということでしょうか?

DEADSPACE566
質問者

補足

補足です。 WAVEファイルの読み込み途中での再生というのは非同期読み込みを行っている 最中ということです。 非同期読み込みを行っている最中のデータということです。 よろしくおねがいします・

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

あれ? かえって混乱させちゃったかな? ある音声を再生中であっても, waveOutWrite を呼び出すことは可能です. その場合, 新しいデータは「現在のデータの再生が終わった」あとで再生されます. もちろん waveOutWrite を複数回呼び出せば「呼び出したその順序」に従って順次再生されます. #2 とか #3 とかでいっているのは, 「waveOutWrite を呼び出した後でデータをいじっちゃダメ」ってこと. 音量を調整したければ, 音量を調節したデータをおいてから waveOutWrite を呼び出さなきゃならない.

DEADSPACE566
質問者

お礼

調節されたデータでwaveOutWriteを呼びだせばいいんですね。 よく理解できました。  ここまで付き合って頂いてありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

waveOutWrite は WAVEHDR 構造体の lpData が指すところにあるデータを再生するわけですが, 実際には「再生するよう予約する」という働きをします. デバイスがひまなら直ちに再生しますが, 何らかのデータを再生中のときには「それが終わってから再生する」という動作です. で, #2 で「今まさに再生中のデータ」と書いたのは, 上のようにして「再生 (するよう予約) しているデータ」という意味です. データの流れでは 1. 何らかの方法で lpData が指す領域にデータを設定する 2. waveOutWrite を呼び出して再生の予約をする 3. 実際にデータが再生される となり (2 の直後に 3 に行くこともある), この 2 の段階に入ったらもう変更はきかないよ, ということです. 外部ファイルなどから読み込んでいる途中なら (まだ waveOutWrite を呼び出していないなら), そのデータを変更することで任意のエフェクトを掛けることができます.

DEADSPACE566
質問者

お礼

 返信遅くなりました。  再生中だと予約できないので注意が必要だということですね。 とてもよく分かりました。 参考にさせて頂きます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

実際にどうやって再生しているのか知らんけど, waveOut系の関数にデータを渡す時にいじればいいんじゃないかな.

DEADSPACE566
質問者

お礼

返信ありがとうございます。 >waveOut系の関数にデータを渡す時にいじればいいんじゃないかな. ということはWAVEHDRに格納されているデータを弄るということでしょうか? その部分がよく分からないでいます。

DEADSPACE566
質問者

補足

 再生はwaveOutWriteで再生しています。

関連するQ&A