1 (2020-06-01 12:05:05 отредактировано swerg)

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

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

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

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

-- функция проигрывания файла
-- вызов: PlaySoundFile("имя файла")
function PlaySoundFile(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
PlaySoundFile("C:\\WINDOWS\\Media\\Windows XP - запуск.wav")

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

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

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

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

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

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

2 (2020-06-01 12:06:12 отредактировано swerg)

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

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

local w32 = require("w32")

-- функция проигрывания файла - тестовый вариант с отображением кода ошибки
function PlaySoundFile(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 пишет:

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

local w32 = require("w32")

-- функция проигрывания файла - тестовый вариант с отображением кода ошибки
function PlaySoundFile(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

Здравствуйте!
Файл замечательно проигрывается...один раз. Те при первом запуске скрипта после запуска квика.
В последующих запусках функция выдает ошибку 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 PlaySoundFile(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 ?

6

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

Kolossi пишет:

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

Это вовсе не шутка. Это "остановить предыдущее проигрывание", если оно было запущено.
Не было запущено - ну и ладно, проблемы в этом нет.
Так что шуток в коде нет и вроде даже нет ошибок.

Но хотелось бы посмотреть на тот скрипт (полный!), который вы используете, чтобы можно было понять проблему. Как вы получаете приведённый вами код ошибки? Возможно, проблема вообще в чем-то другом, а не в данной функции.

Зачем вы вставляете Sleep() - совсем не понятно, это ж приостанавливает скрипт на время Sleep, это вам точно требуется?

7 (2018-11-29 20:01:16 отредактировано Kolossi)

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

swerg пишет:
Kolossi пишет:

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

Это вовсе не шутка. Это "остановить предыдущее проигрывание", если оно было запущено.
Не было запущено - ну и ладно, проблемы в этом нет.
Так что шуток в коде нет и вроде даже нет ошибок.

Но хотелось бы посмотреть на тот скрипт (полный!), который вы используете, чтобы можно было понять проблему. Как вы получаете приведённый вами код ошибки? Возможно, проблема вообще в чем-то другом, а не в данной функции.

Зачем вы вставляете Sleep() - совсем не понятно, это ж приостанавливает скрипт на время Sleep, это вам точно требуется?

В том и проблема. Если не отработать  w32.mciSendString("CLOSE QUIK_MP3") и остановить скрипт, то в следующий запуск скрипта  w32.mciSendString("PLAY QUIK_MP3") выдает ошибку тк поток не закрыт. CLOSE не может отработать  посколько алиас не назначен. Если поставить CLOSE после PLАY то обрывается проигрывание. С задержкой sleep на время проигрывания и потом CLOSE все работает. Те нужно закрыть поток после проигрывания и желательно без остановки скрипта. Как, не могу придумать. Пробовал поставить закрытие в OnStop(), тоже не работает.

8 (2018-11-29 19:58:11 отредактировано Kolossi)

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

Вот этот скрипт, проигрывает файл один раз.  Если его запустить еще раз проигрывания не будет. Для того что бы он опять сыграл нужно перезапускать Квик и запускать скрипт.
--
w32 = require("w32")

function main()
    is_run=true
    while is_run do
        PlaySoundFile("c:\\miss.wav")
        is_run=false
        sleep(500)
    end
end
function OnStop()
  is_run = false
end

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

9

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

У меня подозрение, что проблема в том, что вы вызываете из main()
Это вам точно требуется по задаче?

Доподлинно проверить не могу, от чего-то на Win10 у меня скрипт с проигрыванием звуков этот вовсе убивает терминал. Поразбираюсь, отпишусь.

10

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

swerg пишет:

У меня подозрение, что проблема в том, что вы вызываете из main()
Это вам точно требуется по задаче?

Доподлинно проверить не могу, от чего-то на Win10 у меня скрипт с проигрыванием звуков этот вовсе убивает терминал. Поразбираюсь, отпишусь.

Спасибо!

Имхо не важно откуда вызывается. По сути вопрос сводится к тому, как можно закрыть поток  до выхода из скрипта?

11

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

Kolossi пишет:

Имхо не важно откуда вызывается.

Возможно, это как раз важно.
Потому и хотелось бы, чтобы вы проверили: связана ли проблема с вызовом из main()?

Kolossi пишет:

По сути вопрос сводится к тому, как можно закрыть поток  до выхода из скрипта?

Добавьте в OnStop() строчку
w32.mciSendString("CLOSE QUIK_MP3")
да и всё.
Хотя у меня ни разу не наблюдалось проблем с незакрытым дексприптором проигрывания.

12 (2018-12-01 22:47:57 отредактировано swerg)

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

Kolossi, попробовал ровно ваш скрипт на Win7
Всё работает отлично, скрипт можно перезапускать много раз, звук успешно проигрывается каждый раз при запуске.
А у вас какая версия Windows?

13 (2018-12-02 22:02:20 отредактировано Kolossi)

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

Да. Похоже проблемы растут не из скрипта.
Quik у меня под wine на Mac'е.

В общем танцы с бубном показали, что в данной конфигурации выход из скрипта без закрытия проигрывания блокирует все последующие запуски проигрывания до перезагрузки квика. Поставить закрытие в OnStop() не помогает тк алиас туда не передается.
Ладно. Хоть так, с остановкой на sleep() и последующим закрытием поет smile

Спасибо за помощь.

14

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

Kolossi пишет:

Quik у меня под wine на Mac'е.
Поставить закрытие в OnStop() не помогает тк алиас туда не передается.

В смысле? какой альяс не передаётся?
"QUIK_MP3" - это создаётся "глобальный системный" альяс с таким именем для функций mci, никуда его передавать не нужно.
Другое дело, что видимо в wine уже штуку сделали так вот странно, это, очевидно, основное уточнение.

15

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

Попробовал w32.mciSendString
Скопировал с поста выше.

require("w32");
PlaySoundFile(getScriptPath().."\\dirSound\\WindowsYES.wav");

function PlaySoundFile(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;
До message не дошло.
Выдает ошибку на строке PlaySoundFile(getScriptPath().."\\dirSound\\WindowsYES.wav");
attempt to call global 'PlaySoundFile' (a nil value)
Пробовал менять и пути и файл. На 8.4 и на 8.5. Не помогло.
Что может быть. Win7

Спасибо

16

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

fin, у вас просто Lua скрипт неправильно составлен.
Когда вы вызывается функцию PlaySoundFile() из <BODY> скрипта, как я называю эту часть, у вас данная функция еще не определена.

Для теста полный текст скрипта должен выглядеть либо так:

local w32 = require("w32")

function PlaySoundFile(file_name)
  w32.mciSendString("CLOSE QUIK_MP3") 
  w32.mciSendString("OPEN \"" .. file_name .. "\" TYPE MpegVideo ALIAS QUIK_MP3")
  w32.mciSendString("PLAY QUIK_MP3")
end

PlaySoundFile("C:\\WINDOWS\\Media\\Windows Logon Sound.wav")

либо так:

local w32 = require("w32")

function OnInit()
  PlaySoundFile("C:\\WINDOWS\\Media\\Windows Logon Sound.wav")
end

function PlaySoundFile(file_name)
  w32.mciSendString("CLOSE QUIK_MP3") 
  w32.mciSendString("OPEN \"" .. file_name .. "\" TYPE MpegVideo ALIAS QUIK_MP3")
  w32.mciSendString("PLAY QUIK_MP3")
end

PS
Надо же, я сделал описку в имени функции в первом же посте изначально (PaySound вместо PlaySound), и так это название и копировал везде, не замечая описки smile

17

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

fin, у вас просто Lua скрипт неправильно составлен.

Да. Заработался. Вынес функцию из main() и все работает.