1 (изменено: gryphonn, 2017-10-29 20:50:21)

Тема: AHK: Задержка при воспроизведении аудио

Всем привет!
Встала задача добавить к клавиатурным нажатиям аудио-сопровождение. Программа - клавиатурный тренажер. Соответственно клавиши могут нажиматься очень быстро. И нужно чтобы звук поспевал. Он же воспроизводится с лютой задержкой. Еще и пукает (обрывается).

Какие могут быть решения?

Архив во вложении с аудио-файлом и элементарным скриптом.
Запустите и быстро нажимайте F8.

Post's attachments

sound.zip 1.36 kb, 4 downloads since 2017-10-29 

You don't have the permssions to download the attachments of this post.

2 (изменено: teadrinker, 2017-10-29 21:33:18)

Re: AHK: Задержка при воспроизведении аудио

Смотрите мои сообщения в этой теме, какой-то из вариантов подойдёт. Начинайте с последних постов.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3 (изменено: stealzy, 2017-10-30 19:07:25)

Re: AHK: Задержка при воспроизведении аудио

Стандартный формат аудио в windows - wav, если запустить поиск аудио файлов в Program Files, большинство будет именно в этом формате.
На моей системе SoundPlay не воспроизводит mp3, как я понял по справке, из-за отсутствия кодека в ОС, хотя AIMP и DaumPot отлично играют mp3, видимо у них свои встроенные кодеки. Задержки на воспроизведение wav у меня нет, код ниже проигрывает прямо из переменной, но из файла играет также мгновенно, разница не заметна.

