Что нового

Как скриптом среагировать на определенный звук

radioamator16

Новичок
Сообщения
39
Репутация
0
Здравствуйте.

Посоветуйте - как заставить скрипт autoit среагировать - на звучание на компьютере определенной мелодии длинной 2 секунды (не голоса а мелодии) ?
Это файл C:\Windows\Media\tada.wav
(при условии конечно, что нет звуков больше ни от каких других процессов)

Но скрипту нужно среагировать не на запуск этого файла или появление окна с таким названием, или процесса с таким адресом - а именно - на этот звук.
Как это можно сделать при помощи autoit ?

(То есть видимо этот звук должен храниться где-то в памяти, а скрипт должен постоянно висеть в трее - чтобы не пропустить этот звук)
 

Torotin

Новичок
Сообщения
10
Репутация
2
Честно говоря, с такими задачами не встречался...
Может эта ссылка Вам поможет?
https://www.autoitscript.com/forum/topic/178191-sound-playing-detection/

Отправлено с моего SM-N950F через Tapatalk
 
Автор
R

radioamator16

Новичок
Сообщения
39
Репутация
0
Torotin , так я же не об этом спрашивал.
В вашей ссылке - рассматривается определение - издает ли звуковая карта какие-либо звуки или не издает.

Я же спрашивал о том - как скриптом autoit - среагировать на определенный звук.


Добавлено:
Сообщение автоматически объединено:

Torotin, вот этот скрипт - реагирует просто на наличие звука.
А как его заставить реагировать на конкретный звук tada.wav ?
Код:
#include <GuiConstants.au3>
#include <ProgressConstants.au3>
Global Const $S_OK = 0
;===============================================================================
#interface "IMMDeviceEnumerator"
Global Const $sCLSID_MMDeviceEnumerator = "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
Global Const $sIID_IMMDeviceEnumerator = "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
; Definition
Global Const $tagIMMDeviceEnumerator = "EnumAudioEndpoints hresult(dword;dword;ptr*);" & _
     "GetDefaultAudioEndpoint hresult(dword;dword;ptr*);" & _
     "GetDevice hresult(wstr;ptr*);" & _
     "RegisterEndpointNotificationCallback hresult(ptr);" & _
     "UnregisterEndpointNotificationCallback hresult(ptr);"
;===============================================================================
;===============================================================================
#interface "IMMDevice"
Global Const $sIID_IMMDevice = "{D666063F-1587-4E43-81F1-B948E807363F}"
; Definition
Global Const $tagIMMDevice = "Activate hresult(clsid;dword;variant*;ptr*);" & _
     "OpenPropertyStore hresult(dword;ptr*);" & _
     "GetId hresult(ptr*);" & _
     "GetState hresult(dword*);"
;===============================================================================
;===============================================================================
#interface "IAudioMeterInformation"
Global Const $sIID_IAudioMeterInformation = "{C02216F6-8C67-4B5B-9D00-D008E73E0064}"
; Definition
Global Const $tagIAudioMeterInformation = "GetPeakValue hresult(float*);" & _
     "GetMeteringChannelCount hresult(dword*);" & _
     "GetChannelsPeakValues hresult(dword;float*);" & _
     "QueryHardwareSupport hresult(dword*);"
;===============================================================================

Global $oAudioMeterInformation = _AudioVolObject()
If Not IsObj($oAudioMeterInformation) Then Exit -1 ; Will happen on non-supported systems
Global $hGUI
Global $hControl = _MakePeakMeterInWindow($hGUI)
; Register function to periodically update the progress control
AdlibRegister("_LevelMeter", 45)

GUISetState()
While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd
AdlibUnRegister()
; Bye, bye...

Func _MakePeakMeterInWindow($hWindow)
$hWindow = GUICreate("ABC", 150, 400)
Return GUICtrlCreateProgress(20, 70, 15, 200, $PBS_VERTICAL)
EndFunc
Func _LevelMeter()
Local $iPeak
If $oAudioMeterInformation.GetPeakValue($iPeak) = $S_OK Then
     $iCurrentRead = 100 * $iPeak
     GUICtrlSetData($hControl, $iCurrentRead + 1)
     GUICtrlSetData($hControl, $iCurrentRead)
EndIf
EndFunc
Func _AudioVolObject()
; Sequences of code below are taken from the source of plugin written for AutoIt for setting master volume on Vista and above systems.
; Code was written by wraithdu in C++.
; MMDeviceEnumerator
Local $oMMDeviceEnumerator = ObjCreateInterface($sCLSID_MMDeviceEnumerator, $sIID_IMMDeviceEnumerator, $tagIMMDeviceEnumerator)
If @error Then Return SetError(1, 0, 0)
Local Const $eRender = 0
Local Const $eConsole = 0
; DefaultAudioEndpoint
Local $pDefaultDevice
$oMMDeviceEnumerator.GetDefaultAudioEndpoint($eRender, $eConsole, $pDefaultDevice)
If Not $pDefaultDevice Then Return SetError(2, 0, 0)
; Turn that pointer into object
Local $oDefaultDevice = ObjCreateInterface($pDefaultDevice, $sIID_IMMDevice, $tagIMMDevice)
Local Const $CLSCTX_INPROC_SERVER = 0x1
; AudioMeterInformation
Local $pAudioMeterInformation
$oDefaultDevice.Activate($sIID_IAudioMeterInformation, $CLSCTX_INPROC_SERVER, 0, $pAudioMeterInformation)
If Not $pAudioMeterInformation Then Return SetError(3, 0, 0)
Return ObjCreateInterface($pAudioMeterInformation, $sIID_IAudioMeterInformation, $tagIAudioMeterInformation)
EndFunc
 
Верх