[AUDIO-BRINGUP]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Fri, 3 Dec 2010 16:49:33 +0000 (16:49 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Fri, 3 Dec 2010 16:49:33 +0000 (16:49 +0000)
- Pass audio device id to wdmaud.drv callback functions
- Extend VALIDATE_MMSYS_PARAMETER macro
- Handle case when the caller does not pass handle of mixer, but a device id
- Pass device id to mmixer library
- Remove dead code
- MS sndvol32.exe now gets further, but crashes in user32 IntCallMessageProc

svn path=/branches/audio-bringup/; revision=49931

dll/win32/wdmaud.drv/mmixer.c
dll/win32/wdmaud.drv/wdmaud.h
include/reactos/libs/sound/mmebuddy.h
lib/drivers/sound/mmebuddy/mixer/mxdMessage.c
lib/drivers/sound/mmixer/mixer.c
lib/drivers/sound/mmixer/mmixer.h

index 9caa8c9..764c33b 100644 (file)
@@ -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;
     }
index 2dda68f..49cd74e 100644 (file)
@@ -69,24 +69,28 @@ WdmAudCloseSoundDeviceByMMixer(
 MMRESULT
 WdmAudGetLineInfo(
     IN HANDLE hMixer,
+    IN DWORD MixerId,
     IN LPMIXERLINEW MixLine,
     IN ULONG Flags);
 
 MMRESULT
 WdmAudGetLineControls(
     IN HANDLE hMixer,
+    IN DWORD MixerId,
     IN LPMIXERLINECONTROLSW MixControls,
     IN ULONG Flags);
 
 MMRESULT
 WdmAudSetControlDetails(
     IN HANDLE hMixer,
+    IN DWORD MixerId,
     IN LPMIXERCONTROLDETAILS MixDetails,
     IN ULONG Flags);
 
 MMRESULT
 WdmAudGetControlDetails(
     IN HANDLE hMixer,
+    IN DWORD MixerId,
     IN LPMIXERCONTROLDETAILS MixDetails,
     IN ULONG Flags);
 
@@ -115,6 +119,7 @@ WdmAudSetMixerDeviceFormatByMMixer(
 MMRESULT
 WdmAudQueryMixerInfoByMMixer(
     IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+    IN DWORD MixerId,
     IN UINT uMsg,
     IN LPVOID Parameter,
     IN DWORD Flags);
@@ -146,87 +151,4 @@ WdmAudCommitWaveBufferByMMixer(
 MMRESULT
 WdmAudCleanupByMMixer();
 
-/* legacy.c */
-
-MMRESULT
-WdmAudCleanupByLegacy();
-
-MMRESULT
-WdmAudGetCapabilitiesByLegacy(
-    IN  PSOUND_DEVICE SoundDevice,
-    IN  DWORD DeviceId,
-    OUT PVOID Capabilities,
-    IN  DWORD CapabilitiesSize);
-
-MMRESULT
-WdmAudOpenSoundDeviceByLegacy();
-
-MMRESULT
-WdmAudCloseSoundDeviceByLegacy(
-    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
-    IN  PVOID Handle);
-
-MMRESULT
-WdmAudGetDeviceInterfaceStringByLegacy(
-    IN  MMDEVICE_TYPE DeviceType,
-    IN  DWORD DeviceId,
-    IN  LPWSTR Interface,
-    IN  DWORD  InterfaceLength,
-    OUT  DWORD * InterfaceSize);
-
-MMRESULT
-WdmAudSetMixerDeviceFormatByLegacy(
-    IN  PSOUND_DEVICE_INSTANCE Instance,
-    IN  DWORD DeviceId,
-    IN  PWAVEFORMATEX WaveFormat,
-    IN  DWORD WaveFormatSize);
-
-MMRESULT
-WdmAudQueryMixerInfoByLegacy(
-    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
-    IN UINT uMsg,
-    IN LPVOID Parameter,
-    IN DWORD Flags);
-
-MMRESULT
-WdmAudSetWaveDeviceFormatByLegacy(
-    IN  PSOUND_DEVICE_INSTANCE Instance,
-    IN  DWORD DeviceId,
-    IN  PWAVEFORMATEX WaveFormat,
-    IN  DWORD WaveFormatSize);
-
-MMRESULT
-WdmAudSetWaveStateByLegacy(
-    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
-    IN BOOL bStart);
-
-MMRESULT
-WdmAudResetStreamByLegacy(
-    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
-    IN  MMDEVICE_TYPE DeviceType,
-    IN  BOOLEAN bStartReset);
-
-MMRESULT
-WdmAudGetWavePositionByLegacy(
-    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
-    IN  MMTIME* Time);
-
-MMRESULT
-WriteFileEx_Committer2(
-    IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
-    IN  PVOID OffsetPtr,
-    IN  DWORD Length,
-    IN  PSOUND_OVERLAPPED Overlap,
-    IN  LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine);
-
-MMRESULT
-WdmAudGetNumWdmDevsByLegacy(
-    IN  MMDEVICE_TYPE DeviceType,
-    OUT DWORD* DeviceCount);
-
-DWORD
-WINAPI
-MixerEventThreadRoutine(
-    LPVOID Parameter);
-
 #endif
index 1a2a543..1cc7f52 100644 (file)
     { \
         if ( ! (parameter_condition) ) \
         { \
-            SND_ERR(L"FAILED parameter check: %hS\n", #parameter_condition); \
+            SND_ERR(L"FAILED parameter check: %hS at File %S Line %lu\n", #parameter_condition, __FILE__, __LINE__); \
             return MMSYSERR_INVALPARAM; \
         } \
     }
@@ -199,11 +199,11 @@ typedef MMRESULT (*WAVE_COMMIT_FUNC)(
 
 typedef MMRESULT (*MMMIXERQUERY_FUNC) (
     IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+    IN DWORD DeviceId,
     IN UINT uMsg,
     IN LPVOID Parameter,
     IN DWORD Flags);
 
-
 typedef MMRESULT (*MMWAVEQUERYFORMATSUPPORT_FUNC)(
     IN  struct _SOUND_DEVICE* Device,
     IN  PWAVEFORMATEX WaveFormat,
index 08815ba..7652d9e 100644 (file)
@@ -20,6 +20,7 @@
 
 MMRESULT
 MmeGetLineInfo(
+    IN UINT DeviceId,
     IN  UINT Message,
     IN  DWORD_PTR PrivateHandle,
     IN  DWORD_PTR Parameter1,
@@ -32,6 +33,21 @@ MmeGetLineInfo(
 
     //SND_TRACE(L"Getting mixer info %u\n", Message);
 
+    if ( PrivateHandle == 0 )
+    {
+        Result = GetSoundDevice(MIXER_DEVICE_TYPE, DeviceId, &SoundDevice);
+
+        if ( ! MMSUCCESS(Result) )
+            return TranslateInternalMmResult(Result);
+
+         Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
+         if ( ! MMSUCCESS(Result) )
+            return TranslateInternalMmResult(Result);
+
+         Result = FunctionTable->QueryMixerInfo(NULL, DeviceId, Message, (LPVOID)Parameter1, Parameter2);
+         return Result;
+    }
+
     VALIDATE_MMSYS_PARAMETER( PrivateHandle );
     SoundDeviceInstance = (PSOUND_DEVICE_INSTANCE) PrivateHandle;
 
@@ -46,7 +62,7 @@ MmeGetLineInfo(
     if ( ! FunctionTable->QueryMixerInfo )
         return MMSYSERR_NOTSUPPORTED;
 
-    Result = FunctionTable->QueryMixerInfo(SoundDeviceInstance, Message, (LPVOID)Parameter1, Parameter2);
+    Result = FunctionTable->QueryMixerInfo(SoundDeviceInstance, DeviceId, Message, (LPVOID)Parameter1, Parameter2);
 
     return Result;
 }
@@ -100,7 +116,7 @@ mxdMessage(
                                    (LPWAVEOPENDESC) Parameter1, /* unused */
                                    Parameter2,
                                    (DWORD*) PrivateHandle);
-
+            VALIDATE_MMSYS_PARAMETER(*(DWORD_PTR*)PrivateHandle);
             break;
         }
 
@@ -113,7 +129,8 @@ mxdMessage(
 
         case MXDM_GETCONTROLDETAILS :
         {
-            Result = MmeGetLineInfo(Message,
+            Result = MmeGetLineInfo(DeviceId,
+                                    Message,
                                     PrivateHandle,
                                     Parameter1,
                                     Parameter2);
@@ -123,7 +140,8 @@ mxdMessage(
 
         case MXDM_SETCONTROLDETAILS :
         {
-            Result = MmeGetLineInfo(Message,
+            Result = MmeGetLineInfo(DeviceId,
+                                    Message,
                                     PrivateHandle,
                                     Parameter1,
                                     Parameter2);
@@ -133,7 +151,8 @@ mxdMessage(
 
         case MXDM_GETLINECONTROLS :
         {
-            Result = MmeGetLineInfo(Message,
+            Result = MmeGetLineInfo(DeviceId,
+                                    Message,
                                     PrivateHandle,
                                     Parameter1,
                                     Parameter2);
@@ -143,7 +162,8 @@ mxdMessage(
 
         case MXDM_GETLINEINFO :
         {
-            Result = MmeGetLineInfo(Message,
+            Result = MmeGetLineInfo(DeviceId,
+                                    Message,
                                     PrivateHandle,
                                     Parameter1,
                                     Parameter2);
index b4b7dcf..c216110 100644 (file)
@@ -89,7 +89,7 @@ MMixerOpen(
     if (Status != MM_STATUS_SUCCESS)
     {
         /* invalid context passed */
-               DPRINT1("invalid context\n");
+        DPRINT1("invalid context\n");
         return Status;
     }
 
@@ -98,7 +98,7 @@ MMixerOpen(
     if (!MixerInfo)
     {
         /* invalid mixer id */
-               DPRINT1("invalid mixer id %lu\n", MixerId);
+        DPRINT1("invalid mixer id %lu\n", MixerId);
         return MM_STATUS_INVALID_PARAMETER;
     }
 
@@ -115,8 +115,9 @@ MMixerOpen(
 MIXER_STATUS
 MMixerGetLineInfo(
     IN PMIXER_CONTEXT MixerContext,
-    IN  HANDLE MixerHandle,
-    IN  ULONG Flags,
+    IN HANDLE MixerHandle,
+    IN ULONG MixerId,
+    IN ULONG Flags,
     OUT LPMIXERLINEW MixerLine)
 {
     MIXER_STATUS Status;
@@ -131,6 +132,17 @@ MMixerGetLineInfo(
         /* invalid context passed */
         return Status;
     }
+    if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
+    {
+        /* caller passed mixer id */
+        MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
+
+        if (!MixerHandle)
+        {
+            /* invalid parameter */
+            return MM_STATUS_INVALID_PARAMETER;
+        }
+    }
 
     /* clear hmixer from flags */
     Flags &=~MIXER_OBJECTF_HMIXER;
@@ -220,6 +232,7 @@ MIXER_STATUS
 MMixerGetLineControls(
     IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN ULONG Flags,
     OUT LPMIXERLINECONTROLSW MixerLineControls)
 {
@@ -238,6 +251,18 @@ MMixerGetLineControls(
         return Status;
     }
 
+    if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
+    {
+        /* caller passed mixer id */
+        MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
+
+        if (!MixerHandle)
+        {
+            /* invalid parameter */
+            return MM_STATUS_INVALID_PARAMETER;
+        }
+    }
+
     Flags &= ~MIXER_OBJECTF_HMIXER;
 
     if (Flags == MIXER_GETLINECONTROLSF_ALL)
@@ -312,6 +337,7 @@ MIXER_STATUS
 MMixerSetControlDetails(
     IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN ULONG Flags,
     OUT LPMIXERCONTROLDETAILS MixerControlDetails)
 {
@@ -330,6 +356,18 @@ MMixerSetControlDetails(
         return Status;
     }
 
+    if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
+    {
+        /* caller passed mixer id */
+        MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
+
+        if (!MixerHandle)
+        {
+            /* invalid parameter */
+            return MM_STATUS_INVALID_PARAMETER;
+        }
+    }
+
     /* get mixer info */
     MixerInfo = (LPMIXER_INFO)MixerHandle;
 
@@ -362,6 +400,7 @@ MIXER_STATUS
 MMixerGetControlDetails(
     IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN ULONG Flags,
     OUT LPMIXERCONTROLDETAILS MixerControlDetails)
 {
@@ -380,6 +419,18 @@ MMixerGetControlDetails(
         return Status;
     }
 
+    if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
+    {
+        /* caller passed mixer id */
+        MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
+
+        if (!MixerHandle)
+        {
+            /* invalid parameter */
+            return MM_STATUS_INVALID_PARAMETER;
+        }
+    }
+
     /* get mixer info */
     MixerInfo = (LPMIXER_INFO)MixerHandle;
 
index 846d4e9..9649706 100644 (file)
@@ -149,7 +149,8 @@ MMixerOpen(
 MIXER_STATUS
 MMixerGetLineInfo(
     IN PMIXER_CONTEXT MixerContext,
-    IN  HANDLE MixerHandle,
+    IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN  ULONG Flags,
     OUT LPMIXERLINEW MixerLine);
 
@@ -157,6 +158,7 @@ MIXER_STATUS
 MMixerGetLineControls(
     IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN ULONG Flags,
     OUT LPMIXERLINECONTROLSW MixerLineControls);
 
@@ -164,6 +166,7 @@ MIXER_STATUS
 MMixerSetControlDetails(
     IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN ULONG Flags,
     OUT LPMIXERCONTROLDETAILS MixerControlDetails);
 
@@ -171,6 +174,7 @@ MIXER_STATUS
 MMixerGetControlDetails(
     IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN ULONG Flags,
     OUT LPMIXERCONTROLDETAILS MixerControlDetails);