LaserWAV_Base64Data := "UklGRiUHAABXQVZFZm10IBAAAAABAAEAESsAABErAAABAAgAZGF0YQEHAAB0XYxpdIBpgF2AgHSMaYB0gICAgJd0dIyMjJd0dICAgJeMjJeAdICAjIyAgIBpgJeMdGmAgIB0dIB0gIBpdGmAgHR0aXR0jGldaXRdaWldjHSAgHRpdHSAjIB0l4yAdIyMjICAgKOMjGldaWldl4B0aWl0aYB0gHSMgIB0jKOAdICMdICAdIyXaWlpjIBdXXRpjHSMl3R0gJdpaXSMdF1pgGmAjFF0jF1pdHSMXWl0dICMaXSMl4Bpl6OAjHSAl1GMdIxpgIB0dJeAdJeAXWmMRl2MXV1po2ldrzp0jEaMdJdpjIxpjKNpl4BdgIBpgHRpuoB0jLp0gIxpjF2jUYyjOqNGgHRRo2mMaXSjRq9RrzqXUYxpjHRpo0a6UaN0r2mAo3SXUbo6oy+vL5ddaYBRaVGXRpdGjFGXaZdRr1GvXaNdl13GRrqMdICXaa9Rxl2MdHSXRoyMabpGul1plzrGOro6aaNGryOvXXSXaYxGgEavUVGvI8ZRaYxdul1dry+jdHSvF6+jI6OMRsZdaYxGjK9daaMvr4wvxrovr5dGxlF03UZ00TpRxjpd0V10xlF0o1GAly+M0TqAujqAr11pr110xl1dxmk6uoxRjKNpjLpdXa9dRqNpRqOMUYyMjLpdL6O6OjqvoyNGuoA6l68vOq+jOjqvr0Y6o6MjRsaXOnS6lyM6r5cjRq+jRkbGui8jurovI6PdXReA0YAjad26UUavxlEjo/SMF1HG0VEvgLqARoDRr0ZGr8ZpOozpoyMvl+mvUTp0o4BGRoyjaTp00ZcvL6Pply8jjNGXIyOAuoAjI4zdrzojadHGaS9Rr+mvRiOA6dFpFzqj0aNRL12Xl2kvOoy6gCMMUbrpr1EMOqPRo0YXRqPdr1EjXbrpxl0jOozd3ZdGL2nG6bpdFy+A3d2XLww6l93GdC86dK+6gC8XUaPGr10XL4DR3a90RkZ0l6OAXUZGaZejgF1GXWmMl4xpXXSMo5eMdFFRdKO6o2kvI1Gj0dGXUS86dLrRuoxdUXSvxqN0Ri9GgLrGo2k6I0aMxsaMRhcjXaPd3bp0OiMvaa/RxpddLy9Rl8bRr2kvIzppl7qvjF1GOlFpjK+jjGlRUWmMr6+jdFE6RnSv0dGjaTojL2mjxtGvgFEvOl2XxtGvjFEvL12Xxt26gEYXFzp0r8a6l2k6Iy9RjLrGr4xRIyM6aaPG0bqMUS8jRoCv3d26gFEvLzppjK+6o4BpUVFpjK+vo4xpUVFpjKO6uq+AXTo6UXSjxtGvgEYXDCNRgLrd3caXaTojL1F0o7q6r4xpOiMjOmmXusa6o3RRLy9GaZfG0dGvgFEvIy9GdKPG0dG6l2k6IyNGaZe60dGvjFEvIyM6aZe60dG6l2k6IyMvUYCv0dHGo3RGIxcjRnSjxt3RxqN0Ri8vOl2Ar8bRxqOAUSMXIzppjLrR0bqjgFEvIyM6UYCjxtHGr4xpRjo6Rl10o7rGxrqXdFE6OkZdgKO6xrqvl4BpUUZGUWmAo6+6r5eAXTovLzpRaYCXr7q6r5eAXVFGOkZRaYCXo6Ojl4B0UUY6LzpRaYyjusbGuqOMaVFGOjpRXYCXusbGuq+XdF1RRjpGUWmAl6Ojo5eMgHRdUVFRXWl0jJejr6+jjHRpUUZGRlFdgJevusa6uqOAaUY6Ly86UWmAo7rGxrqvl4BpUTovIy9GXXSMr7rRxrqvl4xpUS8jFyM6UWmMo7rGxsavo4x0XUY6OjpRXXSMo7rGxsa6r4x0UTovIyM6Rl1pjKOvusbGuqOMdFE6IyMjL0ZddIyjusbR0cavo4BpUTovLy9GXWmAl6+6xsbGuqOMdGlRRjo6OlFddIyjr8bRxrqjjHRdRi8jIyMvOlFpgJejusbGxrqjl4BpUUY6Ly8vOlFpgJejusbRxsa6o4yAaVE6Ly8vL0ZRaYCXr7rGxrq6r6OMgGldRjo6Ly86UV10jKOvusbGxrqjl4B0XVE6Ly8vOlFdaYCXo7q6xsbGuq+XjHRdUTovLy8vOkZdaYCXr7q6xsa6r6OXjHRpUUY6Ly8vOjpGXWmAl6Ovurq6r6+jl4B0XVFGOjo6RkZRXWl0jJejurq6urqvr6OXgHRdUUZGOkZGUV1pdICXo6+6urqvr6OXjIBpXVFGRjo6RkZRXWl0gIyjr7q6urqvr6OXjIBpXVE6OjovLzpGUVFddICMl6Ovurq6uq+vo5eAdGldRkY6Ly86OkZRXXSAjJejr7q6usa6r6OXl4B0aV1RRkY6Ojo6RlFdaXSAl6Ojr7rGurq6r6OXjIB0aV1RRjo6OkZGUVFdaYCMjJejr6+vr6+vo5eMgHRpXVFGRjo6OkZGUVFdaXSAjJejr6+6urq6uq+vo5eMgHRpXVFGRjo6Og=="
Base64Dec(LaserWAV_Base64Data, LaserWAV_Bin)
Gui S: +ToolWindow
Gui S: Add, Button, Default gPlaySoundLaserWAV w150 h50, Play
Gui S: Show
Return

PlaySoundLaserWAV:
	PlaySound(LaserWAV_Bin)
	Return
