Перейти к основному содержимому

audio

Воспроизведение звука: системный beep, WAV-стриминг, глобальный stop. 3 канонические функции.

Функций3 (8 с алиасами)
Проверено вживую3 из 3
Требуемый eventнет
Сайд-эффектыBeep и PlaySound производят слышимый вывод

Алиасы. Beep имеет две формы (PascalCase + lowercase). PlaySound и StopAll имеют по три формы. См. Обзор / Конвенция именования.

Краткий справочник

ФункцияСигнатураЗаметкаСтатус
Beep(freq_hz: number, duration_ms: number)системный beep через Windows Beep, blockingпроверено
PlaySound(wavData: string, loop: bool, volume: number, pitch: number)работает с валидными WAV-байтами, крашит чит на не-WAV входепроверено
StopAll()остановить все играющие звуки, возвращает nil, безопасный no-op если ничего не играетпроверено

Beep

audio.Beep(freq_hz: number, duration_ms: number)

Воспроизводит один тон через Windows Beep syscall. Возвращает nil. Blocking: скрипт ждёт окончания beep перед продолжением.

Проверено вживую, всё без краша или raise:

ВызовРезультат
audio.Beep(440, 50)слышимый 440 Hz тон 50 мс
audio.Beep(0, 50)без слышимого тона, ok=true
audio.Beep(50000, 50)неслышим (выше hearing range), ok=true
audio.Beep(440, 0)ok=true, без воспринимаемого тона
audio.Beep(-1, 50)ok=true, без воспринимаемого тона
audio.Beep("440", 50)ok=true, string-as-number coerced
audio.Beep()"bad argument #1 to '?' (number expected, got no value)"
audio.Beep(440)"bad argument #2 to '?' (number expected, got no value)"
audio.Beep(nil, 50)"bad argument #1 to '?' (number expected, got nil)"

audio.Beep(880, 30)

audio.Beep(400, 60)
audio.Beep(800, 60)
Beep синхронен

Каждый вызов блокирует поток на duration_ms. Не делай длинные beep на onPaint, чит будет hitch'ить один кадр на каждый beep.


PlaySound

audio.PlaySound(wavData: string, loop?: bool, volume?: number, pitch?: number)

Воспроизводит WAV-байтовую строку асинхронно. Строка это raw байты .wav файла (RIFF header + PCM samples). Документированная сигнатура:

АргументДиапазонЗначение
wavDatastringполный байтовый контент WAV-файла (типичный источник: file.read("clip.wav"))
loopboolповторять после окончания клипа
volume0..21.0 = оригинальный volume, 0 = silent, >1 = усилен
pitchnumberplayback rate множитель, 1.0 = оригинал

Проверено вживую с реальным hit.wav (22100 байт, RIFF header), все комбинации играли корректно:

ВызовРезультат
PlaySound(wav, false, 1.0, 1.0)нормальное воспроизведение
PlaySound(wav, false, 0, 1.0)silent (vol=0)
PlaySound(wav, false, 2.0, 1.0)усиленное (vol=2)
PlaySound(wav, false, 1.0, 0.5)half-speed pitch
PlaySound(wav, false, 1.0, 2.0)double-speed pitch
PlaySound(wav, true, 1.0, 1.0)looping (стоп через audio.StopAll)
PlaySound()"bad argument #1 (string expected, got no value)"
PlaySound(nil)"bad argument #1 (string expected, got nil)"
Крашит чит на не-WAV входе

Проверено: передача любой строки которая не является валидным WAV-файлом в PlaySound крашит чит native SEH-исключением которое pcall не ловит. Подтверждённые crashers в нашем прогоне:

  • audio.PlaySound(""): пустая строка
  • audio.PlaySound("not-wav"): короткая bogus
  • audio.PlaySound("x"): один байт

Внутренний WAV-loader не валидирует RIFF header перед обработкой. Всегда передавай реальные WAV-байты прочитанные через file.read или http.Get. Никогда не конструируй и не сплайсь WAV-данные inline без полной уверенности в каждом байте.


local wav = file.read("hit.wav")
if wav then
audio.PlaySound(wav, false, 1.0, 1.0)
end

StopAll

audio.StopAll()

Останавливает все играющие звуки. Возвращает nil. Проверено вживую: безопасный no-op когда ничего не играет.

cheat.Register("shutdown", function()
audio.StopAll()
end)

Паттерны

Hit-confirm beep на aim

local last_beep = 0

cheat.Register("onUpdate", function()
local target = entity.GetTarget()
if target and target.IsAlive then
local now = utility.GetTickCount()
if now - last_beep > 100 then
audio.Beep(1200, 20)
last_beep = now
end
end
end)

Pre-loaded WAV кеш

local SOUNDS = {}
for _, name in ipairs({"hit", "miss", "alert"}) do
SOUNDS[name] = file.read(name .. ".wav")
end

local function play(name, vol)
if SOUNDS[name] then
audio.PlaySound(SOUNDS[name], false, vol or 1, 1)
end
end

Stop all при unload

cheat.Register("shutdown", audio.StopAll)