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
Telegram jollycoder

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
Telegram jollycoder

7

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

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

8

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

gryphonn пишет:

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

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

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

9

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

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

10

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

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

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

11

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

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

12

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

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

stealzy пишет:

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

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

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

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
Telegram jollycoder

18

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

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

19

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

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

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

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
Telegram jollycoder

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
Telegram jollycoder

23

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

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

24

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

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

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

25

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

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

26 (изменено: Malcev, 2017-10-31 22:34:26)

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

Хэндл закрывать точно надо:

Александр_ пишет:

Прошу обратить внимание на 2 момента, касающихся потоков:
1) Нужно всегда закрывать дескрипторы потоков- если код потока завершился, а дескриптор остался, то поток "жив".
2) Нельзя использовать функцию TerminateThread в приложениях.

http://forum.script-coding.com/viewtopi … 977#p51977

27 (изменено: stealzy, 2017-11-01 17:09:51)

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

Malcev, не помогло, теперь замирание происходит на ExitTread:

sc1E:: SoundPlay("D:\dtmf.wav", "Multi")   ; a
sc1F:: SoundPlay("C:\explode.wav", "Multi")  ; s
sc20:: SoundPlay("C:\applause.wav", "Multi") ; d
sc21:: SoundPlay("C:\chimes.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)) {
    Handle := DllCall("CreateThread", Ptr, 0, Ptr, 0, Ptr, pSoundPlay, Ptr, 0xFFFF, UInt, 0, Ptr, 0)
    DllCall("CloseHandle","int",Handle)
  } else {
    SoundPlay % File, % wait
    Return DllCall("ExitThread")
  }
  Return
}

28

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

Что интересно, при замене команды SoundPlay на вызов DllCall "winmm.dll\PlaySound" новый трек обрывает предыдущий, видимо DllCall всегда исполняются от основного потока.

pFn := RegisterCallback("Fn")
FileRead Bin, *c D:\dtmf.wav
h1 := CreateThread(0,0,pFn,&Bin,0,0)
CloseHandle(h1)
Sleep 700
h2 := CreateThread(0,0,pFn,&Bin,0,0)
CloseHandle(h2)
Sleep 1500
Return

Fn(Sound) {
	Return DllCall("winmm.dll\PlaySound" (A_IsUnicode ? "W" : "A"), UInt, Sound, UInt, 0, UInt, 0x7)
	; Return DllCall("ExitThread")
}
CreateThread(ThreadAttributes, StackSize, StartAddress, Parameter, CreationFlags, ThreadId) {
	; функция создаёт поток
	; ThreadAttributes- атрибуты безопасности, почти всегда 0
	; StackSize- начальный размер стека, обычно тоже 0
	; StartAddress- адрес функции, которую будет исполнять поток
	; Parameter- параметр, который получит функция StartAddress
	; CreationFlags- флаги создания, обычно 0, иногда 4(тогда поток создаётся, но не начинает выполняться)
	; ThreadId- ссылка на переменную, в которую будет помещён идентификатор потока
	Return DllCall("CreateThread",Ptr,ThreadAttributes,Ptr,StackSize,Ptr,StartAddress,Ptr,Parameter,UInt,CreationFlags,Ptr,ThreadId)
}
CloseHandle(Handle) {
	; функция закрывает хэндл Handle
	return DllCall("CloseHandle","int",Handle)
}
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}
Loop 4
	Gui Add, Button, gPlay, WAV0%A_Index%
Gui Show, w200
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

Интересно, как можно вызвать winmm.dll\PlaySound напрямую из CreateThread?

29

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

teadrinker

Попробовал несколько вариантов. Один лучше всего заработал. Реагирует почти мгновенно, но не достаточно для моей задачи. И такое ощущение, что не всегда одинаково время срабатывания. Также звук щелкает.

30

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

stealzy

Вот этот ваш первый вариант опупенный. И звук классный. Работает как надо и очень быстро. Спасибо большое!

31

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

Malcev

Да, да. У меня с кодом из 3-го поста тоже звук обрывается, но без треска и щелчков. Это именно то, что было нужно!

32 (изменено: gryphonn, 2017-11-10 11:26:29)

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

stealzy

Вопрос. Как получить данные файла в base64? Там, где кодировал я, на разных сайтах, используются следующие символы "//1f/Ev8h/wf/...", у вас таких нет.