PlaySound(ByRef Sound) {
	static SND_MEMORY:=0x4, SND_NODEFAULT:=0x2, SND_ASYNC:=0x1
	Return DllCall("winmm.dll\PlaySound" (A_IsUnicode ? "W" : "A"), UInt, &Sound, UInt, 0, UInt, (SND_MEMORY|SND_NODEFAULT|SND_ASYNC))
}
Base64Dec(ByRef B64, ByRef Bin) { ; Base64 encoder/decoder for Binary data by SCAN
	static CRYPT_STRING_BASE64 := 0x1
	Rqd := 0, BLen := StrLen(B64)
	DllCall("Crypt32.dll\CryptStringToBinary", "Str", B64, "UInt", BLen, "UInt", CRYPT_STRING_BASE64, "UInt", 0, "UIntP", Rqd, "Int", 0, "Int", 0)
	VarSetCapacity(Bin, 128), VarSetCapacity(Bin, 0), VarSetCapacity(Bin, Rqd, 0)
	DllCall("Crypt32.dll\CryptStringToBinary", "Str", B64, "UInt", BLen, "UInt", CRYPT_STRING_BASE64, "Ptr", &Bin, "UIntP", Rqd, "Int", 0, "Int", 0)
	Return Rqd
}
SGuiEscape:
SGuiClose:
	ExitApp

4

Re: AHK: Задержка при воспроизведении аудио

stealzy, такой пример хорошо бы в Коллекцию.

5

Re: AHK: Задержка при воспроизведении аудио

ypppu, неа, это всего лишь комбинация двух известных приемов. Есть идея сделать форк Image2Include с поддержкой аудио и конвертацией в один клик, тогда и посмотрим.

6

Re: AHK: Задержка при воспроизведении аудио

stealzy, попробуйте так:

Space:: PlaySound(LaserWAV_Bin)

Нажмите пару раз подряд на пробел, сможете оценить качество такого подхода.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7

Re: AHK: Задержка при воспроизведении аудио

teadrinker, качество аналогично SoundPlay laser.wav, Wait.
Почему то мне казалось, что gryphonn говорил о задержке после запуска команды SoundPlay.
Согласен, что ни Wait, ни поведение SoundPlay без этого параметра (обрыв предыдущего звука) ни подходят. Сейчас поправлю.

8

Re: AHK: Задержка при воспроизведении аудио

gryphonn пишет:

Встала задача добавить к клавиатурным нажатиям аудио-сопровождение.

Я думаю, что SoundPlay здесь не очень подходит в принципе, поскольку вызовы этой функции не могут происходить параллельно. Здесь нужен асинхронный поход, варианты которого реализованы мной по ссылке выше.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

9

Re: AHK: Задержка при воспроизведении аудио

Сделано, добавил SND_ASYNC в параметр .

10

Re: AHK: Задержка при воспроизведении аудио

Всё равно предыдущий звук обрывается, когда начинается новый. Но, может этот вариант и устроит ТС.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

11

Re: AHK: Задержка при воспроизведении аудио

Параллельное воспроизведение, используя msiSendString.
Работает с файлами, загруженные в память ресурсы не поддерживает, но это и не требовалось.
Там же есть вариант с использованием bass.dll (≈100Kb).
teadrinker, а вот WMP на моей N редакции нет, ваш вариант для меня равнозначен использованию сторонних средств.

12

Re: AHK: Задержка при воспроизведении аудио

Посмотрел тот вариант, работает параллельно, действительно, но задержка есть после нажатия.

stealzy пишет:

загруженные в память ресурсы не поддерживает, но это и не требовалось.

Как раз в этом и смысл, иначе будут задержки.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

13

Re: AHK: Задержка при воспроизведении аудио

teadrinker пишет:

но задержка есть после нажатия

Хм, не замечал, впрочем я на маленьких файлах < 100Kb тестировал, и то они оказались в кеше оперативной памяти Mapped file (проверено в RamMap).

14

Re: AHK: Задержка при воспроизведении аудио

