1 (2017-05-03 10:43:24 отредактировано swerg)

Тема: Проигрывание звуковых файлов из Lua (mp3, wav, midi и т.д.)

Установка: распаковываем из архива с библиотекой w32 файл w32.dll, копируем его в каталог с терминалом QUIK (туда, где info.exe). (почитать подробнее про библиотеку w32)

Использование: добавляем в код робота текст

-- подключить библиотеку w32
local w32 = require("w32")

-- функция проигрывания файла
-- вызов: PaySoundFile("имя файла")
function PaySoundFile(file_name)
  w32.mciSendString("CLOSE QUIK_MP3") 
  w32.mciSendString("OPEN \"" .. file_name .. "\" TYPE MpegVideo ALIAS QUIK_MP3")
  w32.mciSendString("PLAY QUIK_MP3")
end

Пример использования:

-- проиграть звуковой файл из каталога Windows XP
PaySoundFile("C:\\WINDOWS\\Media\\Windows XP - запуск.wav")

При задании строковых констант путей к файлу не забывайте "удваивать" символы обратного слэша.

Полезные особенности данного метода:

  • проверил проигрывание файлов wav, mp3, midi: проигрываются

  • на время проигрывания файла выполнение Lua-скрипта не останавливается

  • если проигрывание одного файла еще не закончилось и снова вызвана функция PaySoundFile(), то тут же начинает играть новый файл

Вот здесь есть примеры разных командочек для mciSendString.

2

Re: Проигрывание звуковых файлов из Lua (mp3, wav, midi и т.д.)

Если звуки почему-то не проигрываются - для тестов возьмите вот такой вариант функции PaySoundFile():

local w32 = require("w32")

-- функция проигрывания файла - тестовый вариант с отображением кода ошибки
function PaySoundFile(file_name)
  w32.mciSendString("CLOSE QUIK_MP3") 
  local n = w32.mciSendString("OPEN \"" .. file_name .. "\" TYPE MpegVideo ALIAS QUIK_MP3")
  message(tostring(n), 2)
  w32.mciSendString("PLAY QUIK_MP3")
end

После вызова этой функции будет выведено сообщение с числом - это код ошибки.
Коды ошибок для этой функции с номерами описаны здесь:
http://msdn.microsoft.com/en-us/library … 85%29.aspx
(ищутся по фразе "MCIERR Return Values", если ссылка сломается)

3 (2017-05-03 09:59:51 отредактировано swerg)

Re: Проигрывание звуковых файлов из Lua (mp3, wav, midi и т.д.)

Вот тут еще показано использование простых в использовании функции MessageBeep и Beep, которым для проигрывания звуков никакие файлы не нужны
http://quik2dde.ru/viewtopic.php?pid=460#p460

4 (2018-11-07 13:39:51 отредактировано Kolossi)

Re: Проигрывание звуковых файлов из Lua (mp3, wav, midi и т.д.)

swerg пишет:

Если звуки почему-то не проигрываются - для тестов возьмите вот такой вариант функции PaySoundFile():

local w32 = require("w32")

-- функция проигрывания файла - тестовый вариант с отображением кода ошибки
function PaySoundFile(file_name)
  w32.mciSendString("CLOSE QUIK_MP3") 
  local n = w32.mciSendString("OPEN \"" .. file_name .. "\" TYPE MpegVideo ALIAS QUIK_MP3")
  message(tostring(n), 2)
  w32.mciSendString("PLAY QUIK_MP3")
end

После вызова этой функции будет выведено сообщение с числом - это код ошибки.
Коды ошибок для этой функции с номерами описаны здесь:
http://msdn.microsoft.com/en-us/library … 85%29.aspx
(ищутся по фразе "MCIERR Return Values", если ссылка сломается)

Здраствуйте!
Файл замечательно проигрывается...один раз. Те при первом запуске скрипта после запуска квика.
В последующих запусках функция выдает ошибку 289. По ссылке этих кодов нет. Что-то надо сбрасывать после проигрывания кроме    w32.mciSendString("CLOSE QUIK_MP3") ?
Quik запускаю под wine(PlayOnMac) на MacOS

5 (2018-11-11 17:39:59 отредактировано Kolossi)

Re: Проигрывание звуковых файлов из Lua (mp3, wav, midi и т.д.)

Да простит автор мою бездарность, не заметил сразу шутки в коде:)
Конечно
w32.mciSendString("CLOSE QUIK_MP3")
вряд ли отработает, если алиас  QUIK_MP3 назначен в следующей строке.

Получается, что на время проигрывания надо тормозить скрипт и потом файл закрывать

function PaySoundFile(file_name)
    w32.mciSendString("OPEN \"" .. file_name .. "\" TYPE MpegVideo ALIAS QUIK_MP3")
    w32.mciSendString("PLAY QUIK_MP3")
    sleep(5000)
    w32.mciSendString("CLOSE QUIK_MP3")
end
Тогда работает.

Попробовал убрать sleep и добавить wait
    w32.mciSendString("PLAY QUIK_MP3 WAIT")
ничего не меняется

Попробовал вместо sleep использовать статус воспроизведения
st=w32.mciSendString("STATUS QUIK_MP3 POSITION")
Возвращает ноль как во время воспроизведения, так и после.
Может это какая-то обрезанная версия w32 ?