UPD. Разобрался. Но почему-то мой звук работает не так хорошо, как ваш. В чем причина? В размере?

Вот мой звук.

+ открыть спойлер

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

33

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

gryphonn пишет:

Как получить данные файла в base64?

Я же оставил подсказку на определении ф-ии декодирования: ; Base64 encoder/decoder for Binary data by SCAN

+ Base64Encoder
#NoEnv
#SingleInstance, Force
SetWorkingDir %A_ScriptDir%
File := "ahkicon.png"
If !FileExist(File)
	URLDownloadToFile, http://i.imgur.com/dS56Ewu.png, % File
FileGetSize, nBytes, % File
FileRead, Bin, *c % File
B64Data := Base64Enc( Bin, nBytes, 100, 2 )
MsgBox % Clipboard := B64Data
Return

Base64Enc( ByRef Bin, nBytes, LineLength := 64, LeadingSpaces := 0 ) { ; By SKAN / 18-Aug-2017
Local Rqd := 0, B64, B := "", N := 0 - LineLength + 1  ; CRYPT_STRING_BASE64 := 0x1
  DllCall( "Crypt32.dll\CryptBinaryToString", "Ptr",&Bin ,"UInt",nBytes, "UInt",0x1, "Ptr",0,   "UIntP",Rqd )
  VarSetCapacity( B64, Rqd * ( A_Isunicode ? 2 : 1 ), 0 )
  DllCall( "Crypt32.dll\CryptBinaryToString", "Ptr",&Bin, "UInt",nBytes, "UInt",0x1, "Str",B64, "UIntP",Rqd )
  If (LineLength = 64 and !LeadingSpaces)
    Return B64
  B64 := StrReplace(B64, "`r`n")
  Loop % Ceil(StrLen(B64) / LineLength)
    B .= Format("{1:" LeadingSpaces "s}","") . SubStr(B64, N += LineLength, LineLength) . "`n"
Return RTrim(B,"`n")
}
gryphonn пишет:

почему-то мой звук работает не так хорошо

Я не знаю, как он должен работать хорошо, поэтому не могу сказать, сам никаких дефектов не слышу. Но сам звук резкий и неприятный, аудио плеер сглаживает начало и конец, там он звучит более-менее приемлимо. PlaySound, конечно, этого не делает.
Что касается размера, то частота дискретизации в 4 раза, а битность в 2 раза больше относительно моего, итоговый битрейт выходит в 8 раз больше.
Я сжал ваш файл в AIMP, в результате он потерял басы и стал звучать более мягко:

UklGRvkBAABXQVZFZm10IBAAAAABAAEAESsAABErAAABAAgAZGF0YdUBAAB/gHx7bnBieXlnaYGCd4mMfYueiXtwb3mafntvOwgQfKFgI1u6ZFsrQJxG1JNbv4ysqZO/qo+6ubXCoqO/qpSYk3p3gnRqalZLPzQ8REJBOTxGSVZWWGVveYKIk5qZoKKosLK3tbG1sq6vq66mp52SmJGLgH16dXBwZGJmYmFdW1phYWFkbHF1enyChomOlpmfmZ6mpKOcpaSfnZuampqPi46FfoCAf3lzc3JtbW9wbm5vbW5ydXd5e3+Cg4WJi42QkpGSl5qXlZuXkpWTjZCPiIeGhH99fn12dnh4dnF0dXJ0dXZ3eHx9fn6AgoeJh4iNj46QkpOSkpOSkIyOj46OjYmJhX5/fXt5eHx5enpydHVydXd1dXl8fX9+fH+BgoaJiouJi4yNjo2Ni4uLi4uJiIWEg4KBfn99fHx5eHh2dnV2dnZ3d3p6e3t7fICCgoOFhoaJiomJiomIioqJh4SEgoiBfYCAfnx9fHp7enp5eHt8f3x8gIKAh42eq7OdZ09egXWDorK1eEpZfpWLjoZ7inF0fHJqbnmTlol5bXZncZuyooZkX3OJnqqYcmBkf5agnIpxZGt/jY+GfHh8gYF/eXd6e3p9e3ZydHp+fXl3fIB/fHt+

Что касается параллельного проигрывания, наметилось два способа:
мультипоточный вариант, который не будет ломаться на AHK_H;
использование BASS.dll, где вероятно надо разобраться как играть без создания канала или как/нужно ли закрывать каналы после проигрывания звука.