• 締切済み

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

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

みんなの回答

回答No.3

> mixer, mimio のAPIを一度詳しく調べてみようと思います. 揚げ足取りのようで失礼ですが一応「mimio」ではなく「mmio」です。恐らくMulti Media Input Output の略だと思います。 参考までに、wave系関数は一番古いタイプの音声入出力です。それ以外に DirectSound系関数や、Windows Vista以降でしか使えませんがCore Audio APIというのもあります。仕事でやっているリアルタイム音声処理だと結構シビアな問題があるのですが、効果音再生でそんなに違わないかと思います。 とは言え、wave系関数が一番参考文献やネット情報が多いので、新しく始めるには適しているかと思います。 > 再度質問事項が出るかもしれませんが,もし, >ご回答可能でしたらまたよろしくお願いいたします. ここは半年ぶりぐらいに来たのですが、しばらくウォッチする事にします。 が、私がいなくても私なんかよりよっぽど凄い人が多いのでそういう諸先輩方が回答して下さる事でしょう。

回答No.2

方法はおおまかに2通りあるかと思います。 1つはNo.1の方が書いていらっしゃいますように、mixer* 系のAPIを使ってミキサーのマスターボリュームまたは、WAVEのボリュームを制御してしまう方法です。 この方法ならばあらゆる再生音の音量を一挙に!制御できますが、ミキサーの設定を変えてしまうと他のアプリの音量まで変わってしまいます。そのため、起動時の音量を記憶して終了時に戻したりとか、終了時の音量を記憶して次回起動時に復活したりとかの工夫もありますが、アプリ起動中にユーザが別の目的で変更した音量設定まで戻してしまったりと副作用も多く、使う立場からすると頭の痛くなる状況です。 が、世の中の多くのアプリがこの方法で音量を制御しているためか、Windows Vistaでは業を煮やしたMicrosoft社が、mixer*系APIの「マスターボリューム」で制御した音量は、実際のマスターボリュームじゃなくて、アプリケーション毎に新設された仮想マスターボリュームを制御する事によって、このややこしい状況を解消しようとしています。 なので、あまりお勧めの方法ではありません。 もう1つは、mmio* 系のAPIを使って WAV ファイルのPCMデータをそのままメモリに読み込んで、waveOut* 系APIを使って再生するという方法でPlaySound()と同様の機能を組んで、PCMデータを読み込んだところで、8ビットデータなら128を引いてから倍率をかけて再び128を加え0~255でクリッピング、16ビットデータならそのまま倍率をかけて-32768~+32767でクリッピングしてからバッファに書き込んで、waveOut*系APIに渡します。 1倍以上の倍率にすると音が歪む可能性があるのが欠点です。なので、音量が大きめのWAVを用意しておき主に倍率は0~1の範囲で使うようにします。 この方法は WinAmp や Windows Media Player のアプリケーションボリュームに使われている方法で、使う立場からするとミキサーの値が勝手に変わったりしないので使いやすいものです。 ただし、WAV以外の形式のファイルを再生しようとすると、デコーダを持ってきて組み込むなど非常に大変な話になってしまうのでWAV限定の効果音などの再生に威力を発揮するものです。 仕事で開発した MyPlaySound() ってWAV再生用の関数は PlaySound() と同じように使えて音量や再生する音声デバイス繰り返し回数などを制御できるようにしたものでうまく動作しています。残念ながら著作権は会社にあるので勝手に出せませんが中身はここで書いたような形になっています。 以上、参考になればと思います。 具体的な関数の使い方は例えば「waveOutWrite」とか「waveOutOpen」などの関数名でネットで調べればわかるかと思います。

haribobear
質問者

お礼

どうもありがとうございます.mixer, mimio のAPIを一度詳しく調べてみようと思います.開発された関数の中身を解説していただけて,本当に感謝しております.音声に関する知識が乏しいため,再度質問事項が出るかもしれませんが,もし,ご回答可能でしたらまたよろしくお願いいたします.失礼いたします.

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★次のリンク先をどうぞ。 ・http://hp.vector.co.jp/authors/VA016117/mixer1.html→『ミキサー その1(音量の調節)』  http://hp.vector.co.jp/authors/VA016117/mixer2.html→『ミキサー その2(ミュート)』  http://hp.vector.co.jp/authors/VA016117/mixer3.html→『ミキサー その3(多チャンネル対応化)』  あまり詳しくないですが参考になればと思い書き込みました。 ・以上。

参考URL:
http://hp.vector.co.jp/authors/VA016117/index.html
haribobear
質問者

お礼

リンク先のご提供どうもありがとうございます. ご返信が遅くなってしまい,申し訳ありません. とりあえず,リンク先を熟読してみます.ミキサーが何のかを一度理解する必要があるかもしれません.