diff --git a/src/Makefile.am b/src/Makefile.am
index c43f4c8d38..b1c3be4934 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -400,6 +400,10 @@ if WINDOWS
if HAVE_PARALLEL_PORT
Lights += arch/Lights/LightsDriver_Win32Parallel.cpp arch/Lights/LightsDriver_Win32Parallel.h
endif
+
+if HAVE_MINIMAID
+ Lights += arch/Lights/LightsDriver_Win32Minimaid.cpp arch/Lights/LightsDriver_Win32Minimaid.h
+endif
if !HAVE_PTHREAD
Threads += arch/Threads/Threads_Win32.cpp arch/Threads/Threads_Win32.h
diff --git a/src/StepMania-net2008.vcproj b/src/StepMania-net2008.vcproj
index b7993c0bf3..6f0bd4bf78 100644
--- a/src/StepMania-net2008.vcproj
+++ b/src/StepMania-net2008.vcproj
@@ -2430,6 +2430,14 @@
RelativePath="arch\Lights\LightsDriver_SystemMessage.h"
>
+
+
+
+
diff --git a/src/StepMania-net2010.vcxproj b/src/StepMania-net2010.vcxproj
index 14303661dc..a296a39375 100644
--- a/src/StepMania-net2010.vcxproj
+++ b/src/StepMania-net2010.vcxproj
@@ -580,6 +580,7 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)
+
@@ -1898,6 +1899,7 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)
+
diff --git a/src/StepMania-net2010.vcxproj.filters b/src/StepMania-net2010.vcxproj.filters
index 718d8b3c93..94642bc4c2 100644
--- a/src/StepMania-net2010.vcxproj.filters
+++ b/src/StepMania-net2010.vcxproj.filters
@@ -747,6 +747,9 @@
StepMania\arch\Lights
+
+ StepMania\arch\Lights
+
StepMania\arch\Lights
@@ -2270,6 +2273,9 @@
StepMania\arch\Lights
+
+ StepMania\arch\Lights
+
StepMania\arch\Lights
diff --git a/src/StepMania-net2011.vcxproj b/src/StepMania-net2011.vcxproj
index 901f8608db..1424c89ba2 100644
--- a/src/StepMania-net2011.vcxproj
+++ b/src/StepMania-net2011.vcxproj
@@ -606,6 +606,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"
+
@@ -1484,6 +1485,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"
+
diff --git a/src/StepMania-net2011.vcxproj.filters b/src/StepMania-net2011.vcxproj.filters
index 22f3d05525..b230a7d580 100644
--- a/src/StepMania-net2011.vcxproj.filters
+++ b/src/StepMania-net2011.vcxproj.filters
@@ -735,6 +735,9 @@
StepMania\arch\Lights
+
+ StepMania\arch\Lights
+
StepMania\arch\Lights
@@ -2108,6 +2111,9 @@
StepMania\arch\Lights
+
+ StepMania\arch\Lights
+
StepMania\arch\Lights
diff --git a/src/StepMania-net2013.vcxproj b/src/StepMania-net2013.vcxproj
index 8121d7e9cb..48656c83cd 100644
--- a/src/StepMania-net2013.vcxproj
+++ b/src/StepMania-net2013.vcxproj
@@ -605,6 +605,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"
+
@@ -1923,6 +1924,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"
+
diff --git a/src/StepMania-net2013.vcxproj.filters b/src/StepMania-net2013.vcxproj.filters
index 4254fdd875..561138996c 100644
--- a/src/StepMania-net2013.vcxproj.filters
+++ b/src/StepMania-net2013.vcxproj.filters
@@ -747,6 +747,9 @@
StepMania\arch\Lights
+
+ StepMania\arch\Lights
+
StepMania\arch\Lights
@@ -2270,6 +2273,9 @@
StepMania\arch\Lights
+
+ StepMania\arch\Lights
+
StepMania\arch\Lights
diff --git a/src/arch/Lights/LightsDriver_Win32Minimaid.cpp b/src/arch/Lights/LightsDriver_Win32Minimaid.cpp
new file mode 100644
index 0000000000..96326de09f
--- /dev/null
+++ b/src/arch/Lights/LightsDriver_Win32Minimaid.cpp
@@ -0,0 +1,100 @@
+// LightsDriver_Win32Minimaid - driver for lights on the Minimaid with libmmmagic
+/* To use, StepMania must be run with root permissions, or udev rule for the
+ * device must be made something like this (but it's not quite right):
+ * echo SUBSYSTEM==\"usb\", ATTR{idVendor}==\"beef\", ATTR{idProduct}==\"5730\", MODE=\"0666\" > /etc/udev/rules.d/50-minimaid
+ */
+
+#include "global.h"
+#include "LightsDriver_Win32Minimaid.h"
+#include "windows.h"
+
+REGISTER_SOUND_DRIVER_CLASS( Win32Minimaid );
+
+HINSTANCE hMMMAGICDLL = NULL;
+
+LightsDriver_Win32Minimaid::LightsDriver_Win32Minimaid()
+{
+ _mmmagic_loaded=false;
+ hMMMAGICDLL = LoadLibraryW(L"mmmagic.dll");
+ if(hMMMAGICDLL == NULL)
+ {
+ MessageBox(NULL, "Could not LoadLibrary( mmmagic.dll ).", "ERROR", MB_OK );
+ return;
+ }
+ _mmmagic_loaded=true;
+
+ // Get the function pointers
+ mm_connect_minimaid = (MM_CONNECT_MINIMAID) GetProcAddress(hMMMAGICDLL, "mm_connect_minimaid");
+ mm_setKB = (MM_SETKB) GetProcAddress(hMMMAGICDLL, "mm_setKB");
+ mm_setDDRPad1Light = (MM_SETDDRPAD1LIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRPad1Light");
+ mm_setDDRPad2Light = (MM_SETDDRPAD2LIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRPad2Light");
+ mm_setDDRCabinetLight = (MM_SETCABINETLIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRCabinetLight");
+ mm_setDDRBassLight = (MM_SETDDRBASSLIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRBassLight");
+ mm_setDDRAllOn = (MM_SETDDRALLON) GetProcAddress(hMMMAGICDLL, "mm_setDDRAllOn");
+ mm_setDDRAllOff = (MM_SETDDRALLOFF) GetProcAddress(hMMMAGICDLL, "mm_setDDRAllOff");
+ mm_setBlueLED = (MM_SETBLUELED) GetProcAddress(hMMMAGICDLL, "mm_setBlueLED");
+ mm_setMMOutputReports = (MM_SETMMOUTPUTREPORTS) GetProcAddress(hMMMAGICDLL, "mm_setMMOutputReports");
+ mm_sendDDRMiniMaidUpdate= (MM_SENDDDRMINIMAIDUPDATE) GetProcAddress(hMMMAGICDLL, "mm_sendDDRMiniMaidUpdate");
+ mm_connect_minimaid();
+ mm_setKB(true);
+}
+
+LightsDriver_Win32Minimaid::~LightsDriver_Win32Minimaid()
+{
+ if(_mmmagic_loaded)
+ FreeLibrary( hMMMAGICDLL );
+}
+
+void LightsDriver_Win32Minimaid::Set( const LightsState *ls )
+{
+ if(_mmmagic_loaded)
+ {
+ mm_setDDRAllOff();
+
+ // Set the cabinet light values
+ if (ls->m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT]) mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_UPPER_LEFT, 1);
+ if (ls->m_bCabinetLights[LIGHT_MARQUEE_UP_RIGHT]) mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_UPPER_RIGHT, 1);
+ if (ls->m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT]) mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_LOWER_LEFT, 1);
+ if (ls->m_bCabinetLights[LIGHT_MARQUEE_LR_RIGHT]) mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_LOWER_RIGHT, 1);
+ if (ls->m_bCabinetLights[LIGHT_BASS_LEFT] || ls->m_bCabinetLights[LIGHT_BASS_RIGHT]) mm_setDDRBassLight(DDR_DOUBLE_BASS_LIGHTS, 1);
+
+ if (ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_LEFT]) mm_setDDRPad1Light(DDR_DOUBLE_PAD_LEFT, 1);
+ if (ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_RIGHT]) mm_setDDRPad1Light(DDR_DOUBLE_PAD_RIGHT, 1);
+ if (ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_UP]) mm_setDDRPad1Light(DDR_DOUBLE_PAD_UP, 1);
+ if (ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_DOWN]) mm_setDDRPad1Light(DDR_DOUBLE_PAD_DOWN, 1);
+ if (ls->m_bGameButtonLights[GameController_1][GAME_BUTTON_START]) mm_setDDRCabinetLight(DDR_DOUBLE_PLAYER1_PANEL, 1);
+ if (ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_LEFT]) mm_setDDRPad2Light(DDR_DOUBLE_PAD_LEFT, 1);
+ if (ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_RIGHT]) mm_setDDRPad2Light(DDR_DOUBLE_PAD_RIGHT, 1);
+ if (ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_UP]) mm_setDDRPad2Light(DDR_DOUBLE_PAD_UP, 1);
+ if (ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_DOWN]) mm_setDDRPad2Light(DDR_DOUBLE_PAD_DOWN, 1);
+ if (ls->m_bGameButtonLights[GameController_2][GAME_BUTTON_START]) mm_setDDRCabinetLight(DDR_DOUBLE_PLAYER2_PANEL, 1);
+
+ // Output the information
+ mm_sendDDRMiniMaidUpdate();
+ }
+}
+
+/*
+ * (c) 2013 pkgingo
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons to
+ * whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
+ * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
+ * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
diff --git a/src/arch/Lights/LightsDriver_Win32Minimaid.h b/src/arch/Lights/LightsDriver_Win32Minimaid.h
new file mode 100644
index 0000000000..6bdaa59615
--- /dev/null
+++ b/src/arch/Lights/LightsDriver_Win32Minimaid.h
@@ -0,0 +1,99 @@
+/* LightsDriver_Win32Minimaid - Minimaid based lights with libmmmagic */
+
+#ifndef LightsDriver_Win32Minimaid_H
+#define LightsDriver_Win32Minimaid_H
+
+#include "LightsDriver.h"
+
+#define DDR_DOUBLE_BASS_LIGHTS 0 //unknown but guessed
+#define DDR_DOUBLE_PLAYER1_PANEL 2
+#define DDR_DOUBLE_PLAYER2_PANEL 3
+#define DDR_DOUBLE_MARQUEE_LOWER_RIGHT 4
+#define DDR_DOUBLE_MARQUEE_UPPER_RIGHT 5
+#define DDR_DOUBLE_MARQUEE_LOWER_LEFT 6
+#define DDR_DOUBLE_MARQUEE_UPPER_LEFT 7
+
+//PADX_LIGHTS
+#define DDR_DOUBLE_PAD_UP 0
+#define DDR_DOUBLE_PAD_DOWN 1
+#define DDR_DOUBLE_PAD_LEFT 2
+#define DDR_DOUBLE_PAD_RIGHT 3
+#define DDR_DOUBLE_PAD_RESET 4
+
+#define BIT(i) (1<<(i))
+#define BIT_IS_SET(v,i) ((v&BIT(i))!=0)
+
+static bool _mmmagic_loaded=false;
+
+typedef bool (*__BITVALID)(int);
+static __BITVALID __bitValid;
+
+// minimaid prototypes
+typedef void (*MM_SETDDRPAD1LIGHT)(int, int);
+typedef void (*MM_SETDDRPAD2LIGHT)(int, int);
+typedef void (*MM_SETCABINETLIGHT)(int, int);
+typedef void (*MM_SETDDRBASSLIGHT)(int, int);
+static MM_SETDDRPAD1LIGHT mm_setDDRPad1Light;
+static MM_SETDDRPAD2LIGHT mm_setDDRPad2Light;
+static MM_SETCABINETLIGHT mm_setDDRCabinetLight;
+static MM_SETDDRBASSLIGHT mm_setDDRBassLight;
+
+typedef bool (*MM_CONNECT_MINIMAID)();
+typedef bool (*MM_SETKB)(bool val);
+static MM_CONNECT_MINIMAID mm_connect_minimaid;
+static MM_SETKB mm_setKB;
+
+typedef void (*MM_SETDDRALLON)();
+typedef void (*MM_SETDDRALLOFF)();
+static MM_SETDDRALLON mm_setDDRAllOn;
+static MM_SETDDRALLOFF mm_setDDRAllOff;
+
+typedef void (*MM_SETBLUELED)(unsigned char);
+typedef void (*MM_SETMMOUTPUTREPORTS)(unsigned char, unsigned char, unsigned char, unsigned char);
+typedef bool (*MM_SENDDDRMINIMAIDUPDATE)();
+static MM_SETBLUELED mm_setBlueLED;
+static MM_SETMMOUTPUTREPORTS mm_setMMOutputReports;
+static MM_SENDDDRMINIMAIDUPDATE mm_sendDDRMiniMaidUpdate;
+
+typedef void (*MM_INIT)();
+typedef void (*MM_TURNON)(unsigned char, int);
+typedef bool (*MM_TURNOFF)(unsigned char, int);
+static MM_INIT mm_init;
+static MM_TURNON mm_turnON;
+static MM_TURNOFF mm_turnOFF;
+
+class LightsDriver_Win32Minimaid : public LightsDriver
+{
+public:
+ LightsDriver_Win32Minimaid();
+
+ virtual ~LightsDriver_Win32Minimaid();
+ virtual void Set( const LightsState *ls );
+};
+
+#endif
+
+/*
+ * (c) 2013 pkgingo
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons to
+ * whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
+ * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
+ * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */