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 ?

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
        PaySoundFile("c:\\miss.wav")
        is_run=false
        sleep(500)
    end
end
function OnStop()
  is_run = false
end

-- функция проигрывания файла
-- вызов: 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

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 уже штуку сделали так вот странно, это, очевидно, основное уточнение.