[AUDIO-BRINGUP]
[reactos.git] / dll / win32 / wdmaud.drv / mmixer.c
index 9caa8c9..a98418a 100644 (file)
@@ -15,6 +15,7 @@ typedef struct
     HANDLE hDevice;
     PSOUND_OVERLAPPED Overlap;
     LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine;
+    DWORD IoCtl;
 }IO_PACKET, *LPIO_PACKET;
 
 BOOL MMixerLibraryInitialized = FALSE;
@@ -121,7 +122,7 @@ Free(PVOID Block)
 VOID
 Copy(PVOID Src, PVOID Dst, ULONG NumBytes)
 {
-    CopyMemory(Src, Dst, NumBytes);
+    RtlMoveMemory(Src, Dst, NumBytes);
 }
 
 MIXER_STATUS
@@ -293,7 +294,6 @@ Enum(
         HeapFree(GetProcessHeap(), 0, DetailData);
         return MM_STATUS_NO_MEMORY;
     }
-       DPRINT1("DeviceName %S\n", DetailData->DevicePath);
     wcscpy(*DeviceName, DetailData->DevicePath);
     HeapFree(GetProcessHeap(), 0, DetailData);
 
@@ -384,7 +384,7 @@ WdmAudCleanupByMMixer()
 
 MMRESULT
 WdmAudGetMixerCapabilties(
-    IN ULONG DeviceId, 
+    IN ULONG DeviceId,
     LPMIXERCAPSW Capabilities)
 {
     if (MMixerGetCapabilities(&MixerContext, DeviceId, Capabilities) == MM_STATUS_SUCCESS)
@@ -396,10 +396,11 @@ WdmAudGetMixerCapabilties(
 MMRESULT
 WdmAudGetLineInfo(
     IN HANDLE hMixer,
+    IN DWORD MixerId,
     IN LPMIXERLINEW MixLine,
     IN ULONG Flags)
 {
-    if (MMixerGetLineInfo(&MixerContext, hMixer, Flags, MixLine)  == MM_STATUS_SUCCESS)
+    if (MMixerGetLineInfo(&MixerContext, hMixer, MixerId, Flags, MixLine)  == MM_STATUS_SUCCESS)
         return MMSYSERR_NOERROR;
 
     return MMSYSERR_ERROR;
@@ -408,10 +409,11 @@ WdmAudGetLineInfo(
 MMRESULT
 WdmAudGetLineControls(
     IN HANDLE hMixer,
+    IN DWORD MixerId,
     IN LPMIXERLINECONTROLSW MixControls,
     IN ULONG Flags)
 {
-    if (MMixerGetLineControls(&MixerContext, hMixer, Flags, MixControls) == MM_STATUS_SUCCESS)
+    if (MMixerGetLineControls(&MixerContext, hMixer, MixerId, Flags, MixControls) == MM_STATUS_SUCCESS)
         return MMSYSERR_NOERROR;
 
     return MMSYSERR_ERROR;
@@ -420,10 +422,11 @@ WdmAudGetLineControls(
 MMRESULT
 WdmAudSetControlDetails(
     IN HANDLE hMixer,
+    IN DWORD MixerId,
     IN LPMIXERCONTROLDETAILS MixDetails,
     IN ULONG Flags)
 {
-    if (MMixerSetControlDetails(&MixerContext, hMixer, Flags, MixDetails) == MM_STATUS_SUCCESS)
+    if (MMixerSetControlDetails(&MixerContext, hMixer, MixerId, Flags, MixDetails) == MM_STATUS_SUCCESS)
         return MMSYSERR_NOERROR;
 
     return MMSYSERR_ERROR;
@@ -433,10 +436,11 @@ WdmAudSetControlDetails(
 MMRESULT
 WdmAudGetControlDetails(
     IN HANDLE hMixer,
+    IN DWORD MixerId,
     IN LPMIXERCONTROLDETAILS MixDetails,
     IN ULONG Flags)
 {
-    if (MMixerGetControlDetails(&MixerContext, hMixer, Flags, MixDetails) == MM_STATUS_SUCCESS)
+    if (MMixerGetControlDetails(&MixerContext, hMixer, MixerId, Flags, MixDetails) == MM_STATUS_SUCCESS)
         return MMSYSERR_NOERROR;
 
     return MMSYSERR_ERROR;
@@ -610,6 +614,7 @@ WdmAudGetNumWdmDevsByMMixer(
 MMRESULT
 WdmAudQueryMixerInfoByMMixer(
     IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+    IN DWORD MixerId,
     IN UINT uMsg,
     IN LPVOID Parameter,
     IN DWORD Flags)
@@ -617,6 +622,7 @@ WdmAudQueryMixerInfoByMMixer(
     LPMIXERLINEW MixLine;
     LPMIXERLINECONTROLSW MixControls;
     LPMIXERCONTROLDETAILS MixDetails;
+    HANDLE hMixer = NULL;
 
     MixLine = (LPMIXERLINEW)Parameter;
     MixControls = (LPMIXERLINECONTROLSW)Parameter;
@@ -624,19 +630,23 @@ WdmAudQueryMixerInfoByMMixer(
 
     /* FIXME param checks */
 
+    if (SoundDeviceInstance)
+    {
+        hMixer = SoundDeviceInstance->Handle;
+    }
+
     switch(uMsg)
     {
         case MXDM_GETLINEINFO:
-            return WdmAudGetLineInfo(SoundDeviceInstance->Handle, MixLine, Flags);
+            return WdmAudGetLineInfo(hMixer, MixerId, MixLine, Flags);
         case MXDM_GETLINECONTROLS:
-            return WdmAudGetLineControls(SoundDeviceInstance->Handle, MixControls, Flags);
+            return WdmAudGetLineControls(hMixer, MixerId, MixControls, Flags);
        case MXDM_SETCONTROLDETAILS:
-            return WdmAudSetControlDetails(SoundDeviceInstance->Handle, MixDetails, Flags);
-            break;
+            return WdmAudSetControlDetails(hMixer, MixerId, MixDetails, Flags);
        case MXDM_GETCONTROLDETAILS:
-            return WdmAudGetControlDetails(SoundDeviceInstance->Handle, MixDetails, Flags);
-            break;
+            return WdmAudGetControlDetails(hMixer, MixerId, MixDetails, Flags);
        default:
+           DPRINT1("MixerId %lu, uMsg %lu, Parameter %p, Flags %lu\n", MixerId, uMsg, Parameter, Flags);
            SND_ASSERT(0);
            return MMSYSERR_NOTSUPPORTED;
     }
@@ -654,6 +664,25 @@ WdmAudGetDeviceInterfaceStringByMMixer(
     return MMSYSERR_NOTSUPPORTED;
 }
 
+VOID
+CALLBACK
+MixerEventCallback(
+    IN PVOID MixerEventContext,
+    IN HANDLE hMixer,
+    IN ULONG NotificationType,
+    IN ULONG Value)
+{
+    PSOUND_DEVICE_INSTANCE Instance = (PSOUND_DEVICE_INSTANCE)MixerEventContext;
+
+    DriverCallback(Instance->WinMM.ClientCallback,
+                   HIWORD(Instance->WinMM.Flags),
+                   Instance->WinMM.Handle,
+                   NotificationType,
+                   Instance->WinMM.ClientCallbackInstanceData,
+                   (DWORD_PTR)Value,
+                   0);
+}
+
 MMRESULT
 WdmAudSetMixerDeviceFormatByMMixer(
     IN  PSOUND_DEVICE_INSTANCE Instance,
@@ -661,11 +690,7 @@ WdmAudSetMixerDeviceFormatByMMixer(
     IN  PWAVEFORMATEX WaveFormat,
     IN  DWORD WaveFormatSize)
 {
-    Instance->hNotifyEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
-    if ( ! Instance->hNotifyEvent )
-        return MMSYSERR_NOMEM;
-
-    if (MMixerOpen(&MixerContext, DeviceId, Instance->hNotifyEvent, NULL /* FIXME */, &Instance->Handle) == MM_STATUS_SUCCESS)
+    if (MMixerOpen(&MixerContext, DeviceId, (PVOID)Instance, MixerEventCallback, &Instance->Handle) == MM_STATUS_SUCCESS)
         return MMSYSERR_NOERROR;
 
     return MMSYSERR_BADDEVICEID;
@@ -727,7 +752,19 @@ WdmAudResetStreamByMMixer(
     IN  MMDEVICE_TYPE DeviceType,
     IN  BOOLEAN bStartReset)
 {
-    /* FIXME */
+    MIXER_STATUS Status;
+
+    if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
+    {
+        Status = MMixerSetWaveResetState(&MixerContext, SoundDeviceInstance->Handle, bStartReset);
+        if (Status == MM_STATUS_SUCCESS)
+        {
+            /* completed successfully */
+            return MMSYSERR_NOERROR;
+        }
+    }
+
+
     return MMSYSERR_NOTSUPPORTED;
 }
 
@@ -750,29 +787,19 @@ IoStreamingThread(
     LPIO_PACKET Packet = (LPIO_PACKET)lpParameter;
 
     Result =  SyncOverlappedDeviceIoControl(Packet->hDevice,
-                    IOCTL_KS_WRITE_STREAM, //FIXME IOCTL_KS_READ_STREAM
+                    Packet->IoCtl,
                     NULL,
                     0,
                     &Packet->Header,
                     sizeof(KSSTREAM_HEADER),
                     &Length);
 
-    /* HACK:
-     * don't call completion routine directly
-     */
-
     Packet->CompletionRoutine(ERROR_SUCCESS, Packet->Header.DataUsed, (LPOVERLAPPED)Packet->Overlap);
 
     HeapFree(GetProcessHeap(), 0, Packet);
     return 0;
 }
 
-
-
-
-
-
-
 MMRESULT
 WdmAudCommitWaveBufferByMMixer(
     IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
@@ -813,6 +840,7 @@ WdmAudCommitWaveBufferByMMixer(
     Packet->hDevice = SoundDeviceInstance->Handle;
     Packet->Overlap = Overlap;
     Packet->CompletionRoutine = CompletionRoutine;
+    Packet->IoCtl = (DeviceType == WAVE_OUT_DEVICE_TYPE ? IOCTL_KS_WRITE_STREAM : IOCTL_KS_READ_STREAM);
 
     if (DeviceType == WAVE_OUT_DEVICE_TYPE)
     {