У меня с кодом из 3 поста звук обрывается, но не пукает.
А разве он не должен обрываться при нажатии новой клавиши?
Кстати wav можно загружать в память так:

FileRead, LaserWAV_Bin, *c test.wav

15 (изменено: stealzy, 2017-10-31 19:44:29)

Re: AHK: Задержка при воспроизведении аудио

Malcev, должен играть параллельно.
Можно загружать и так:

File := FileOpen("D:\Programs\Maple 18\data\signalprocessing\maplesim.wav", "r")
File.RawRead(LaserWAV_Bin, 100500)

Из той же темы интересный способ обойти ограничение SoundPlay в один исполняющийся трек, путем запуска в новом потоке:

ArrWAV:={WAV01: "D:\dtmf.wav", WAV02: "C:\explode.wav", WAV03: "C:\applause.wav", WAV04: "C:\chimes.wav"}
Gui Add, Button, gPlay, WAV01
Gui Add, Button, gPlay, WAV02
Gui Add, Button, gPlay, WAV03
Gui Add, Button, gPlay, WAV04
Gui Show, w300 h300
Return

Play:
  SoundPlay(ArrWAV[A_GuiControl], "Multi")
Return

SoundPlay(Filename, wait="") {
	static pSoundPlay=0, File=0
  if !(pSoundPlay)
    pSoundPlay := RegisterCallback("SoundPlay")
  if !(Filename=0xFFFF)
    File := Filename
  if (wait="Multi") or (wait>=2)
    DllCall("CreateThread", UInt,0, UInt,0, UInt,pSoundPlay, UInt,0xFFFF, UInt,0, UInt,0)
  else
    SoundPlay % File, % wait
  Return
}

GuiClose:
	ExitApp

Однако, если много раз подряд часто нажимать, скрипт замирает на команде SoundPlay, и больше не играет.

Интересно попробовать вызывать сразу с параметром, но я не понимаю, как правильно передать в ф-ию, которую вызывает CreateThread указатель на переменную:

FileRead WAV01, *c D:\dtmf.wav
FileRead WAV02, *c C:\explode.wav
FileRead WAV03, *c C:\applause.wav
FileRead WAV04, *c C:\chimes.wav
ArrWAV:={WAV01: WAV01, WAV02: WAV02, WAV03: WAV03, WAV04: WAV04}
Gui Add, Button, gPlay, WAV01
Gui Add, Button, gPlay, WAV02
Gui Add, Button, gPlay, WAV03
Gui Add, Button, gPlay, WAV04
Gui Show, w300 h300
Return

Play:
	SoundPlay(ArrWAV[A_GuiControl], false)
	Return

SoundPlay(Bin, Callback:=true) {
	static pSoundPlay:=0
	if !pSoundPlay
		pSoundPlay := RegisterCallback("SoundPlay")
	if Callback
		PlaySound(Bin)
	else
		DllCall("CreateThread", UInt,0, UInt,0, UInt,pSoundPlay, Ptr,&Bin, UInt,0, UInt,0)
	Return
}
PlaySound(ByRef Sound) {
	Return DllCall("winmm.dll\PlaySound" (A_IsUnicode ? "W" : "A"), UInt, &Sound, UInt, 0, UInt, 0x7)
}

GuiClose:
	ExitApp

Кстати,

teadrinker пишет:

Как раз в этом и смысл, иначе будут задержки.

В mciSendString open и play — отдельные методы, можно заранее открыть файл, а уже по требованию сразу играть.

16 (изменено: Malcev, 2017-10-31 20:09:44)

Re: AHK: Задержка при воспроизведении аудио

stealzy пишет:

Malcev, должен играть параллельно.

А вы пробовали?
У меня прерывается:

FileRead, sound1, *c 1.wav
FileRead, sound2, *c 2.wav

f8::
PlaySound(sound1)
Return

f9::
PlaySound(sound2)
Return

