Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / dll / win32 / mmdrv / mme.c
diff --git a/dll/win32/mmdrv/mme.c b/dll/win32/mmdrv/mme.c
new file mode 100644 (file)
index 0000000..e66214d
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ *
+ * COPYRIGHT:            See COPYING in the top level directory
+ * PROJECT:              ReactOS Multimedia
+ * FILE:                 dll/win32/mmdrv/mme.c
+ * PURPOSE:              Multimedia User Mode Driver (MME Interface)
+ * PROGRAMMER:           Andrew Greenwood
+ *                       Aleksey Bragin
+ * UPDATE HISTORY:
+ *                       Jan 14, 2007: Rewritten and tidied up
+ */
+
+#include "mmdrv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+/*
+    Sends a message to the client (application), such as WOM_DONE. This
+    is just a wrapper around DriverCallback which translates the
+    parameters appropriately.
+*/
+
+BOOL
+NotifyClient(
+    SessionInfo* session_info,
+    DWORD message,
+    DWORD_PTR parameter1,
+    DWORD_PTR parameter2)
+{
+    return DriverCallback(session_info->callback,
+                          HIWORD(session_info->flags),
+                          session_info->mme_handle,
+                          message,
+                          session_info->app_user_data,
+                          parameter1,
+                          parameter2);
+}
+
+
+
+/*
+    MME Driver Entrypoint
+    Wave Output
+*/
+
+DWORD APIENTRY
+wodMessage(
+    UINT device_id,
+    UINT message,
+    DWORD_PTR private_handle,
+    DWORD_PTR parameter1,
+    DWORD_PTR parameter2)
+{
+    switch ( message )
+    {
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p80.htm */
+        case WODM_GETNUMDEVS :
+            DPRINT("WODM_GETNUMDEVS\n");
+            return GetDeviceCount(WaveOutDevice);
+
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p6h.htm */
+        case WODM_GETDEVCAPS :
+            DPRINT("WODM_GETDEVCAPS\n");
+            return GetDeviceCapabilities(WaveOutDevice,
+                                         device_id,
+                                         parameter1,
+                                         parameter2);
+
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p85.htm */
+        case WODM_OPEN :
+        {
+            WAVEOPENDESC* open_desc = (WAVEOPENDESC*) parameter1;
+            DPRINT("WODM_OPEN\n");
+
+            if ( parameter2 && WAVE_FORMAT_QUERY )
+                return QueryWaveFormat(WaveOutDevice, open_desc->lpFormat);
+            else
+                return OpenDevice(WaveOutDevice,
+                                  device_id,
+                                  open_desc,
+                                  parameter2,
+                                  private_handle);
+        }
+
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p6g.htm */
+        case WODM_CLOSE :
+        {
+            DPRINT("WODM_CLOSE\n");
+            return CloseDevice(private_handle);
+        }
+
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p9w.htm */
+        case WODM_WRITE :
+        {
+            DPRINT("WODM_WRITE\n");
+            return WriteWaveBuffer(private_handle,
+                                   (PWAVEHDR) parameter1,
+                                   parameter2);
+        }
+
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p86.htm */
+        case WODM_PAUSE :
+        {
+            DPRINT("WODM_PAUSE\n");
+            return HandleBySessionThread(private_handle, message, 0);
+        }
+
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p89.htm */
+        case WODM_RESTART :
+        {
+            DPRINT("WODM_RESTART\n");
+            return HandleBySessionThread(private_handle, message, 0);
+        }
+
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p88.htm */
+        case WODM_RESET :
+        {
+            DPRINT("WODM_RESET\n");
+            return HandleBySessionThread(private_handle, message, 0);
+        }
+
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p83.htm */
+#if 0
+        case WODM_GETPOS :
+        {
+            DPRINT("WODM_GETPOS\n");
+            return GetPosition(private_handle,
+                               (PMMTIME) parameter1,
+                               parameter2);
+        }
+#endif
+
+        /* http://www.osronline.com/ddkx/w98ddk/mmedia_4p6f.htm */
+        case WODM_BREAKLOOP :
+        {
+            DPRINT("WODM_BREAKLOOP\n");
+            return HandleBySessionThread(private_handle, message, 0);
+        }
+
+        /* TODO: Others */
+    }
+
+    DPRINT("Unsupported message\n");
+    return MMSYSERR_NOTSUPPORTED;
+}