Что нового

Реакция на звук

blacklis

Новичок
Сообщения
64
Репутация
1
Имеем флеш-приложение.(вконтактик)
Оно при некоторых условиях издаёт звук. Как сделать, чтобы скрипт реагировал на него, без внедрения в приложение?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
blacklis
Звук только от этого приложения?
От других программ могут быть звуки?
 
Автор
B

blacklis

Новичок
Сообщения
64
Репутация
1
Могут.

Но если есть вариант, когда не могут, я бы хотел его увидеть :smile:
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Открыть устройство(микшер в нашем случае) WaveOutOpen с кодеком PCM.
Собственно теперь событие WIM_DATA будет указывать, что начинает проигрываться звук.

http://www.autoitscript.com/forum/topic/21584-playing-with-mixer-device/?p=149390#entry149390

Тут практически все готово.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
blacklis

Вот пример с оф форума(Win 7):
Код:
#include <GuiConstants.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}"
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}"
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}"

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



While _LevelMeter() = 0
	Sleep(100)
WEnd


MsgBox(0, 'Заголовок', 'Звук')

Func _LevelMeter()
	Local $iPeak
	If $oAudioMeterInformation.GetPeakValue($iPeak) = 0 Then
		$audiovolume = Round(100 * $iPeak, 1)
		Return $audiovolume
	EndIf
EndFunc   ;==>_LevelMeter

Func _AudioVolObject()
	Local $oMMDeviceEnumerator = ObjCreateInterface($sCLSID_MMDeviceEnumerator, $sIID_IMMDeviceEnumerator, $tagIMMDeviceEnumerator)
	If @error Then Return SetError(1, 0, 0)
	Local Const $eRender = 0
	Local Const $eConsole = 0
	Local $pDefaultDevice
	$oMMDeviceEnumerator.GetDefaultAudioEndpoint($eRender, $eConsole, $pDefaultDevice)
	If Not $pDefaultDevice Then Return SetError(2, 0, 0)
	Local $oDefaultDevice = ObjCreateInterface($pDefaultDevice, $sIID_IMMDevice, $tagIMMDevice)
	Local Const $CLSCTX_INPROC_SERVER = 0x1
	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   ;==>_AudioVolObject

Это относительно простой вариант, и срабатывать будет от любого источника звука.
Если же нужно отделить один сигнал от другого, то сначала необходимо получить характеристики полезного сигнала
 
Автор
B

blacklis

Новичок
Сообщения
64
Репутация
1
WSWR
Попробую разобраться, спасибо
А под любую винду есть что-нибудь?
А что в этой функции вообще показывает уровень звука?
Разобрался, показывает LevelMeter


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

А как можно в настройках мишкера изменять уровень громкости приложений прямо из скрипта?
image.png

я про этот микшер х)
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
blacklis
А как можно в настройках мишкера изменять уровень громкости приложений прямо из скрипта?
Есть маленькая прога - nircmd, она такое может через командную строку
 
Автор
B

blacklis

Новичок
Сообщения
64
Репутация
1
Спасибо, как я понял, в скрипте нужно добавить запуск этой программки с нужными параметрами?
А как изменить звук именно нужного приложения?
nircmd.exe setsysvolume 65535 изменяет только общий звук(динамики)
И можно ли сделать работоспособность этого скрипта на вин хп?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
blacklis

Если nircmd.exe в то же папке, что и скрипт, тогда:
Код:
$iVolume = 0.5
$sProcess = 'wmplayer.exe'
ShellExecute('nircmd.exe', 'setappvolume ' & $sProcess & ' ' & $iVolume, @ScriptDir)


На XP отследить звук, скорее всего, можно - надо смотреть по ссылке, которую дал firex, есть, возможно есть и другие варианты.
А вот регулировать громкость конкретного процесса можно только начиная с Висты.
 
Верх