Code: Select all
file1 := "C:\Windows\Media\Windows Feed Discovered.wav"
volume1 := 100
file2 := "C:\Windows\Media\Windows Information Bar.wav"
volume2 := 30
Loop 2
ExecScript(GetCode(file%A_Index%, volume%A_Index%))
GetCode(file, volume) {
code =
(
SetCurrentProcessVolume("%volume%")
SoundLoop("%file%")
Esc::ExitApp
SoundLoop(File := "") {
; http://msdn.microsoft.com/en-us/library/dd743680(v=vs.85).aspx
; SND_ASYNC 0x00000001 /* play asynchronously */
; SND_NODEFAULT 0x00000002 /* silence (!default) if sound not found */
; SND_LOOP 0x00000008 /* loop the sound until next sndPlaySound */
; SND_NOWAIT 0x00002000 /* don't wait if the driver is busy */
; SND_FILENAME 0x00020000 /* name is file name */
; --------------- 0x0002200B
Static AW := A_IsUnicode ? "W" : "A"
Return DllCall("Winmm.dll\PlaySound" . AW, "Ptr", File = "" ? 0 : &File, "Ptr", 0, "UInt", 0x0002200B)
}
SetCurrentProcessVolume(volume) ; volume can be number 0 — 100 or "mute" or "unmute"
{
static MMDeviceEnumerator := "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
, IID_IMMDeviceEnumerator := "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
, IID_IAudioClient := "{1cb9ad4c-dbfa-4c32-b178-c2f568a703b2}"
, IID_ISimpleAudioVolume := "{87ce5498-68d6-44e5-9215-6da47ef883d8}"
, eRender := 0, eMultimedia := 1, CLSCTX_ALL := 0x17
, _ := OnExit( Func("SetCurrentProcessVolume").Bind(100) )
IMMDeviceEnumerator := ComObjCreate(MMDeviceEnumerator, IID_IMMDeviceEnumerator)
; IMMDeviceEnumerator::GetDefaultAudioEndpoint
DllCall(NumGet(NumGet(IMMDeviceEnumerator + 0) + A_PtrSize*4), "Ptr", IMMDeviceEnumerator, "UInt", eRender, "UInt", eMultimedia, "PtrP", IMMDevice)
ObjRelease(IMMDeviceEnumerator)
VarSetCapacity(GUID, 16)
DllCall("Ole32\CLSIDFromString", "Str", IID_IAudioClient, "Ptr", &GUID)
; IMMDevice::Activate
DllCall(NumGet(NumGet(IMMDevice + 0) + A_PtrSize*3), "Ptr", IMMDevice, "Ptr", &GUID, "UInt", CLSCTX_ALL, "Ptr", 0, "PtrP", IAudioClient)
ObjRelease(IMMDevice)
; IAudioClient::GetMixFormat
DllCall(NumGet(NumGet(IAudioClient + 0) + A_PtrSize*8), "Ptr", IAudioClient, "UIntP", pFormat)
; IAudioClient::Initialize
DllCall(NumGet(NumGet(IAudioClient + 0) + A_PtrSize*3), "Ptr", IAudioClient, "UInt", 0, "UInt", 0, "UInt64", 0, "UInt64", 0, "Ptr", pFormat, "Ptr", 0)
DllCall("Ole32\CLSIDFromString", "Str", IID_ISimpleAudioVolume, "Ptr", &GUID)
; IAudioClient::GetService
DllCall(NumGet(NumGet(IAudioClient + 0) + A_PtrSize*14), "Ptr", IAudioClient, "Ptr", &GUID, "PtrP", ISimpleAudioVolume)
ObjRelease(IAudioClient)
if (volume + 0 != "")
; ISimpleAudioVolume::SetMasterVolume
DllCall(NumGet(NumGet(ISimpleAudioVolume + 0) + A_PtrSize*3), "Ptr", ISimpleAudioVolume, "Float", volume/100, "Ptr", 0)
else
; ISimpleAudioVolume::SetMute
DllCall(NumGet(NumGet(ISimpleAudioVolume + 0) + A_PtrSize*5), "Ptr", ISimpleAudioVolume, "UInt", volume = "mute" ? true : false, "Ptr", 0)
ObjRelease(ISimpleAudioVolume)
}
)
Return code
}
ExecScript(script, exePath := "") {
(!exePath && exePath := A_AhkPath)
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(exePath . " *")
exec.StdIn.Write(script)
exec.StdIn.Close()
return exec.ProcessID
}