From: Anton Baskanov baskanov@gmail.com
--- configure | 2 + configure.ac | 1 + dlls/wineswmidi/Makefile.in | 4 ++ dlls/wineswmidi/swmidi.c | 72 +++++++++++++++++++++++++++++++++ dlls/wineswmidi/wineswmidi.spec | 3 ++ dlls/winmm/lolvldrv.c | 1 + dlls/winmm/tests/midi.c | 5 ++- 7 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 dlls/wineswmidi/Makefile.in create mode 100644 dlls/wineswmidi/swmidi.c create mode 100644 dlls/wineswmidi/wineswmidi.spec
diff --git a/configure b/configure index 928f3430e4b..b5b10ee52c4 100755 --- a/configure +++ b/configure @@ -1527,6 +1527,7 @@ enable_winemapi enable_wineoss_drv enable_wineps_drv enable_winepulse_drv +enable_wineswmidi enable_wineusb_sys enable_winevulkan enable_winewayland_drv @@ -22935,6 +22936,7 @@ wine_fn_config_makefile dlls/wineoss.drv enable_wineoss_drv wine_fn_config_makefile dlls/wineps.drv enable_wineps_drv wine_fn_config_makefile dlls/wineps16.drv16 enable_win16 wine_fn_config_makefile dlls/winepulse.drv enable_winepulse_drv +wine_fn_config_makefile dlls/wineswmidi enable_wineswmidi wine_fn_config_makefile dlls/wineusb.sys enable_wineusb_sys wine_fn_config_makefile dlls/winevulkan enable_winevulkan wine_fn_config_makefile dlls/winewayland.drv enable_winewayland_drv diff --git a/configure.ac b/configure.ac index 5f9e63b6f9f..a9ed473e727 100644 --- a/configure.ac +++ b/configure.ac @@ -3274,6 +3274,7 @@ WINE_CONFIG_MAKEFILE(dlls/wineoss.drv) WINE_CONFIG_MAKEFILE(dlls/wineps.drv) WINE_CONFIG_MAKEFILE(dlls/wineps16.drv16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/winepulse.drv) +WINE_CONFIG_MAKEFILE(dlls/wineswmidi) WINE_CONFIG_MAKEFILE(dlls/wineusb.sys) WINE_CONFIG_MAKEFILE(dlls/winevulkan) WINE_CONFIG_MAKEFILE(dlls/winewayland.drv) diff --git a/dlls/wineswmidi/Makefile.in b/dlls/wineswmidi/Makefile.in new file mode 100644 index 00000000000..26acbef4b9b --- /dev/null +++ b/dlls/wineswmidi/Makefile.in @@ -0,0 +1,4 @@ +MODULE = wineswmidi.dll + +SOURCES = \ + swmidi.c diff --git a/dlls/wineswmidi/swmidi.c b/dlls/wineswmidi/swmidi.c new file mode 100644 index 00000000000..ab098a21f2e --- /dev/null +++ b/dlls/wineswmidi/swmidi.c @@ -0,0 +1,72 @@ +/* + * MIDI driver for software synthesizer + * + * Copyright 2025 Anton Baskanov + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> + +#include "windef.h" +#include "mmddk.h" +#include "mmdeviceapi.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(midi); + +DWORD WINAPI swmidi_modMessage(UINT dev_id, UINT msg, DWORD_PTR user, DWORD_PTR param1, + DWORD_PTR param2) +{ + TRACE("dev_id %u, msg %x, user %#Ix, param1 %#Ix, param2 %#Ix.\n", dev_id, msg, user, param1, + param2); + + switch (msg) + { + case DRVM_INIT: + case DRVM_EXIT: + return MMSYSERR_NOERROR; + case MODM_GETNUMDEVS: + return 1; + } + + return MMSYSERR_NOTSUPPORTED; +} + +LRESULT CALLBACK swmidi_DriverProc(DWORD_PTR dev_id, HDRVR drvr, UINT msg, LPARAM param1, + LPARAM param2) +{ + TRACE("dev_id %Iu, drvr %p, msg %x, param1 %#Ix, param2 %#Ix.\n", dev_id, drvr, msg, param1, + param2); + + switch(msg) + { + case DRV_LOAD: + case DRV_FREE: + case DRV_OPEN: + case DRV_CLOSE: + case DRV_ENABLE: + case DRV_DISABLE: + case DRV_QUERYCONFIGURE: + return DRV_SUCCESS; + case DRV_CONFIGURE: + case DRV_INSTALL: + case DRV_REMOVE: + return DRVCNF_OK; + } + + return DRV_FAILURE; +} diff --git a/dlls/wineswmidi/wineswmidi.spec b/dlls/wineswmidi/wineswmidi.spec new file mode 100644 index 00000000000..03b701e95c8 --- /dev/null +++ b/dlls/wineswmidi/wineswmidi.spec @@ -0,0 +1,3 @@ +# WinMM driver functions +@ stdcall -private DriverProc(long long long long long) swmidi_DriverProc +@ stdcall -private modMessage(long long long long long) swmidi_modMessage diff --git a/dlls/winmm/lolvldrv.c b/dlls/winmm/lolvldrv.c index e664021dc64..cf61fbce06d 100644 --- a/dlls/winmm/lolvldrv.c +++ b/dlls/winmm/lolvldrv.c @@ -538,6 +538,7 @@ static void MMDRV_Init(void) free(drvA); PropVariantClear(&pv);
+ MMDRV_Install("swmidi", "wineswmidi.dll", FALSE); MMDRV_Install("wavemapper", "msacm32.drv", TRUE); MMDRV_Install("midimapper", "midimap.dll", TRUE);
diff --git a/dlls/winmm/tests/midi.c b/dlls/winmm/tests/midi.c index 70a5375f1cb..8be1ace09fc 100644 --- a/dlls/winmm/tests/midi.c +++ b/dlls/winmm/tests/midi.c @@ -279,9 +279,12 @@ static void test_midiOut_device(UINT udev, HWND hwnd) DWORD ovolume; UINT udevid; MIDIHDR mhdr; + BOOL swmidi; + + swmidi = udev == midiOutGetNumDevs() - 1;
rc = midiOutGetDevCapsA(udev, &capsA, sizeof(capsA)); - ok(!rc, "midiOutGetDevCaps(dev=%d) rc=%s\n", udev, mmsys_error(rc)); + todo_wine_if(swmidi) ok(!rc, "midiOutGetDevCaps(dev=%d) rc=%s\n", udev, mmsys_error(rc)); if (!rc) { trace("* %s: manufacturer=%d, product=%d, tech=%d, support=%lX: %d voices, %d notes\n", capsA.szPname, capsA.wMid, capsA.wPid, capsA.wTechnology, capsA.dwSupport, capsA.wVoices, capsA.wNotes);