Sound detection Topic is solved
Sound detection
Can AHK detect while sound is playing? Music from game
Re: Sound detection
It is possible but I only know how to get the volume.
Code: Select all
#SingleInstance force
DetectHiddenWindows On
BackgroundColor := "C6D43C"
Gui, 1:New, +AlwaysOnTop +ToolWindow -Caption +LastFound +0x800000 +E0x00000020, Volumn
Gui, Margin, 0, 0
Gui, Color, %BackgroundColor%
;Gui, Add, Progress, w20 h300 cBlue Background%BackgroundColor% vVolumn Vertical
Gui, Add, Picture, x0 y0 w20 h300, Small Gradient.png
Gui, Add, Picture, x0 y0 w20 h300 vVolumn Background%BackgroundColor%
WinSet, TransColor, %BackgroundColor%
Gui, Show, Hide AutoSize NoActivate
WinGetPos, x, y, w, h, Volumn
SysGet, sys, MonitorWorkArea
Gui, Show, % "x" sysRight - w " y" sysBottom - h " NoActivate"
OnMessage("0x200", "WM_MOUSEMOVE") ; Makes the window be moved
toggle := True
IAEV := VA_GetAudioMeter()
vol := 0.0
Loop {
mastervol := 1 + (VA_GetMasterVolume(1) / 50)
VA_IAudioMeterInformation_GetPeakValue(IAEV, vol)
GuiControl, Move, Volumn, % "h" (1 - vol*mastervol) * 300
Sleep, 50
}
WM_MOUSEMOVE(wparam, lparam, msg, hwnd){
;ToolTip, % msg
if(wparam = 1){ ; LButton
PostMessage, 0xA1, 2,,, A ; WM_NCLBUTTONDOWN
}
}
#m::Gui, % ((toggle := !toggle) ? "+" : "-") "E0x00000020"
#Include VA.ahk
Please excuse my spelling I am dyslexic.
- KuroiLight
- Posts: 327
- Joined: 12 Apr 2015, 20:24
- Contact:
Re: Sound detection
This is a cut down version of VA, strictly for detecting master audio level.
use example:
Code: Select all
;This file is credited to Lexikos, I merely cut it down to the minimum I needed.
#Warn, All, Off
VA_GetAudioMeter(device_desc="playback")
{
if ! device := VA_GetDevice(device_desc)
return 0
VA_IMMDevice_Activate(device, "{C02216F6-8C67-4B5B-9D00-D008E73E0064}", 7, 0, audioMeter)
ObjRelease(device)
return audioMeter
}
VA_GetDevice(device_desc="playback")
{
static CLSID_MMDeviceEnumerator := "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
, IID_IMMDeviceEnumerator := "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
if !(deviceEnumerator := ComObjCreate(CLSID_MMDeviceEnumerator, IID_IMMDeviceEnumerator))
return 0
device := 0
if VA_IMMDeviceEnumerator_GetDevice(deviceEnumerator, device_desc, device) = 0
goto VA_GetDevice_Return
if device_desc is integer
{
m2 := device_desc
if m2 >= 4096 ; Probably a device pointer, passed here indirectly via VA_GetAudioMeter or such.
{
ObjAddRef(device := m2)
goto VA_GetDevice_Return
}
}
else
RegExMatch(device_desc, "(.*?)\s*(?::(\d+))?$", m)
if m1 in playback,p
m1 := "", flow := 0 ; eRender
else if m1 in capture,c
m1 := "", flow := 1 ; eCapture
else if (m1 . m2) = "" ; no name or number specified
m1 := "", flow := 0 ; eRender (default)
else
flow := 2 ; eAll
if (m1 . m2) = "" ; no name or number (maybe "playback" or "capture")
{
VA_IMMDeviceEnumerator_GetDefaultAudioEndpoint(deviceEnumerator, flow, 0, device)
goto VA_GetDevice_Return
}
VA_IMMDeviceEnumerator_EnumAudioEndpoints(deviceEnumerator, flow, 1, devices)
if m1 =
{
VA_IMMDeviceCollection_Item(devices, m2-1, device)
goto VA_GetDevice_Return
}
VA_IMMDeviceCollection_GetCount(devices, count)
index := 0
Loop % count
if VA_IMMDeviceCollection_Item(devices, A_Index-1, device) = 0
if InStr(VA_GetDeviceName(device), m1) && (m2 = "" || ++index = m2)
goto VA_GetDevice_Return
else
ObjRelease(device), device:=0
VA_GetDevice_Return:
ObjRelease(deviceEnumerator)
if (devices)
ObjRelease(devices)
return device ; may be 0
}
VA_GetDeviceName(device)
{
static PKEY_Device_FriendlyName
if !VarSetCapacity(PKEY_Device_FriendlyName)
VarSetCapacity(PKEY_Device_FriendlyName, 20)
,VA_GUID(PKEY_Device_FriendlyName :="{A45C254E-DF1C-4EFD-8020-67D146A850E0}")
,NumPut(14, PKEY_Device_FriendlyName, 16)
VarSetCapacity(prop, 16)
VA_IMMDevice_OpenPropertyStore(device, 0, store)
; store->GetValue(.., [out] prop)
DllCall(NumGet(NumGet(store+0)+5*A_PtrSize), "ptr", store, "ptr", &PKEY_Device_FriendlyName, "ptr", &prop)
ObjRelease(store)
VA_WStrOut(deviceName := NumGet(prop,8))
return deviceName
}
VA_WStrOut(ByRef str) {
str := StrGet(ptr := str, "UTF-16")
DllCall("ole32\CoTaskMemFree", "ptr", ptr) ; FREES THE STRING.
}
VA_GUID(ByRef guid_out, guid_in="%guid_out%") {
if (guid_in == "%guid_out%")
guid_in := guid_out
if guid_in is integer
return guid_in
VarSetCapacity(guid_out, 16, 0)
DllCall("ole32\CLSIDFromString", "wstr", guid_in, "ptr", &guid_out)
return &guid_out
}
VA_IMMDevice_OpenPropertyStore(this, Access, ByRef Properties) {
return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "uint", Access, "ptr*", Properties)
}
VA_IMMDevice_Activate(this, iid, ClsCtx, ActivationParams, ByRef Interface) {
return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "ptr", VA_GUID(iid), "uint", ClsCtx, "uint", ActivationParams, "ptr*", Interface)
}
VA_IMMDeviceEnumerator_GetDevice(this, id, ByRef Device) {
return DllCall(NumGet(NumGet(this+0)+5*A_PtrSize), "ptr", this, "wstr", id, "ptr*", Device)
}
VA_IMMDeviceEnumerator_GetDefaultAudioEndpoint(this, DataFlow, Role, ByRef Endpoint) {
return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "int", DataFlow, "int", Role, "ptr*", Endpoint)
}
VA_IMMDeviceEnumerator_EnumAudioEndpoints(this, DataFlow, StateMask, ByRef Devices) {
return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "int", DataFlow, "uint", StateMask, "ptr*", Devices)
}
VA_IMMDeviceCollection_GetCount(this, ByRef Count) {
return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "uint*", Count)
}
VA_IMMDeviceCollection_Item(this, Index, ByRef Device) {
return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "uint", Index, "ptr*", Device)
}
VA_IAudioMeterInformation_GetPeakValue(this, ByRef Peak) {
return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "float*", Peak)
}
Code: Select all
IsAudioPlaying() {
AudioLevel := 0.0
VA_IAudioMeterInformation_GetPeakValue(VA_GetAudioMeter(), AudioLevel)
return (Round(AudioLevel, 4) > 0)
}
Windows 10, Ryzen 1600, 16GB G.Skill DDR4, 8GB RX 480 | [MyScripts][MySublimeSettings] [Unlicense][MIT License]
01/24/18
[/color]Re: Sound detection
Thank you both.. So how can I have message pop up when sound is detected?
- KuroiLight
- Posts: 327
- Joined: 12 Apr 2015, 20:24
- Contact:
Re: Sound detection
If your on Windows 10 use this for tray popups.
otherwise: TrayTip
as for your question, just check periodically for sound using the code I post previously.
Code: Select all
AsyncTipPopup(txt, win := 0, timeout := 1500) {
static this_pid := DllCall("GetCurrentProcessId")
if(win)
WinGetPos, tX, tY, tW, tH, ahk_id %win%
else
WinGetPos, tX, tY, tW, tH, ahk_class Shell_TrayWnd
ToolTip, %txt%, 0, 0, 4
WinGet, tt_id, ID, ahk_class tooltips_class32 ahk_pid %this_pid%
WinGetPos,,, ttW, ttH, ahk_id %tt_id%
if(win) {
newTTX := (tX + tW - ttW) - 8
newTTY := (tY + tH - ttH) + 17
} else {
newTTX := (tX + tW) - ttW
newTTY := (tY - ttH)
}
WinMove, ahk_id %tt_id%,, %newTTX%, %newTTY%
if(timeout != -1)
SetTimer, timeout, % (-1 * timeout)
return
timeout:
SetTimer,, Delete
ToolTip,,,, 4
return
}
as for your question, just check periodically for sound using the code I post previously.
Windows 10, Ryzen 1600, 16GB G.Skill DDR4, 8GB RX 480 | [MyScripts][MySublimeSettings] [Unlicense][MIT License]
01/24/18
[/color]Re: Sound detection
Sorry but I don't really know how exactly to do it.. I'm on windows 7,so what would be the code to get msgbox when sound is detected?
- KuroiLight
- Posts: 327
- Joined: 12 Apr 2015, 20:24
- Contact:
Re: Sound detection Topic is solved
Code: Select all
#Warn, All, Off
Loop {
While(!IsAudioPlaying())
Sleep, 1000
MsgBox, % "Sound Detected"
;or
TrayTip,, % "Sound Detected", 1
}
return
IsAudioPlaying() {
AudioLevel := 0.0
VA_IAudioMeterInformation_GetPeakValue(VA_GetAudioMeter(), AudioLevel)
return (Round(AudioLevel, 4) > 0)
}
;---------------------------------------------------------
;VA code credited to Lexikos, I merely cut it down to the minimum I needed.
VA_GetAudioMeter(device_desc="playback")
{
if ! device := VA_GetDevice(device_desc)
return 0
VA_IMMDevice_Activate(device, "{C02216F6-8C67-4B5B-9D00-D008E73E0064}", 7, 0, audioMeter)
ObjRelease(device)
return audioMeter
}
VA_GetDevice(device_desc="playback")
{
static CLSID_MMDeviceEnumerator := "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
, IID_IMMDeviceEnumerator := "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
if !(deviceEnumerator := ComObjCreate(CLSID_MMDeviceEnumerator, IID_IMMDeviceEnumerator))
return 0
device := 0
if VA_IMMDeviceEnumerator_GetDevice(deviceEnumerator, device_desc, device) = 0
goto VA_GetDevice_Return
if device_desc is integer
{
m2 := device_desc
if m2 >= 4096 ; Probably a device pointer, passed here indirectly via VA_GetAudioMeter or such.
{
ObjAddRef(device := m2)
goto VA_GetDevice_Return
}
}
else
RegExMatch(device_desc, "(.*?)\s*(?::(\d+))?$", m)
if m1 in playback,p
m1 := "", flow := 0 ; eRender
else if m1 in capture,c
m1 := "", flow := 1 ; eCapture
else if (m1 . m2) = "" ; no name or number specified
m1 := "", flow := 0 ; eRender (default)
else
flow := 2 ; eAll
if (m1 . m2) = "" ; no name or number (maybe "playback" or "capture")
{
VA_IMMDeviceEnumerator_GetDefaultAudioEndpoint(deviceEnumerator, flow, 0, device)
goto VA_GetDevice_Return
}
VA_IMMDeviceEnumerator_EnumAudioEndpoints(deviceEnumerator, flow, 1, devices)
if m1 =
{
VA_IMMDeviceCollection_Item(devices, m2-1, device)
goto VA_GetDevice_Return
}
VA_IMMDeviceCollection_GetCount(devices, count)
index := 0
Loop % count
if VA_IMMDeviceCollection_Item(devices, A_Index-1, device) = 0
if InStr(VA_GetDeviceName(device), m1) && (m2 = "" || ++index = m2)
goto VA_GetDevice_Return
else
ObjRelease(device), device:=0
VA_GetDevice_Return:
ObjRelease(deviceEnumerator)
if (devices)
ObjRelease(devices)
return device ; may be 0
}
VA_GetDeviceName(device)
{
static PKEY_Device_FriendlyName
if !VarSetCapacity(PKEY_Device_FriendlyName)
VarSetCapacity(PKEY_Device_FriendlyName, 20)
,VA_GUID(PKEY_Device_FriendlyName :="{A45C254E-DF1C-4EFD-8020-67D146A850E0}")
,NumPut(14, PKEY_Device_FriendlyName, 16)
VarSetCapacity(prop, 16)
VA_IMMDevice_OpenPropertyStore(device, 0, store)
; store->GetValue(.., [out] prop)
DllCall(NumGet(NumGet(store+0)+5*A_PtrSize), "ptr", store, "ptr", &PKEY_Device_FriendlyName, "ptr", &prop)
ObjRelease(store)
VA_WStrOut(deviceName := NumGet(prop,8))
return deviceName
}
VA_WStrOut(ByRef str) {
str := StrGet(ptr := str, "UTF-16")
DllCall("ole32\CoTaskMemFree", "ptr", ptr) ; FREES THE STRING.
}
VA_GUID(ByRef guid_out, guid_in="%guid_out%") {
if (guid_in == "%guid_out%")
guid_in := guid_out
if guid_in is integer
return guid_in
VarSetCapacity(guid_out, 16, 0)
DllCall("ole32\CLSIDFromString", "wstr", guid_in, "ptr", &guid_out)
return &guid_out
}
VA_IMMDevice_OpenPropertyStore(this, Access, ByRef Properties) {
return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "uint", Access, "ptr*", Properties)
}
VA_IMMDevice_Activate(this, iid, ClsCtx, ActivationParams, ByRef Interface) {
return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "ptr", VA_GUID(iid), "uint", ClsCtx, "uint", ActivationParams, "ptr*", Interface)
}
VA_IMMDeviceEnumerator_GetDevice(this, id, ByRef Device) {
return DllCall(NumGet(NumGet(this+0)+5*A_PtrSize), "ptr", this, "wstr", id, "ptr*", Device)
}
VA_IMMDeviceEnumerator_GetDefaultAudioEndpoint(this, DataFlow, Role, ByRef Endpoint) {
return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "int", DataFlow, "int", Role, "ptr*", Endpoint)
}
VA_IMMDeviceEnumerator_EnumAudioEndpoints(this, DataFlow, StateMask, ByRef Devices) {
return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "int", DataFlow, "uint", StateMask, "ptr*", Devices)
}
VA_IMMDeviceCollection_GetCount(this, ByRef Count) {
return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "uint*", Count)
}
VA_IMMDeviceCollection_Item(this, Index, ByRef Device) {
return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "uint", Index, "ptr*", Device)
}
VA_IAudioMeterInformation_GetPeakValue(this, ByRef Peak) {
return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "float*", Peak)
}
Windows 10, Ryzen 1600, 16GB G.Skill DDR4, 8GB RX 480 | [MyScripts][MySublimeSettings] [Unlicense][MIT License]
01/24/18
[/color]Re: Sound detection
on windows 10 if you comment out the msgbox and just leave the traytip it crashes
KuroiLight wrote:Code: Select all
#Warn, All, Off Loop { While(!IsAudioPlaying()) Sleep, 1000 MsgBox, % "Sound Detected" ;or TrayTip,, % "Sound Detected", 1 } return IsAudioPlaying() { AudioLevel := 0.0 VA_IAudioMeterInformation_GetPeakValue(VA_GetAudioMeter(), AudioLevel) return (Round(AudioLevel, 4) > 0) } ;--------------------------------------------------------- ;VA code credited to Lexikos, I merely cut it down to the minimum I needed. VA_GetAudioMeter(device_desc="playback") { if ! device := VA_GetDevice(device_desc) return 0 VA_IMMDevice_Activate(device, "{C02216F6-8C67-4B5B-9D00-D008E73E0064}", 7, 0, audioMeter) ObjRelease(device) return audioMeter } VA_GetDevice(device_desc="playback") { static CLSID_MMDeviceEnumerator := "{BCDE0395-E52F-467C-8E3D-C4579291692E}" , IID_IMMDeviceEnumerator := "{A95664D2-9614-4F35-A746-DE8DB63617E6}" if !(deviceEnumerator := ComObjCreate(CLSID_MMDeviceEnumerator, IID_IMMDeviceEnumerator)) return 0 device := 0 if VA_IMMDeviceEnumerator_GetDevice(deviceEnumerator, device_desc, device) = 0 goto VA_GetDevice_Return if device_desc is integer { m2 := device_desc if m2 >= 4096 ; Probably a device pointer, passed here indirectly via VA_GetAudioMeter or such. { ObjAddRef(device := m2) goto VA_GetDevice_Return } } else RegExMatch(device_desc, "(.*?)\s*(?::(\d+))?$", m) if m1 in playback,p m1 := "", flow := 0 ; eRender else if m1 in capture,c m1 := "", flow := 1 ; eCapture else if (m1 . m2) = "" ; no name or number specified m1 := "", flow := 0 ; eRender (default) else flow := 2 ; eAll if (m1 . m2) = "" ; no name or number (maybe "playback" or "capture") { VA_IMMDeviceEnumerator_GetDefaultAudioEndpoint(deviceEnumerator, flow, 0, device) goto VA_GetDevice_Return } VA_IMMDeviceEnumerator_EnumAudioEndpoints(deviceEnumerator, flow, 1, devices) if m1 = { VA_IMMDeviceCollection_Item(devices, m2-1, device) goto VA_GetDevice_Return } VA_IMMDeviceCollection_GetCount(devices, count) index := 0 Loop % count if VA_IMMDeviceCollection_Item(devices, A_Index-1, device) = 0 if InStr(VA_GetDeviceName(device), m1) && (m2 = "" || ++index = m2) goto VA_GetDevice_Return else ObjRelease(device), device:=0 VA_GetDevice_Return: ObjRelease(deviceEnumerator) if (devices) ObjRelease(devices) return device ; may be 0 } VA_GetDeviceName(device) { static PKEY_Device_FriendlyName if !VarSetCapacity(PKEY_Device_FriendlyName) VarSetCapacity(PKEY_Device_FriendlyName, 20) ,VA_GUID(PKEY_Device_FriendlyName :="{A45C254E-DF1C-4EFD-8020-67D146A850E0}") ,NumPut(14, PKEY_Device_FriendlyName, 16) VarSetCapacity(prop, 16) VA_IMMDevice_OpenPropertyStore(device, 0, store) ; store->GetValue(.., [out] prop) DllCall(NumGet(NumGet(store+0)+5*A_PtrSize), "ptr", store, "ptr", &PKEY_Device_FriendlyName, "ptr", &prop) ObjRelease(store) VA_WStrOut(deviceName := NumGet(prop,8)) return deviceName } VA_WStrOut(ByRef str) { str := StrGet(ptr := str, "UTF-16") DllCall("ole32\CoTaskMemFree", "ptr", ptr) ; FREES THE STRING. } VA_GUID(ByRef guid_out, guid_in="%guid_out%") { if (guid_in == "%guid_out%") guid_in := guid_out if guid_in is integer return guid_in VarSetCapacity(guid_out, 16, 0) DllCall("ole32\CLSIDFromString", "wstr", guid_in, "ptr", &guid_out) return &guid_out } VA_IMMDevice_OpenPropertyStore(this, Access, ByRef Properties) { return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "uint", Access, "ptr*", Properties) } VA_IMMDevice_Activate(this, iid, ClsCtx, ActivationParams, ByRef Interface) { return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "ptr", VA_GUID(iid), "uint", ClsCtx, "uint", ActivationParams, "ptr*", Interface) } VA_IMMDeviceEnumerator_GetDevice(this, id, ByRef Device) { return DllCall(NumGet(NumGet(this+0)+5*A_PtrSize), "ptr", this, "wstr", id, "ptr*", Device) } VA_IMMDeviceEnumerator_GetDefaultAudioEndpoint(this, DataFlow, Role, ByRef Endpoint) { return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "int", DataFlow, "int", Role, "ptr*", Endpoint) } VA_IMMDeviceEnumerator_EnumAudioEndpoints(this, DataFlow, StateMask, ByRef Devices) { return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "int", DataFlow, "uint", StateMask, "ptr*", Devices) } VA_IMMDeviceCollection_GetCount(this, ByRef Count) { return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "uint*", Count) } VA_IMMDeviceCollection_Item(this, Index, ByRef Device) { return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "uint", Index, "ptr*", Device) } VA_IAudioMeterInformation_GetPeakValue(this, ByRef Peak) { return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "float*", Peak) }
- KuroiLight
- Posts: 327
- Joined: 12 Apr 2015, 20:24
- Contact:
Re: Sound detection
does not for me.
might be for you because it gets spammed, thats why I use an alternative
might be for you because it gets spammed, thats why I use an alternative
Code: Select all
on windows 10, so I have more control over display time.
[code]
Loop {
While(!IsAudioPlaying())
Sleep, 2000
TrayTip,, % "Sound Detected", 1
While(IsAudioPlaying())
Sleep, 2000
}
Windows 10, Ryzen 1600, 16GB G.Skill DDR4, 8GB RX 480 | [MyScripts][MySublimeSettings] [Unlicense][MIT License]
01/24/18
[/color]Re: Sound detection
regardless thanks for the code, works the best of all methods i tried, incredible how many things have to be done to figure out soundKuroiLight wrote:does not for me.
might be for you because it gets spammed, thats why I use an alternativeCode: Select all
on windows 10, so I have more control over display time. [code] Loop { While(!IsAudioPlaying()) Sleep, 2000 TrayTip,, % "Sound Detected", 1 While(IsAudioPlaying()) Sleep, 2000 }
- KuroiLight
- Posts: 327
- Joined: 12 Apr 2015, 20:24
- Contact:
Re: Sound detection
Yeah, Microsoft made a lot of things a pain in the *** after windows xp.
Windows 10, Ryzen 1600, 16GB G.Skill DDR4, 8GB RX 480 | [MyScripts][MySublimeSettings] [Unlicense][MIT License]
01/24/18
[/color]Re: Sound detection
Woah it works Thank you very much!KuroiLight wrote:Code: Select all
#Warn, All, Off Loop { While(!IsAudioPlaying()) Sleep, 1000 MsgBox, % "Sound Detected" ;or TrayTip,, % "Sound Detected", 1 } return IsAudioPlaying() { AudioLevel := 0.0 VA_IAudioMeterInformation_GetPeakValue(VA_GetAudioMeter(), AudioLevel) return (Round(AudioLevel, 4) > 0) } ;--------------------------------------------------------- ;VA code credited to Lexikos, I merely cut it down to the minimum I needed. VA_GetAudioMeter(device_desc="playback") { if ! device := VA_GetDevice(device_desc) return 0 VA_IMMDevice_Activate(device, "{C02216F6-8C67-4B5B-9D00-D008E73E0064}", 7, 0, audioMeter) ObjRelease(device) return audioMeter } VA_GetDevice(device_desc="playback") { static CLSID_MMDeviceEnumerator := "{BCDE0395-E52F-467C-8E3D-C4579291692E}" , IID_IMMDeviceEnumerator := "{A95664D2-9614-4F35-A746-DE8DB63617E6}" if !(deviceEnumerator := ComObjCreate(CLSID_MMDeviceEnumerator, IID_IMMDeviceEnumerator)) return 0 device := 0 if VA_IMMDeviceEnumerator_GetDevice(deviceEnumerator, device_desc, device) = 0 goto VA_GetDevice_Return if device_desc is integer { m2 := device_desc if m2 >= 4096 ; Probably a device pointer, passed here indirectly via VA_GetAudioMeter or such. { ObjAddRef(device := m2) goto VA_GetDevice_Return } } else RegExMatch(device_desc, "(.*?)\s*(?::(\d+))?$", m) if m1 in playback,p m1 := "", flow := 0 ; eRender else if m1 in capture,c m1 := "", flow := 1 ; eCapture else if (m1 . m2) = "" ; no name or number specified m1 := "", flow := 0 ; eRender (default) else flow := 2 ; eAll if (m1 . m2) = "" ; no name or number (maybe "playback" or "capture") { VA_IMMDeviceEnumerator_GetDefaultAudioEndpoint(deviceEnumerator, flow, 0, device) goto VA_GetDevice_Return } VA_IMMDeviceEnumerator_EnumAudioEndpoints(deviceEnumerator, flow, 1, devices) if m1 = { VA_IMMDeviceCollection_Item(devices, m2-1, device) goto VA_GetDevice_Return } VA_IMMDeviceCollection_GetCount(devices, count) index := 0 Loop % count if VA_IMMDeviceCollection_Item(devices, A_Index-1, device) = 0 if InStr(VA_GetDeviceName(device), m1) && (m2 = "" || ++index = m2) goto VA_GetDevice_Return else ObjRelease(device), device:=0 VA_GetDevice_Return: ObjRelease(deviceEnumerator) if (devices) ObjRelease(devices) return device ; may be 0 } VA_GetDeviceName(device) { static PKEY_Device_FriendlyName if !VarSetCapacity(PKEY_Device_FriendlyName) VarSetCapacity(PKEY_Device_FriendlyName, 20) ,VA_GUID(PKEY_Device_FriendlyName :="{A45C254E-DF1C-4EFD-8020-67D146A850E0}") ,NumPut(14, PKEY_Device_FriendlyName, 16) VarSetCapacity(prop, 16) VA_IMMDevice_OpenPropertyStore(device, 0, store) ; store->GetValue(.., [out] prop) DllCall(NumGet(NumGet(store+0)+5*A_PtrSize), "ptr", store, "ptr", &PKEY_Device_FriendlyName, "ptr", &prop) ObjRelease(store) VA_WStrOut(deviceName := NumGet(prop,8)) return deviceName } VA_WStrOut(ByRef str) { str := StrGet(ptr := str, "UTF-16") DllCall("ole32\CoTaskMemFree", "ptr", ptr) ; FREES THE STRING. } VA_GUID(ByRef guid_out, guid_in="%guid_out%") { if (guid_in == "%guid_out%") guid_in := guid_out if guid_in is integer return guid_in VarSetCapacity(guid_out, 16, 0) DllCall("ole32\CLSIDFromString", "wstr", guid_in, "ptr", &guid_out) return &guid_out } VA_IMMDevice_OpenPropertyStore(this, Access, ByRef Properties) { return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "uint", Access, "ptr*", Properties) } VA_IMMDevice_Activate(this, iid, ClsCtx, ActivationParams, ByRef Interface) { return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "ptr", VA_GUID(iid), "uint", ClsCtx, "uint", ActivationParams, "ptr*", Interface) } VA_IMMDeviceEnumerator_GetDevice(this, id, ByRef Device) { return DllCall(NumGet(NumGet(this+0)+5*A_PtrSize), "ptr", this, "wstr", id, "ptr*", Device) } VA_IMMDeviceEnumerator_GetDefaultAudioEndpoint(this, DataFlow, Role, ByRef Endpoint) { return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "int", DataFlow, "int", Role, "ptr*", Endpoint) } VA_IMMDeviceEnumerator_EnumAudioEndpoints(this, DataFlow, StateMask, ByRef Devices) { return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "int", DataFlow, "uint", StateMask, "ptr*", Devices) } VA_IMMDeviceCollection_GetCount(this, ByRef Count) { return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "uint*", Count) } VA_IMMDeviceCollection_Item(this, Index, ByRef Device) { return DllCall(NumGet(NumGet(this+0)+4*A_PtrSize), "ptr", this, "uint", Index, "ptr*", Device) } VA_IAudioMeterInformation_GetPeakValue(this, ByRef Peak) { return DllCall(NumGet(NumGet(this+0)+3*A_PtrSize), "ptr", this, "float*", Peak) }
Re: Sound detection
I just stumbled on this thread, but I have been looking for a ahk vu meter for a year since my players randomly pause and I am physically unable to resume playing for lots of reasons.
I don't claim to be able to make out any of the above code beyond the basic ahk.
I am lost, there seem to be random numbers which could be the name of a random person's sound card.
The catch is that I have 6 virtual sound cards, and I need to know which sound card has sound. If 12 seconds of silence, I might be able to send keys to toggle the player back on, or apply the trigger to other applications.
I use a command in ffmpeg to figure out the name of the sound card, but I don't see yet where any such name is in the script. I will need to study it further.
Here are my sound cards. Maybe I plug one into the above vu meter codes? I currently need the level of the "CABLE-B Output (VB-Audio Cable B)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{274963DF-4DEF-4D99-8B4B-28D17345D7A4}"
: ffmpeg -list_devices true -f dshow -i dummy
ffmpeg version 2022-12-21-git-eef763c705-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 57. 43.100 / 57. 43.100
libavcodec 59. 55.103 / 59. 55.103
libavformat 59. 34.102 / 59. 34.102
libavdevice 59. 8.101 / 59. 8.101
libavfilter 8. 53.100 / 8. 53.100
libswscale 6. 8.112 / 6. 8.112
libswresample 4. 9.100 / 4. 9.100
libpostproc 56. 7.100 / 56. 7.100
[dshow @ 00000228cefb2fc0] "USB2.0 camera" (video)
[dshow @ 00000228cefb2fc0] Alternative name "@device_pnp_\\?\usb#vid_0edc&pid_5830&mi_00#7&18fab334&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 00000228cefb2fc0] "CABLE-A Output (VB-Audio Cable A)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{30049CCE-A228-41FC-BD56-FA4EE1DAFBE8}"
[dshow @ 00000228cefb2fc0] "Microphone (Realtek High Definition Audio)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{1564E591-5A14-44D5-A77F-A8E0D1FBF136}"
[dshow @ 00000228cefb2fc0] a
[dshow @ 00000228cefb2fc0] "CABLE-C Output (VB-Audio Cable C)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{80AA2B84-DF18-4035-AF8A-4665C1B4B66D}"
[dshow @ 00000228cefb2fc0] "Hi-Fi Cable Output (VB-Audio Hi-Fi Cable)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{E8396419-BD02-4E92-9CC3-19F865A271F3}"
[dshow @ 00000228cefb2fc0] "CABLE Output (VB-Audio Virtual Cable)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{F0E22526-E2CD-4A7B-B440-026FD15C5C1C}"
[dshow @ 00000228cefb2fc0] "CABLE-D Output (VB-Audio Cable D)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{F4248339-25A4-402B-A9AD-D013EB6C57A5}"
I don't claim to be able to make out any of the above code beyond the basic ahk.
I am lost, there seem to be random numbers which could be the name of a random person's sound card.
The catch is that I have 6 virtual sound cards, and I need to know which sound card has sound. If 12 seconds of silence, I might be able to send keys to toggle the player back on, or apply the trigger to other applications.
I use a command in ffmpeg to figure out the name of the sound card, but I don't see yet where any such name is in the script. I will need to study it further.
Here are my sound cards. Maybe I plug one into the above vu meter codes? I currently need the level of the "CABLE-B Output (VB-Audio Cable B)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{274963DF-4DEF-4D99-8B4B-28D17345D7A4}"
: ffmpeg -list_devices true -f dshow -i dummy
ffmpeg version 2022-12-21-git-eef763c705-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 57. 43.100 / 57. 43.100
libavcodec 59. 55.103 / 59. 55.103
libavformat 59. 34.102 / 59. 34.102
libavdevice 59. 8.101 / 59. 8.101
libavfilter 8. 53.100 / 8. 53.100
libswscale 6. 8.112 / 6. 8.112
libswresample 4. 9.100 / 4. 9.100
libpostproc 56. 7.100 / 56. 7.100
[dshow @ 00000228cefb2fc0] "USB2.0 camera" (video)
[dshow @ 00000228cefb2fc0] Alternative name "@device_pnp_\\?\usb#vid_0edc&pid_5830&mi_00#7&18fab334&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 00000228cefb2fc0] "CABLE-A Output (VB-Audio Cable A)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{30049CCE-A228-41FC-BD56-FA4EE1DAFBE8}"
[dshow @ 00000228cefb2fc0] "Microphone (Realtek High Definition Audio)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{1564E591-5A14-44D5-A77F-A8E0D1FBF136}"
[dshow @ 00000228cefb2fc0] a
[dshow @ 00000228cefb2fc0] "CABLE-C Output (VB-Audio Cable C)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{80AA2B84-DF18-4035-AF8A-4665C1B4B66D}"
[dshow @ 00000228cefb2fc0] "Hi-Fi Cable Output (VB-Audio Hi-Fi Cable)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{E8396419-BD02-4E92-9CC3-19F865A271F3}"
[dshow @ 00000228cefb2fc0] "CABLE Output (VB-Audio Virtual Cable)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{F0E22526-E2CD-4A7B-B440-026FD15C5C1C}"
[dshow @ 00000228cefb2fc0] "CABLE-D Output (VB-Audio Cable D)" (audio)
[dshow @ 00000228cefb2fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{F4248339-25A4-402B-A9AD-D013EB6C57A5}"
Who is online
Users browsing this forum: boydfields and 153 guests