[BlueLeaf1336]> PROBLEMS> MediaSkipper>

Mixer関数について調べる

historyTOP

2008/01/21:作成 Querying Devices
2008/01/22:更新 Opening and Closing

目的TOP

ひょっとすると目的じゃなくて手段です。結構な量の動画を再生していると、あるものはすごく小さな音で音量を上げないといけないし、あるもの(たいていは音量の小さいやつのすぐ次にあるんですが)はすごく大きな音ですぐにでも音量を下げないといけない、などそれなりにうっとうしいわけです。

特に、Player の音量設定だけではだめで、Windows の「マスタ音量」をいじらないといけなくなったりすると、憂鬱になります。

ネットにつながらないので、ダウンロードした Delphi-ML を調べてみると Mixer 関数を使ってやればひょっとしたら...という記述が見つかりました。つまり、今の再生音量を取得してそれなりの音量にできそうな、できなさそうな。

そういうわけで Mixer 関数について調べてみることにします。

方針は、Windows SDK の Audio Mixer Reference のページに乗っているすべての API をひたすら試してみる。早い話いつもの方法で。

downloadTOP

実行ファイルとソースコードです。MixerTest.zip(256,814bytes)(260,462bytes)

Querying Devices (2008/01/21)TOP

上からせめて行きます。

MIXERCAPSThe MIXERCAPS structure describes the capabilities of a mixer device.
mixerGetDevCapsThe mixerGetDevCaps function queries a specified mixer device to determine its capabilities.
mixerGetNumDevsThe mixerGetNumDevs function retrieves the number of mixer devices present in the system.

最初にmixerGetNumDevsでデバイスの数を調べて(ゼロベース)、ゼロから順番にmixerGetDevCapsに問い合わせていけば、MIXERCAPSに情報が戻ってくるようです。

実行結果

製造者(Manufacturer)と製品(Product)を列挙している MMReg.h の一部分を腕をしびれさせながら .pas ファイルに翻訳した。製造者を取得した時点で、そうなることがわかっていながら...

DriverVersion は High-Order と Low-Order でメジャーバージョンとマイナーバージョンに分割するんですが、分割方法があっているのかどうか自信なし。

szName はそのままでいいとして、fdwSupport は用途不明。cDestinations は MIXERLINE構造体と関係があるみたいです。そのときに思い出すことにします。

Opening and Closing (2008/01/22)TOP

mixerOpenThe mixerOpen function opens a specified mixer device and ensures that the device will not be removed until the application closes the handle.
mixerCloseThe mixerClose function closes the specified mixer device.

mixerOpen でデバイスをあけて、使用中のロック(?)を行ったあと、mixerClose で閉じるのはいいとして、mixerOpen がややこしそう。

...だめだ。総当り無理だ。mixerOpen のヘルプをたどっていくと底なしのリンクにはまり込んでしまいました。目的なしに使うのは難しいです。

ちょっと別の方法考えることにします。たとえば Delphi-ML から使えそうなサンプルをかき集めるとか...

(2008/01/24)...だめだ。深すぎ。

に、マスタ音量の設定値を取得するためのサンプルがあります。3段か4段かとにかく API で取得した構造体のメンバーを次の構造体に設定して API を呼んで、また取得した構造体のメンバーを次の構造体に設定して API を呼んで ... と、これはもう自力ではどうしようもない感じ。

まねしてやってみたら音量は取れたんですが、GetMem で確保したポインタが、メインの音量を取得するための API を読んだ時点で壊されるらしく FreeMem すらできずに例外でまくり。ギブアップです。

EOFTOP