funduk написал: А знаете ли Вы способ, который не загружает с диска этот файл всякий раз при проигрывании? А делает это один раз в начале работы скрипта
Знаю, но написал специально эту тему с целью дать вариант простого решения без написания каких-либо вспомогательных функций. ------------------- Какой смысл усложнять решение , если загрузка этого файла займет микросекунды, а возможно ОС не будет грузить ее каждый раз снова.
Пардон, ошибся В данной теме написан вариант запуска приложения плеера из командной строки ---------------------------- Т е загрузка файла звука делается приложением плеера. Т е сначала грузится приложение плеер а оно грузит исполняемый файл. --------------------- Основное время затрачивается на загрузку приложения плеер. Но плюсом такого решения является то, что плеер работает в своем потоке. ---------------------- Вариант
Код
local x="C:/Windows/Media/Alarm10.wav"
local s="powershell -c (New-Object Media.SoundPlayer "..x..").PlaySync();"
for j=1,10 do os.execute(s); 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
Но оно делает тоже самое что и мой вариант, но для этого делается спец функция на СИ т е в этом решении вызова из командной строки, но через СИ.
Есть еще они способ о котором возможно мало кто знает. Я использую такое решение в своих умных устройствах и для отладки звуковых команд для них на луа. --------------------------- Берем модуль внешнего плеера (цена вопроса 1 доллар) подключаем его к USB и загружаем на него свои звуковые файлы . На выход модуля можно подключить динамики. Есть вариант модуля с памятью на чипе флеш либо с внешней флеш. Число таких файлов может быть тысячи В луа используется функция вывода на виртуальнуй UART. Выводим код любого файла и модуль его играет, а скрипт работает дальше. Время вывода команды на модуль несколько мкс. Кроме музыки, в модуле можно синтезировать предложения .
nikolz написал: Кроме музыки, в модуле можно синтезировать предложения .
Круть. На след. этапе можно сделать виртуальную дикторшу. А для простых смертных у mciSendString предусмотрено проигрывание звука с заданного смещения и заданной длительности.
nikolz написал: Кроме музыки, в модуле можно синтезировать предложения .
Круть. На след. этапе можно сделать виртуальную дикторшу. А для простых смертных у mciSendString предусмотрено проигрывание звука с заданного смещения и заданной длительности.
Так Вы ничего и не поняли. Поясняю. В начале темы написана одна строчка как воспроизвести звуковой файл. -------------------- Тоже самое что и ваша dll на основе устаревшей функции mciSendString. -------------- Т е не надо никаких dll для этого , понятно?
nikolz написал: Т е не надо никаких dll для этого , понятно?
Из моей темы, где я привёл свой пример на основе w32, было видно, что мне это понятно... И мне почему-то кажется, что SoundPlayer не может воспроизводить mp3.
Мне ваш пример с os.execute и 10-кратным появлением окна цмд перекрыл все стаканы... А если бы у меня в это время пошли сделки? Представляете свою материальную отвественность?
Serge123 написал: Мне ваш пример с os.execute и 10-кратным появлением окна цмд перекрыл все стаканы... А если бы у меня в это время пошли сделки? Представляете свою материальную отвественность?
Поэтому такой вариант плох. mciSendString - лучше. Либо наприсать свою dll с неустаревшей командой. Можно даже параллельно проигрывать звуки, если использовать правильную команду.
Если проигрывается WAV, то ничего не надо делать более. Если другой формат, то должна быть поддержка. MP3, кажется, тоже проигрывает без доп. усилий.
У меня оповещения на сработавший ордер иногда используются. Если бы это было с блокировкой через команду OPEN или с показом окна терминала, то при одновременном срабатывании нескольких ордеров будет печаль.
Nikolay написал: Можно даже проигрывать кусок из файла.
Я на те страницына сайте МС смотрел, не нашёл, как смешивать звуки. Я сейчас сделал аналог того, что у меня игралось в dll:
Код
#include <stdio.h>
#include <windows.h>
#include <Mmsystem.h>
int main()
{ if (!mciSendString("OPEN C:\\Windows\\Media\\chord.wav TYPE MpegVideo ALIAS QUIK_MP3", NULL, 0, NULL)) puts("fail");
mciSendString("PLAY QUIK_MP3", NULL, 0, NULL);
return 0;
}
Не играет, выдаёт fail. Не пойму, почему это работает в dll для Квика. Такое впечатление, что в консольной программе mciSendString не работает. А у вас как? Транслировать командой
В принципе, получился неплохой подарок к 8 Марта (а чем я хуже женщины?) Но неработоспособность в некоторых случаях омрачает предпраздничное настроение...
Для чего в Си и в Луа в путях ставят две обратных косых вместо оной прямой, ведь Виндовс в путях понимает одну прямую косую: C:/Windows/Media/Alarm09.wav?
Вернее, дело не в звуковом устройстве: в упрощённом варианте команд файлы с пробелами не играются, а в той форме, что была у w32, как помню, они игрались.
Serge123 написал: Вернее, дело не в звуковом устройстве: в упрощённом варианте команд файлы с пробелами не играются, а в той форме, что была у w32, как помню, они игрались.
Выкладываю исходник на варианте mciSendString
Код
static int mciSS(lua_State*L){
mciSendString((char*)lua_tostring(L,1),0,0,0);
if (lua_gettop(L)>1)SleepEx(lua_tointeger(L,2),1);
return 0; }
позволяет воспроизводить файлы wav, MP3, повторять, делать паузу
Рассказываю как просто сделать функцию для воспроизведения звука в различных форматах. Надо сделать на СИ dll для луа вот с такой функцией.
Код
static int mciSS(lua_State*L){ mciSendString((char*)lua_tostring(L,1),0,0,0); }
если кто-то не сможет ,пишите - выложу готовую dll. Далее у меня такая dll называется nks. Вызов функции в скрипте записан как nks.mciss ================= Поясняю как ее применять: =========== Чтобы воспроизвести файл в формате WAV надо открыть устройство с этим файлом так:
Код
local file="C:/Windows/Media/Alarm10.wav" -- звуковой файл
nks.mciss("open "..file.." alias MediaFile wait"); -- открыть устройство
Для воспроизведения содержимого файла пишем там , где хочется:
Код
nks.mciss("play MediaFile FROM 0 wait");
======================== Чтобы воспроизвести файл в формате MP3 надо сделать все тоже самое, но для этого файла Например у меня это файл "D:/nks/test.mp3"
Код
local file="D:/nks/test.mp3" -- звуковой файл
nks.mciss("open "..file.." alias MediaFile wait"); -- открыть устройство
Для воспроизведения содержимого файла пишем там, где хочется:
Код
nks.mciss("play MediaFile FROM 0 wait");
Опции : ---------------------------- Если Вам хочется запустить звук и не ждать, когда закончится, то уберите в последней команде "wait" ---------------------------- Если Вам хочется воспроизводить много различных звуков в разных местах скрипта, то в начале скрипта откройте все звуковые файлы и для каждого из них сделайте уникальное имя устройства. Его надо написать вместо "MediaFile" Для воспроизведения конкретного файла надо указать имя его устройства в команде воспроизведения вместо "MediaFile" ============== Желаю успешного прослушивания звуковых файлов.
Да, Вы правы. Команда Play не поддерживает команды с именами файлов, которые нельзя привести к короткому имени, т.е. с пробелами. Посмотрел внимательно на MCI. Он действительно старый.
Но работает в команде Open. Т.е. надо подавать две команды OPEN "C:\\Windows\\Media\\Windows Hardware Fail.wav" ALIAS SND1 PLAY SND1
Для остановки команда STOP SND1
Также такой подход будет означать, что после команды OPEN, в памяти сохранится ALIAS SND1. И повторно не надо уже открывать. Можно просто заново подать команду PLAY.