【HSP3】Vista以降で動作するレベルメーターV2

Vista以降で動作するレベルメーター(修正版)

Vista以降で動作するレベルメーター(修正版)

#module
#define CLSID_IMMDeviceEnumerator "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
#define IID_IMMDeviceEnumerator "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
#define IID_IMMDevice "{D666063F-1587-4E43-81F1-B948E807363F}"
#define IID_IAudioEndpointVolume "{5CDF2C82-841E-4546-9722-0CF74078229A}"
#define IID_IPerChannelDbLevel "{C2F8E001-F205-4BC9-99BC-C13B1E048CCB}"
#define IID_IAudioMeterInformation "{C02216F6-8C67-4B5B-9D00-D008E73E0064}"
#define ERender 0x00000000
#define Console 0x00000000
#usecom IMMDeviceEnumerator IID_IMMDeviceEnumerator CLSID_IMMDeviceEnumerator
#comfunc Enumerator_GetDefaultAudioEndpoint 4 int,int,var
#usecom IMMDevice IID_IMMDevice CLSID_IMMDeviceEnumerator
#comfunc Device_Activate 3 var,int,int,var
#usecom IAudioEndpointVolume IID_IAudioEndpointVolume CLSID_IMMDeviceEnumerator
#comfunc Volume_SetMasterVolumeLevelScalar 7 float,var
#comfunc Volume_GetMasterVolumeLevelScalar 9 var
#comfunc Volume_SetMute 14 int,int
#comfunc Volume_GetMute 15 var
#usecom IPerChannelDbLevel IID_IPerChannelDbLevel CLSID_IMMDeviceEnumerator
#comfunc DbLevel_GetChannelCount 3 var
#comfunc DbLevel_GetLevelRange 4 int,var,var,var
#comfunc DbLevel_GetLevel 5 int,var
#comfunc DbLevel_SetLevel 6 int,float,int
#comfunc DbLevel_SetLevelUniform 7 float,int
#comfunc DbLevel_SetLevelAllChannels 8 float,int,int
#usecom IAudioMeterInformation IID_IAudioMeterInformation CLSID_IMMDeviceEnumerator
#comfunc MeterInformation_GetPeakValue 3 var
#comfunc MeterInformation_GetMeteringChannelCount 4 var
#comfunc MeterInformation_GetChannelsPeakValues 5 int,var
#comfunc MeterInformation_QueryHardwareSupport 6 var
#defcfunc todouble int p1
temp = 0.0
lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000)
lpoke temp, 0, p1 << 29
return temp
#deffunc _OpenDevice
newcom pMMDeviceEnumerator,IMMDeviceEnumerator
if varuse(pMMDeviceEnumerator) = 0 : _CloseDevice : return -1
newcom pMMDevice,IMMDevice,-1,0
newcom pAudioEndpointVolume,IAudioEndpointVolume,-1,0
newcom pAudioMeterInformation,IAudioMeterInformation,-1,0
Enumerator_GetDefaultAudioEndpoint pMMDeviceEnumerator,ERender,Console,pMMDevice
if varuse(pMMDevice) = 0 : _CloseDevice : return -2
guid = 0x5CDF2C82 , 0x4546841E , 0xF70C2297 , 0x9A227840
Device_Activate pMMDevice,guid,1,0,pAudioEndpointVolume
if varuse(pAudioEndpointVolume) = 0 : _CloseDevice : return -3
guid = 0xC02216F6, 0x4B5B8C67, 0x08D0009D, 0x64003EE7
Device_Activate pMMDevice,guid,1,0,pAudioMeterInformation
if varuse(pAudioMeterInformation) = 0 : _CloseDevice : return -4
return 0
#deffunc _CloseDevice
if vartype(pAudioMeterInformation) = 6{
if varuse(pAudioMeterInformation) != 0{
delcom pAudioMeterInformation
}
}
if vartype(pAudioEndpointVolume) = 6{
if varuse(pAudioEndpointVolume) != 0{
delcom pAudioEndpointVolume
}
}
if vartype(pMMDevice) = 6{
if varuse(pMMDevice) != 0{
delcom pMMDevice
}
}
if vartype(pMMDeviceEnumerator) = 6{
if varuse(pMMDeviceEnumerator) != 0{
delcom pMMDeviceEnumerator
}
}
return
#deffunc SetMasterVolumeVista int vol
_OpenDevice
if stat<0 : return stat
uuid = 0,0,0,0
Volume_SetMasterVolumeLevelScalar pAudioEndpointVolume,1.0f*(double(vol)/100.0f),uuid
_CloseDevice
return
#defcfunc GetMasterVolumeVista
_OpenDevice
if stat<0 : return stat
vol = 0
Volume_GetMasterVolumeLevelScalar pAudioEndpointVolume,vol
_CloseDevice
return int(todouble(vol)*100.0f)
#deffunc SetMuteVista int flag
_OpenDevice
if stat<0 : return stat
Volume_SetMute pAudioEndpointVolume,flag,0
_CloseDevice
return
#defcfunc GetMuteVista
_OpenDevice
if stat<0 : return stat
res = 0
Volume_GetMute pAudioEndpointVolume,res
_CloseDevice
return res
#defcfunc GetPeakValueVista
_OpenDevice
if stat<0 : return stat
res = 0
MeterInformation_GetPeakValue pAudioMeterInformation, res
_CloseDevice
return todouble(res)
#defcfunc GetChannelsPeakValuesVista int ch
_OpenDevice
if stat<0 : return stat
res = 0
MeterInformation_GetChannelsPeakValues pAudioMeterInformation, ch, res
_CloseDevice
return todouble(res)
#defcfunc GetMeteringChannelCountVista
_OpenDevice
if stat<0 : return stat
res = 0
MeterInformation_GetMeteringChannelCount pAudioMeterInformation, res
_CloseDevice
return res
#global
width 120,400
repeat
peak = GetPeakValueVista()
title "" + peak
color : boxf
/*
if peak<0.7{
color ,255
}else:if peak<0.9{
color 255,255
}else{
color 255
}
boxf 0, 400-peak*100*4, 120, 400
*/
if peak>0.9{
color 255
boxf 0, 400-limitf(peak,0.9,1.0)*100*4, 120, 400
}
if peak>0.7{
color 255,255
boxf 0, 400-limitf(peak,0.7,0.9)*100*4, 120, 400
}
if peak>0{
color ,255
boxf 0, 400-limitf(peak,0,0.7)*100*4, 120, 400
}
color 255,255,255
pos 0,0
mes ""+strf("%02.2f",peak*100)+"%"
redraw 1
wait 1
redraw 0
loop
stop
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX