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. Разобрался. Но почему-то мой звук работает не так хорошо, как ваш. В чем причина? В размере?

Вот мой звук.

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

UklGRi4PAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAATElTVF4AAABJTkZPSUNSRBgAAAAyMDEzLTAzLTE1VDIxOjExKzAxOjAwAABJU0ZUMgAAAEFkb2JlIEF1ZGl0aW9uIENTNiAoV2luZG93cykgKGxpYnNuZGZpbGUtMS4wLjI0KQAAZGF0YaQOAAAy///+UP/h/s7/Cv7EAOb8dAIk+irwPQDf+Ir6Q/ei8jfwxuja5uzpmPcL9x7rHNl12wbloO0n9xv6A/jK9rv8DwJY/jjukeRL2sDZfeBw7mQVCwAAyZLLSPFSLN5KcxBKvF7LFhh4KPfwcdsjCB4Y3v6q8+0E3RvGLCwbUusj1urvaB5KIOAD8vpuArQMNSAjMnciHQ6fCVwMpRKuAcXZO+CbCY4ldBaE3Mi7qsC19qkkIxWS8ZHWNNzB8kUM1SU1MskeKglzDab38tX05BMP2h4LEIzzjNwD2K3jN+bm0xDJI7WDiwSAAICEmy6EAoAAgxylEcvH4fbvuhIbMa0kVwjSDSkfOQla2xKvhaaAvB3E6buWggCAz+CCXA4mXfBSJXBAfyup45/gTBsO+wOAAIBi6TIt6fsBgACAAYChqdGy0s6CJ6tUyCQi6GXFqa7yzN/69wu1QzVdEDQNOilJNjYIBjq/NrWg350CWBk/IHo6MVQaMHgQxgemD7gW+wu0HMM7okpnQ5grcQjbBacaURAGDvc3TFBCOrYwLjNlK8AzvzMHFIz78g4qIokcLymiNv5Cv0wLQP0yJDNTMMYmnDVkSZs/dzcuRHtHszGFID8dcRrtI58pzxraHTg7kkRJNU44pkIzOzQqThinFBAZ0hhlFjwU7xIDE40aRx4cFX8NnQ+RCzD+tPbU9MX1RPdE9ob3nf37AmYDGQDL+/f3rPRp8AztV+ru6GPqluzt7O/oneUw44vcZNSp0CfQ7M0ny8TGXsUfxSvAv7vYti+1WrQas4a2TbjwvDvDesFmwAjFAcS7wefDecJKwLXAx8Iow36+orwJvDa5+7hktw235bvtwBfCucKkxl/HVcVgxnPIIc280bzSQdSN11fZ59aP1HbWvdZP1F3Wfdu13pHiT+Rl5Yvrle/77szv3PQP+F/4I/tp/uH/HQFUAzIFLwbQB88KMg5ID7gQ5BUgGmca5Bg8GLQY6Bh+GjUcrhvdHMIfJCFcIZMi4iL7Idci0iSFKKsr6yz5LaswqDF3L0IxbzMaMo8yTDXpNtU1JjePOK40/TJMMxoxVjD5MWoz+jMLNUM12DOWMyQ0+i4vKMEqzDRZOYkviSM0JMAv9zb/MvEp/CTzKOgu+S5fK4UtGS/hKXAg7Rm1IC8tajBtKAAehhixF1IWIxOJEdsSxha2GsUZwRRYEG0PTxStFkcR4gn1BcYHawknBVz+b/lr/KgDtwFo+dn1Qfcn/dAAU/r+8u3xaPI88tTx1vC78E7woO/T72Ltx+hw5ovlg+T04knfe96I5KboX+YQ5Kzj6eNh5GjjU+HC3wTh7+Ie4Qze5tyh3A7c6NvY29vaz9pi227aENrd2izc5t5B4pfiweDX36fgruGz4MHfNeBl4ePhTOLq47vkYOaN6oDtP+2m7mrxEvFU8VPzNPQK9Rr3KfgN+Jn5EvtE+u35EPyp/sv/BgFjAacBMgUXB2MFWQUiCLsIPgjNCYgLyQ1AD8cPsBAOFH0XLRcYFwMaJRp/GXQbFx3mHtMdwRsuHHIbWxjrFnAZQh1WIncmISY/JYEkZSNQJBkl5ySXIzkjxiT6Ik0eFhvgGwMe4x49Ir0leyeRJzolICSnIoQfoB1wH0Yh6B6WG1wcLh01GzIb+BvhGwMcjRu+GFYWdhhaGy4bqxoxG2EaSBiJF34WJxPCD8sNPAuvCZgKrAynDjUODw34DAAM3gm9BUYAXf2X/ZX+gv6n/5UAtP7//Ub/oQAIAk4AIv7K/13/5vw9/Gv7//h+9vH0BfRl81/y7/A68m/1SfTN8Y3yM/JN7zfu4+7O7cPsbex062Hs4u217evsfe0P8Lbwwu8d8MDuF+2q7iLvD+0I7YbtUO107tjube5O7sXuo+5D7YntMO467TPtjO3L7QzwHfIh8qfyDfPm8xr1cPWO9jr3Xvjm96D2yvhR+qT5Avnf+fb7fPwh/Ib8wv4ZAWECtAJNAfsBcAPiAnMCAwOnBCMF2gTNBCcFyQeYCh8LaQlQCUkL7QrrCoQNkw8fDjkNdg+4ERYSqRB5EI8RMxLaETQRpxFOEUcQWxCfEvcTpxMqFR8X8RmJG/MYHBeEGLUZzxiiF4MW0RSJE3kUohZIGPUZhRvxGloZSBn0GO8UQBEpEuUTVhNQE60URBQ1E5cTNRS6E00S1A+tDPMLag1XDsAOrg96EBcQyA+0D0sOFgwSCWcHcQdVB58IyAehBRYG/wahBo8FmwRlBBkFCwN9/zf/2P8J/yz+0/xr+2D8QP3J/PL9x/5Q/s399vxW+6n5WPg99uT05vXi9vL1t/XT9kz3CPip+CP4u/d194b32ff/9p31JvTv8inyrfCJ8OfyTPTb8/Pzr/VC9oz0hPMz863yQvMd8xHyHfO39MD0X/Tl9G71P/VG9ez1kva+9uX29vae90T4ivbU9b/4Pvqx+dz5g/uZ/VT9gPxe/Tn92/zL/X39M/2a/uz+bP6V/nr+4v4EAMcAgQAPAeoCuQNaBOMFJQenB+IIiwncCKYIZwi5BzEHlwehBggG0we0CdQKUAsbDYwOTQ5DDu0OLQ9pDiENlQz5DdEPWRBEEMAQ0xH5EccQjhDCEjkUoxJBEfoRyhIEE7URAxEVEogSIRJnEUYSjRMPE3YSvRKGEp8RYRF4EH0PTw+vDYQLsAvDDIUMagwJDhsPIg8WDy4Oyw6GDhkORA5rDj8PygyVDNMOLw90DicNQAzDClsJFwm2CagJ8wm2CREIMwfGBjMGHwQmAav9ifxr/c38gP2zAF0Ce/8u+1j5wPv0/nj98vmm+Cn6NPt7+YT42vfI9yb4z/YC+bH+7P0L+aD5pvzg+3X3yPUQ+DT6bvzs+3T5MPmh+Lf1zfI08v3yFPKe8YnyZ/RC9kP25/Rx8+HzL/SR8qXxuvK+87H0QfcQ+Cv2K/Ww9TP2o/Ut9YL1qPWp9Rr17PSH9m74XfnS+d767vse/OP79vtt/Gz9sf27/VP+I/+I/3z+B/67/hb+s/3U/OT7W/yP/BH+S/8tAN4AOgDu/38AlwE3AeMAEAMKBK0EFgYtB0gI9QgSCfMITgmwCb8JPAoXC7kL8AqDCQ8JXglnCYsJ6gmDCUQKpQvTC04MiQwBDCQMbA3sDS8N0wyuDQwOiw0DDl8NjAw8DVsNLw3XDLIMOQzNCsgKXwuFCzQLbAomCtkKCAvRCRkKhwtDC9wKIguOC3ULcQoaCggKnQkDCWcIIgkbCRkIiwe+Bv0F2AVLBesDVAPsA5cDtAKjAhQDugISAuoBSwGdAVYCbQFSAMf/bP++/of+Mv+1/rP9vv1f/mv+f/2V/Iz7d/uT/C385fvP/LP8pfs/+jz5UPkw+fr4yfj/9x74rPgy+AD45PeC9+72dPVC9U32v/UN9Wn1NfUG9Sn1x/So9FD1GPb+9fD1u/bu9tL1wvVC9mz1VvXT9Wr2Evel9hf2R/Yv95L3jPds+Ij5YvlI+WL65foR+hX6jPrQ+i37Evvm+jf7tfuP+3r6lvqq+3X7e/tS/Gb9nv1A/VL+b/9LAHkB/QGfAZIBgwFfAdwBdgKeAvUBRQJDA0cDvwNmBN4E2gUABgMFywQ7BjwHeAZSBjsHnQeTCFMJQwl8CWgK1wqbCR0JQwl9CYsJOAkSCdQIGgk8CbIJbAqrCSoJJAlQCAEIcQi3CCoIHQgWCaEJNwrJCkwKpAmoCZoJQQlPCdsI2QecCLgISQYbBEsDQQPhA4kEmQSVA3wCRwL9ANUAOQOEBfsGZAd6ByoGzAOUAWP/8/zB/DH+wf6X/1sALABn/7j/owBMAMb+GP7O/of/jP6A/Ff77PtY/Sf9o/sn/MH9Wv2V/Dn8dvtB+sj5BvpZ+m36qvq++uT6Qfsr+r/5VvoG+j/6EvvK+nH5svnW+SP4Zfcb+JP45Pev+HD6ZPu/+1r84vuq+9r8Cv7x/af9mP5G/sP8Tvvg+sr6rPtD/Wb9mf1o/14B4ADOAdABQgL2AJMCswBr+wQIKABe/m8OEQqcCEwEXQkjIkAX8gnWFqwouzOXIawjKCzTNO8zbCo0N3A2vyX9DmAODxDr9mjgk9Sy1RLZ0dU/yGTKjd6041PhoOp6/s4LUAAs+DX75vUD9oPwEPdkDasQxgilE20sfDFsIyMgtjCaP/U8fjYANAwqjBsQDM32Wen12IHRvLbc0XDq2LF93v7S3+/WINTijwku8AUNjjqwHMEix+XF24wsdzl9FZvvW93yElo51i0T4LHEG/ZPMGwaTuLc7REFqDE7BM/nI+RV4eAKufIu7q/yC/SpAaL3mQpm9Fjso/lo4xP2KO0H6JPrT+Mz8g/wY++N7aXuv/qfAqkLkQ6hBd8STSF0F0cXyxXhDRgMGQoPAsIARv+5/dj5Cusw5XDpNPSn9cLz2PU391b0pOVH4rbmgOnO6yDuQ/knBxsRuxj3IKEskTSGNPwuKSz3KfAgrRnQEn8QeQll/UTzy+gf5Mbdpdti4Lbgy+K25jXspPJl9xL+egP+CgIPcxGwGA8d6yERJrAobyo1Knsmkh+TF6AMtgM1/RDzwOqh5hTgSt9S4LDdq+BN487nGfGN9tP8WwjjDZASnBfOFYQcuyGEILcgVSA4HSwbXhlyFRESYQn1AUD8G/Zt8hjtyefs4xTjBuTW42DonOv97kb16viV/mME3wZhCmYNKw2eDv4RHBAyDeMKdAdABTACtwHi/hD8pPrp9235p/jY99D48vp3/D78QP60/lIBgALRAJcBKwErAfEAe/8J/vb7gfwm++j4xfhP9wL3H/bc9tH3EPoL+575vPt8+zz7aPpQ+tH5i/lJ+1n6A/3q/QL9G/xM+1/7ofrW+dj2SfYx9U3z4PKG8XLyAvMS8qb0DvbQ9oD4Xfm9+wb96/3R/vD9Sv5h/iT97fx8+sP56/lo+Bn4SvcC91v3NPgW+zb8iPxT/pL/dAAmAOv/sP9M/4v9rfyE/W78Gvth+vn6lfsB+0f7sf1l/ab9

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, где вероятно надо разобраться как играть без создания канала или как/нужно ли закрывать каналы после проигрывания звука.