PlaySound(ByRef Sound) {
	static SND_MEMORY:=0x4, SND_NODEFAULT:=0x2, SND_ASYNC:=0x1
	Return DllCall("winmm.dll\PlaySound" (A_IsUnicode ? "W" : "A"), UInt, &Sound, UInt, 0, UInt, (SND_MEMORY|SND_NODEFAULT|SND_ASYNC))
}

Кстати и тут пишут:

PlaySound API doesn't support mixing two or more sounds

https://stackoverflow.com/questions/729 … ync-sounds

17

Re: AHK: Задержка при воспроизведении аудио

stealzy пишет:

Однако, если много раз подряд часто нажимать, скрипт замирает на команде SoundPlay, и больше не играет.

А у меня на семёрке хорошо этот скрипт работает, не замирает. На десятке пока не пробовал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

18

Re: AHK: Задержка при воспроизведении аудио

У меня тоже не замирает.

19

Re: AHK: Задержка при воспроизведении аудио

stealzy, на семёрке или на десятке пробовали?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

20 (изменено: teadrinker, 2017-10-31 21:04:43)

Re: AHK: Задержка при воспроизведении аудио

Пробовал так:

sc1E:: SoundPlay("C:\Windows\Media\Windows Exclamation.wav", "Multi")  ; a
sc1F:: SoundPlay("C:\Windows\Media\Windows Logon Sound.wav", "Multi")  ; s
sc20:: SoundPlay("C:\Windows\Media\Windows Logoff Sound.wav", "Multi") ; d
sc21:: SoundPlay("C:\Windows\Media\ir_inter.wav", "Multi")             ; f

SoundPlay(Filename, wait="") {
   static pSoundPlay=0, File=0
  if !(pSoundPlay)
    pSoundPlay := RegisterCallback("SoundPlay")
  if !(Filename=0xFFFF)
    File := Filename
  if (wait="Multi") or (wait>=2)
    DllCall("CreateThread", UInt,0, UInt,0, UInt,pSoundPlay, UInt,0xFFFF, UInt,0, UInt,0)
  else
    SoundPlay % File, % wait
  Return
}

Вообще-то там размерность некорректная, правильно так:

sc1E:: SoundPlay("C:\Windows\Media\Windows Exclamation.wav", "Multi")  ; a
sc1F:: SoundPlay("C:\Windows\Media\Windows Logon Sound.wav", "Multi")  ; s
sc20:: SoundPlay("C:\Windows\Media\Windows Logoff Sound.wav", "Multi") ; d
sc21:: SoundPlay("C:\Windows\Media\ir_inter.wav", "Multi")             ; f

SoundPlay(Filename, wait="") {
   static pSoundPlay=0, File=0
  if !(pSoundPlay)
    pSoundPlay := RegisterCallback("SoundPlay")
  if !(Filename=0xFFFF)
    File := Filename
  if (wait="Multi") or (wait>=2)
    DllCall("CreateThread", Ptr, 0, Ptr, 0, Ptr, pSoundPlay, Ptr, 0xFFFF, UInt, 0, Ptr, 0)
  else
    SoundPlay % File, % wait
  Return
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

21 (изменено: stealzy, 2017-10-31 21:10:45)

Re: AHK: Задержка при воспроизведении аудио

Аналогично и с вашим последним вариантом, замирает после 5-8 секунд стучания по кнопкам. В листинге вечно исполняется:
015: SoundPlay,File,wait (20.36)
Звука при этом, разумеется, нет.

22

Re: AHK: Задержка при воспроизведении аудио

Ну так у вас же какая-то хитрая сборка Windows вроде?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

23

Re: AHK: Задержка при воспроизведении аудио

teadrinker, при чем тут ОС? Она как то хитро позволяет играть звуки, но при частых нажатиях вдруг себя проявляет?

24

Re: AHK: Задержка при воспроизведении аудио

Почему бы нет?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

25

Re: AHK: Задержка при воспроизведении аудио

А разве после CreateThread, не надо вызывать ExitThread?
Я в keyhistory посмотрел - скрипт перестает реагировать на 10 потоке, что по-дефалту у автохотки.