〜 メディア 〜
現在のWaveボリュームを取得 (要WINMM.DLL)

一方的に設定するだけの場合は、音量を取得する必要ありませんが、
例えばボリュームメーターを表示する場合には必要でしょう。
変数にボリュームを記憶させるだけでは、自分のツール外から変更されると不正なサイズを表示しますから、
できるだけリアルタイムで現在の設定音量を取得しなければなりません。
下記は、現在のWAVE音量の取得を行うサンプルモジュールです。コレを参考に組み込んでみてください。
設定同様に、APIwaveOutGetVolume関数の第1パラメータにオーディオデバイスのハンドルを、
第2パラメータに現在の設定を格納する変数(アドレス)を指定します。
上位2バイトが右チャンネル、下位2バイトが左チャンネルを示しており、
左右個別に設定不可能なデバイスは下位2バイトだけのモノラルボリュームレベルが入ります。
APIwaveOutGetVolume関数が成功すると0が、失敗すると以下のエラーコードが返ります。
定数定数値内容
MMSYSERR_INVALHANDLE0x0005デバイスハンドルが無効
MMSYSERR_NODRIVER0x0006デバイスドライバが存在しない
MMSYSERR_NOMEM0x0007メモリを割り当てられないか、ロックできない
MMSYSERR_NOTSUPPORTED0x0008関数がサポートされていない
尚、Wave音量を設定する方法についてはコチラをご覧ください。

getvolume 格納配列
格納配列ボリュームレベルを格納する数値型配列変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
	ll_libload winmm, "winmm.dll"
	ll_getproc waveOutGetVolume, "waveOutGetVolume", winmm

#module
#deffunc getvolume val
	mref volume, 48
	prm = 0
	ll_getptr i : ll_ret prm.1
	ll_callfunc prm, 2, waveOutGetVolume@
	volume = (i & 0xFFFF) * 100 / 0xFFFF, ((i >> 16) & 0xFFFF) * 100 / 0xFFFF
	return
#global

	exec "sndvol32.exe"
	mes "マスタ音量「WAVE」のバランスバーを左右に動かしてみてください。"
	repeat
		wait 10
		getvolume size // 要素0=左、1=右
		title "左:" + size.0 + "% 右:" + size.1 + "%"
	loop

getvolume 格納配列
格納配列ボリュームレベルを格納する数値型配列変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#uselib "winmm.dll"
#func  global waveOutGetVolume "waveOutGetVolume" int, var

#module
#deffunc getvolume val volume, local i
	waveOutGetVolume 0, i
	volume = (i & 0xFFFF) * 100 / 0xFFFF, ((i >> 16) & 0xFFFF) * 100 / 0xFFFF
	return
#global

	exec "sndvol32.exe"
	mes "マスタ音量「WAVE」のバランスバーを左右に動かしてみてください。"
	repeat
		wait 10
		getvolume size // 要素0=左、1=右
		title "左:" + size.0 + "% 右:" + size.1 + "%"
	loop