Звук через mciSendString и MessageBeep

Страницы: 1
RSS
Звук через mciSendString и MessageBeep
 
Немного подправил пример, который видел на стр. https://quik2dde.ru/viewtopic.php?id=79
dll файл получился меньше 20 Кб. Искал примеры, чтобы не выскакивало окно консоли, смотрел примеры через виндовс скрипт хост (расширение файла .vbs). Если запускать в Проводнике, то окнА консоли нет, а если в Квике, то есть, не понял, почему...

Убрал проверку на ошибки. mci с MessageBeep микшируется, а mci с mci не смог смикшировать. И в том и моём примере mci устройство после завершения скрипта остаётся открытым. В OnStop или в OnClose надо бы закрыть, или ну его? Я пробовал вставить mciSendString("CLOSE QUIK_MP3", NULL, 0, NULL); в DllMain, когда приходит сообщение DLL_THREAD_DETACH, опять нарвался на зависание Квика...

МС пишет, что в вин10 mci устарел:
https://learn.microsoft.com/ru-ru/windows/win32/multimedia/mci-commands
Может, есть уже примеры с использованием MediaPlayer?

Кто-то в dll использует
Код
#define LUA_LIB
#define LUA_BUILD_AS_DLL
кто-то нет, я не увидел различий, по-всякому работает.

Компилировать можно примеро так:
Код
gcc.exe playsnddll.c -o playsnddll.dll -mdll -O2 -s -L. -llua54 -lWinmm -m64 -std=c17
Это playsnddll.dll.c:
Скрытый текст

Это playsnd.lua:
Скрытый текст
 
Попробовал играть звук через PlaySound, почему-то не играет звук асинхронно и ошибку не возвращает, как было сказано на стр. https://learn.microsoft.com/en-us/previous-versions//dd743680(v=vs.85)

Вот пример программы:
Код
#include <stdio.h>
#include <windows.h>
#include <Mmsystem.h>

int main()
{ char *sname = "C:\\Windows\\Media\\chord.wav";

  if (PlaySound(sname, NULL, SND_FILENAME | SND_ASYNC)) puts("Success\n");
  if (!PlaySound("SystemDefault", NULL, SND_ALIAS | SND_SYNC)) puts("Fail\n");
  return 0;
}
Вот компиляция:
Код
gcc.exe playsnd.c -o playsnd.exe -O2 -s -lWinmm -m64 -std=c17
Кто что скажет, почему асинхронно не работает? Или это только у меня так?
 
Оказывается, был уже похожий пример: https://forum.quik.ru/messages/forum10/message44608/topic5389/#message44608
 
Вопрос, почему mciSendString в консольной программе не выдаёт звук, так и остался открытым...
 
Цитата
Serge123 написал:
Вопрос, почему mciSendString в консольной программе не выдаёт звук, так и остался открытым...
Ну например, может оно как-то использует оконные сообщения.
 
Цитата
paluke написал:
Ну например, может оно как-то использует оконные сообщения.
Сомнительно: не видно логики для неработоспособности этой функции в консольных программах. И в документации на сайте МС нет такого предупреждения... Аналогично для более современной функции PlaySound.
Как тогда МС вообще планирует использование звука в консольных программах??
 
Цитата
Serge123 написал:
Цитата
paluke написал:
Ну например, может оно как-то использует оконные сообщения.
Сомнительно: не видно логики для неработоспособности этой функции в консольных программах. И в документации на сайте МС нет такого предупреждения... Аналогично для более современной функции PlaySound.
Как тогда МС вообще планирует использование звука в консольных программах??
Вроде все работает.
Попробуйте сделать такую функцию  в dll  и добавьте sF в таблицу luaL_Reg
В данном примере это luaL_Reg nks[]
Код
void WINAPI soundF(char*ps,long m){ PlaySound(ps,GetModuleHandle(NULL), SND_FILENAME|SND_ASYNC);if (m)SleepEx(m,TRUE); }
static int sF(lua_State*L){ soundF((char*)lua_tostring(L,1),lua_tointeger(L,2));return 0; }
в луа надо вызывать так:
Код
local x="C:/Windows/Media/Alarm10.wav" -- звуковой файл
nks.sF(x,1000);
Страницы: 1
Читают тему
Наверх