[AUDIO-BRINGUP]
[reactos.git] / lib / drivers / sound / mmixer / mixer.c
index a05f2a7..f88ac68 100644 (file)
@@ -17,16 +17,16 @@ MMixerGetCount(
     PMIXER_LIST MixerList;
     MIXER_STATUS Status;
 
-    // verify mixer context
+    /* verify mixer context */
     Status = MMixerVerifyContext(MixerContext);
 
     if (Status != MM_STATUS_SUCCESS)
     {
-        // invalid context passed
+        /* invalid context passed */
         return Status;
     }
 
-    // grab mixer list
+    /* grab mixer list */
     MixerList = (PMIXER_LIST)MixerContext->MixerContext;
 
     // return number of mixers
@@ -42,16 +42,16 @@ MMixerGetCapabilities(
     MIXER_STATUS Status;
     LPMIXER_INFO MixerInfo;
 
-    // verify mixer context
+    /* verify mixer context */
     Status = MMixerVerifyContext(MixerContext);
 
     if (Status != MM_STATUS_SUCCESS)
     {
-        // invalid context passed
+        /* invalid context passed */
         return Status;
     }
 
-    // get mixer info
+    /* get mixer info */
     MixerInfo = MMixerGetMixerInfoByIndex(MixerContext, MixerIndex);
 
     if (!MixerInfo)
@@ -65,6 +65,8 @@ MMixerGetCapabilities(
     MixerCaps->vDriverVersion = MixerInfo->MixCaps.vDriverVersion;
     MixerCaps->fdwSupport = MixerInfo->MixCaps.fdwSupport;
     MixerCaps->cDestinations = MixerInfo->MixCaps.cDestinations;
+
+    ASSERT(MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] == 0);
     wcscpy(MixerCaps->szPname, MixerInfo->MixCaps.szPname);
 
     return MM_STATUS_SUCCESS;
@@ -74,36 +76,37 @@ MIXER_STATUS
 MMixerOpen(
     IN PMIXER_CONTEXT MixerContext,
     IN ULONG MixerId,
-    IN PVOID MixerEvent,
+    IN PVOID MixerEventContext,
     IN PMIXER_EVENT MixerEventRoutine,
     OUT PHANDLE MixerHandle)
 {
     MIXER_STATUS Status;
     LPMIXER_INFO MixerInfo;
 
-    // verify mixer context
+    /* verify mixer context */
     Status = MMixerVerifyContext(MixerContext);
 
     if (Status != MM_STATUS_SUCCESS)
     {
-        // invalid context passed
+        /* invalid context passed */
+        DPRINT1("invalid context\n");
         return Status;
     }
 
+    /* get mixer info */
     MixerInfo = (LPMIXER_INFO)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
     if (!MixerInfo)
     {
-        // invalid mixer id
+        /* invalid mixer id */
+        DPRINT1("invalid mixer id %lu\n", MixerId);
         return MM_STATUS_INVALID_PARAMETER;
     }
 
-    // FIXME
-    // handle event notification
-
-    Status = MMixerAddEvents(MixerContext, MixerInfo);
+    /* add the event */
+    Status = MMixerAddEvent(MixerContext, MixerInfo, MixerEventContext, MixerEventRoutine);
 
 
-    // store result
+    /* store result */
     *MixerHandle = (HANDLE)MixerInfo;
 
     return MM_STATUS_SUCCESS;
@@ -112,90 +115,153 @@ 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;
     LPMIXER_INFO MixerInfo;
     LPMIXERLINE_EXT MixerLineSrc;
+    ULONG DestinationLineID;
 
-    // verify mixer context
+    /* verify mixer context */
     Status = MMixerVerifyContext(MixerContext);
 
     if (Status != MM_STATUS_SUCCESS)
     {
-        // invalid context passed
+        /* 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;
+        }
+    }
+
+    if (MixerLine->cbStruct != sizeof(MIXERLINEW))
+       {
+               DPRINT1("MixerLine Expected %lu but got %lu\n", sizeof(MIXERLINEW), MixerLine->cbStruct);
+               return MM_STATUS_INVALID_PARAMETER;
+       }
 
-    // clear hmixer from flags
+
+    /* clear hmixer from flags */
     Flags &=~MIXER_OBJECTF_HMIXER;
 
+    DPRINT1("MMixerGetLineInfo MixerId %lu Flags %lu\n", MixerId, Flags);
+
     if (Flags == MIXER_GETLINEINFOF_DESTINATION)
     {
-        // cast to mixer info
+        /* cast to mixer info */
         MixerInfo = (LPMIXER_INFO)MixerHandle;
 
-        if (MixerLine->dwDestination != 0)
+        /* calculate destination line id */
+        DestinationLineID = (MixerLine->dwDestination + DESTINATION_LINE);
+
+        /* get destination line */
+        MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, DestinationLineID);
+
+        if (MixerLineSrc == NULL)
         {
-            // destination line member must be zero
-            return MM_STATUS_INVALID_PARAMETER;
+            DPRINT1("MixerCaps Name %S DestinationLineCount %lu dwDestination %lu not found\n", MixerInfo->MixCaps.szPname, MixerInfo->MixCaps.cDestinations, MixerLine->dwDestination);
+            return MM_STATUS_UNSUCCESSFUL;
         }
-
-        MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE);
-        ASSERT(MixerLineSrc);
+        /* copy mixer line */
         MixerContext->Copy(MixerLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
 
+        /* make sure it is null terminated */
+        MixerLine->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
+        MixerLine->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
+        MixerLine->Target.szPname[MAXPNAMELEN-1] = L'\0';
+
+        /* done */
         return MM_STATUS_SUCCESS;
     }
     else if (Flags == MIXER_GETLINEINFOF_SOURCE)
     {
-        // cast to mixer info
+        /* cast to mixer info */
         MixerInfo = (LPMIXER_INFO)MixerHandle;
 
+        /* calculate destination line id */
+        DestinationLineID = (MixerLine->dwDestination + DESTINATION_LINE);
 
-        MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE);
-        ASSERT(MixerLineSrc);
+        /* get destination line */
+        MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, DestinationLineID);
 
-        if (MixerLine->dwSource >= MixerLineSrc->Line.cConnections)
+        if (MixerLineSrc == NULL)
         {
-            DPRINT1("dwSource %u > Destinations %u\n", MixerLine->dwSource, MixerLineSrc->Line.cConnections);
-
-            // invalid parameter
-            return MM_STATUS_INVALID_PARAMETER;
+            DPRINT1("MixerCaps Name %S DestinationLineCount %lu dwDestination %lu not found\n", MixerInfo->MixCaps.szPname, MixerInfo->MixCaps.cDestinations, MixerLine->dwDestination);
+            return MM_STATUS_UNSUCCESSFUL;
         }
 
-        MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwSource * 0x10000);
-        if (MixerLineSrc)
+        /* check if dwSource is out of bounds */
+        if (MixerLine->dwSource >= MixerLineSrc->Line.cConnections)
         {
-            DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
-            MixerContext->Copy(MixerLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
-            return MM_STATUS_SUCCESS;
+            DPRINT1("MixerCaps Name %S MixerLineName %S Connections %lu dwSource %lu not found\n", MixerInfo->MixCaps.szPname, MixerLineSrc->Line.szName, MixerLineSrc->Line.cConnections, MixerLine->dwSource);
+            return MM_STATUS_UNSUCCESSFUL;
         }
-        return MM_STATUS_UNSUCCESSFUL;
+
+        /* calculate destination line id */
+        DestinationLineID = (MixerLine->dwSource * DESTINATION_LINE) + MixerLine->dwDestination;
+
+        /* get target destination line id */
+        MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, DestinationLineID);
+
+        /* sanity check */
+        ASSERT(MixerLineSrc);
+
+        DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
+
+        /* copy mixer line */
+        MixerContext->Copy(MixerLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
+
+        /* make sure it is null terminated */
+        MixerLine->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
+        MixerLine->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
+        MixerLine->Target.szPname[MAXPNAMELEN-1] = L'\0';
+
+        /* done */
+        return MM_STATUS_SUCCESS;
     }
     else if (Flags == MIXER_GETLINEINFOF_LINEID)
     {
-        // cast to mixer info
+        /* cast to mixer info */
         MixerInfo = (LPMIXER_INFO)MixerHandle;
 
+        /* try to find line */
         MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwLineID);
         if (!MixerLineSrc)
         {
-            // invalid parameter
+            /* invalid parameter */
+            DPRINT1("MixerName %S Line not found %lu\n", MixerInfo->MixCaps.szPname, MixerLine->dwLineID);
             return MM_STATUS_INVALID_PARAMETER;
         }
 
-        /* copy cached data */
+        DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
+
+        /* copy mixer line*/
         MixerContext->Copy(MixerLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
+
+        /* make sure it is null terminated */
+        MixerLine->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
+        MixerLine->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
+        MixerLine->Target.szPname[MAXPNAMELEN-1] = L'\0';
+
         return MM_STATUS_SUCCESS;
     }
     else if (Flags == MIXER_GETLINEINFOF_COMPONENTTYPE)
     {
-        // cast to mixer info
+        /* cast to mixer info */
         MixerInfo = (LPMIXER_INFO)MixerHandle;
 
+        /* find mixer line by component type */
         MixerLineSrc = MMixerGetSourceMixerLineByComponentType(MixerInfo, MixerLine->dwComponentType);
         if (!MixerLineSrc)
         {
@@ -203,12 +269,25 @@ MMixerGetLineInfo(
             return MM_STATUS_UNSUCCESSFUL;
         }
 
-        ASSERT(MixerLineSrc);
-
-        /* copy cached data */
+        /* copy mixer line */
         MixerContext->Copy(MixerLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
+
+        /* make sure it is null terminated */
+        MixerLine->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
+        MixerLine->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
+        MixerLine->Target.szPname[MAXPNAMELEN-1] = L'\0';
+
+        /* done */
         return MM_STATUS_SUCCESS;
     }
+    else if (Flags == MIXER_GETLINEINFOF_TARGETTYPE)
+    {
+        DPRINT1("MIXER_GETLINEINFOF_TARGETTYPE handling is unimplemented\n");
+    }
+    else
+    {
+        DPRINT1("Unknown Flags %lx handling is unimplemented\n", Flags);
+    }
 
     return MM_STATUS_NOT_IMPLEMENTED;
 }
@@ -217,6 +296,7 @@ MIXER_STATUS
 MMixerGetLineControls(
     IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN ULONG Flags,
     OUT LPMIXERLINECONTROLSW MixerLineControls)
 {
@@ -226,44 +306,56 @@ MMixerGetLineControls(
     MIXER_STATUS Status;
     ULONG Index;
 
-    // verify mixer context
+    /* verify mixer context */
     Status = MMixerVerifyContext(MixerContext);
 
     if (Status != MM_STATUS_SUCCESS)
     {
-        // invalid context passed
+        /* 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;
+        }
+    }
+
     Flags &= ~MIXER_OBJECTF_HMIXER;
 
     if (Flags == MIXER_GETLINECONTROLSF_ALL)
     {
-        // cast to mixer info
+        /* cast to mixer info */
         MixerInfo = (LPMIXER_INFO)MixerHandle;
 
         MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLineControls->dwLineID);
 
         if (!MixerLineSrc)
         {
-            // invalid line id
+            /* invalid line id */
             return MM_STATUS_INVALID_PARAMETER;
         }
-        // copy line control(s)
+        /* copy line control(s) */
         MixerContext->Copy(MixerLineControls->pamxctrl, MixerLineSrc->LineControls, min(MixerLineSrc->Line.cControls, MixerLineControls->cControls) * sizeof(MIXERCONTROLW));
 
         return MM_STATUS_SUCCESS;
     }
     else if (Flags == MIXER_GETLINECONTROLSF_ONEBYTYPE)
     {
-        // cast to mixer info
+        /* cast to mixer info */
         MixerInfo = (LPMIXER_INFO)MixerHandle;
 
         MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLineControls->dwLineID);
 
         if (!MixerLineSrc)
         {
-            // invalid line id
+            /* invalid line id */
             return MM_STATUS_INVALID_PARAMETER;
         }
 
@@ -275,7 +367,7 @@ MMixerGetLineControls(
             DPRINT("dwControlType %x\n", MixerLineSrc->LineControls[Index].dwControlType);
             if (MixerLineControls->dwControlType == MixerLineSrc->LineControls[Index].dwControlType)
             {
-                // found a control with that type
+                /* found a control with that type */
                 MixerContext->Copy(MixerLineControls->pamxctrl, &MixerLineSrc->LineControls[Index], sizeof(MIXERCONTROLW));
                 return MM_STATUS_SUCCESS;
             }
@@ -285,18 +377,18 @@ MMixerGetLineControls(
     }
     else if (Flags == MIXER_GETLINECONTROLSF_ONEBYID)
     {
-        // cast to mixer info
+        /* cast to mixer info */
         MixerInfo = (LPMIXER_INFO)MixerHandle;
 
         Status = MMixerGetMixerControlById(MixerInfo, MixerLineControls->dwControlID, NULL, &MixerControl, NULL);
 
         if (Status != MM_STATUS_SUCCESS)
         {
-            // invalid parameter
+            /* invalid parameter */
             return MM_STATUS_INVALID_PARAMETER;
         }
 
-        // copy the controls
+        /* copy the controls */
         MixerContext->Copy(MixerLineControls->pamxctrl, MixerControl, sizeof(MIXERCONTROLW));
         return MM_STATUS_SUCCESS;
     }
@@ -309,6 +401,7 @@ MIXER_STATUS
 MMixerSetControlDetails(
     IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN ULONG Flags,
     OUT LPMIXERCONTROLDETAILS MixerControlDetails)
 {
@@ -318,25 +411,37 @@ MMixerSetControlDetails(
     LPMIXERLINE_EXT MixerLine;
     LPMIXERCONTROLW MixerControl;
 
-    // verify mixer context
+    /* verify mixer context */
     Status = MMixerVerifyContext(MixerContext);
 
     if (Status != MM_STATUS_SUCCESS)
     {
-        // invalid context passed
+        /* invalid context passed */
         return Status;
     }
 
-    // get mixer info
+    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;
 
-    // get mixer control
+    /* get mixer control */
      Status = MMixerGetMixerControlById(MixerInfo, MixerControlDetails->dwControlID, &MixerLine, &MixerControl, &NodeId);
 
-    // check for success
+    /* check for success */
     if (Status != MM_STATUS_SUCCESS)
     {
-        // failed to find control id
+        /* failed to find control id */
         return MM_STATUS_INVALID_PARAMETER;
     }
 
@@ -359,6 +464,7 @@ MIXER_STATUS
 MMixerGetControlDetails(
     IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
+    IN ULONG MixerId,
     IN ULONG Flags,
     OUT LPMIXERCONTROLDETAILS MixerControlDetails)
 {
@@ -368,35 +474,47 @@ MMixerGetControlDetails(
     LPMIXERLINE_EXT MixerLine;
     LPMIXERCONTROLW MixerControl;
 
-    // verify mixer context
+    /* verify mixer context */
     Status = MMixerVerifyContext(MixerContext);
 
     if (Status != MM_STATUS_SUCCESS)
     {
-        // invalid context passed
+        /* invalid context passed */
         return Status;
     }
 
-    // get mixer info
+    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;
 
-    // get mixer control
+    /* get mixer control */
      Status = MMixerGetMixerControlById(MixerInfo, MixerControlDetails->dwControlID, &MixerLine, &MixerControl, &NodeId);
 
-    // check for success
+    /* check for success */
     if (Status != MM_STATUS_SUCCESS)
     {
-        // failed to find control id
+        /* failed to find control id */
         return MM_STATUS_INVALID_PARAMETER;
     }
 
     switch(MixerControl->dwControlType)
     {
         case MIXERCONTROL_CONTROLTYPE_MUTE:
-            Status = MMixerSetGetMuteControlDetails(MixerContext, MixerInfo->hMixer, NodeId, MixerLine->Line.dwLineID, MixerControlDetails, FALSE);
+            Status = MMixerSetGetMuteControlDetails(MixerContext, MixerInfo, NodeId, MixerLine->Line.dwLineID, MixerControlDetails, FALSE);
             break;
         case MIXERCONTROL_CONTROLTYPE_VOLUME:
-            Status = MMixerSetGetVolumeControlDetails(MixerContext, MixerInfo->hMixer, NodeId, FALSE, MixerControl, MixerControlDetails, MixerLine);
+            Status = MMixerSetGetVolumeControlDetails(MixerContext, MixerInfo, NodeId, FALSE, MixerControl, MixerControlDetails, MixerLine);
             break;
         default:
             Status = MM_STATUS_NOT_IMPLEMENTED;
@@ -405,6 +523,66 @@ MMixerGetControlDetails(
     return Status;
 }
 
+VOID
+MMixerPrintMixers(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PMIXER_LIST MixerList)
+{
+    ULONG Index, SubIndex, DestinationLineID;
+    LPMIXER_INFO MixerInfo;
+    LPMIXERLINE_EXT DstMixerLine;
+
+    DPRINT1("MixerList %p\n", MixerList);
+    DPRINT1("MidiInCount %lu\n", MixerList->MidiInListCount);
+    DPRINT1("MidiOutCount %lu\n", MixerList->MidiOutListCount);
+    DPRINT1("WaveInCount %lu\n", MixerList->WaveInListCount);
+    DPRINT1("WaveOutCount %lu\n", MixerList->WaveOutListCount);
+    DPRINT1("MixerCount %p\n", MixerList->MixerListCount);
+
+
+    for(Index = 0; Index < MixerList->MixerListCount; Index++)
+    {
+        /* get mixer info */
+        MixerInfo = MMixerGetMixerInfoByIndex(MixerContext, Index);
+
+        ASSERT(MixerInfo);
+        DPRINT1("\n");
+        DPRINT1("Name :%S\n", MixerInfo->MixCaps.szPname);
+        DPRINT1("cDestinations: %lu\n", MixerInfo->MixCaps.cDestinations);
+        DPRINT1("fdwSupport %lu\n", MixerInfo->MixCaps.fdwSupport);
+        DPRINT1("vDriverVersion %lx\n", MixerInfo->MixCaps.vDriverVersion);
+        DPRINT1("wMid %lx\n", MixerInfo->MixCaps.wMid);
+        DPRINT1("wPid %lx\n", MixerInfo->MixCaps.wPid);
+
+        for(SubIndex = 0; SubIndex < MixerInfo->MixCaps.cDestinations; SubIndex++)
+        {
+            /* calculate destination line id */
+            DestinationLineID = (SubIndex + DESTINATION_LINE);
+
+            /* get destination line */
+            DstMixerLine = MMixerGetSourceMixerLineByLineId(MixerInfo, DestinationLineID);
+            DPRINT1("\n");
+            DPRINT1("cChannels %lu\n", DstMixerLine->Line.cChannels);
+            DPRINT1("cConnections %lu\n", DstMixerLine->Line.cConnections);
+            DPRINT1("cControls %lu\n", DstMixerLine->Line.cControls);
+            DPRINT1("dwComponentType %lx\n", DstMixerLine->Line.dwComponentType);
+            DPRINT1("dwDestination %lu\n", DstMixerLine->Line.dwDestination);
+            DPRINT1("dwLineID %lx\n", DstMixerLine->Line.dwLineID);
+            DPRINT1("dwSource %lx\n", DstMixerLine->Line.dwSource);
+            DPRINT1("dwUser %lu\n", DstMixerLine->Line.dwUser);
+            DPRINT1("fdwLine %lu\n", DstMixerLine->Line.fdwLine);
+            DPRINT1("szName %S\n", DstMixerLine->Line.szName);
+            DPRINT1("szShortName %S\n", DstMixerLine->Line.szShortName);
+            DPRINT1("Target.dwDeviceId %lu\n", DstMixerLine->Line.Target.dwDeviceID);
+            DPRINT1("Target.dwType %lu\n", DstMixerLine->Line.Target.dwType);
+            DPRINT1("Target.szName %S\n", DstMixerLine->Line.Target.szPname);
+            DPRINT1("Target.vDriverVersion %lx\n", DstMixerLine->Line.Target.vDriverVersion);
+            DPRINT1("Target.wMid %lx\n", DstMixerLine->Line.Target.wMid );
+            DPRINT1("Target.wPid %lx\n", DstMixerLine->Line.Target.wPid);
+        }
+    }
+}
+
 MIXER_STATUS
 MMixerInitialize(
     IN PMIXER_CONTEXT MixerContext,
@@ -421,7 +599,7 @@ MMixerInitialize(
 
     if (!MixerContext || !EnumFunction || !EnumContext)
     {
-        // invalid parameter
+        /* invalid parameter */
         return MM_STATUS_INVALID_PARAMETER;
     }
 
@@ -429,64 +607,75 @@ MMixerInitialize(
         !MixerContext->AllocEventData || !MixerContext->FreeEventData ||
         !MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey)
     {
-        // invalid parameter
+        /* invalid parameter */
         return MM_STATUS_INVALID_PARAMETER;
     }
 
-    // allocate a mixer list
+    /* allocate a mixer list */
     MixerList = (PMIXER_LIST)MixerContext->Alloc(sizeof(MIXER_LIST));
     if (!MixerList)
     {
-        // no memory
+        /* no memory */
         return MM_STATUS_NO_MEMORY;
     }
 
-     //initialize mixer list
+     /* initialize mixer list */
      MixerList->MixerListCount = 0;
      MixerList->MixerDataCount = 0;
      MixerList->WaveInListCount = 0;
      MixerList->WaveOutListCount = 0;
+     MixerList->MidiInListCount = 0;
+     MixerList->MidiOutListCount = 0;
      InitializeListHead(&MixerList->MixerList);
      InitializeListHead(&MixerList->MixerData);
      InitializeListHead(&MixerList->WaveInList);
      InitializeListHead(&MixerList->WaveOutList);
+     InitializeListHead(&MixerList->MidiInList);
+     InitializeListHead(&MixerList->MidiOutList);
 
-
-     // store mixer list
+     /* store mixer list */
      MixerContext->MixerContext = (PVOID)MixerList;
 
-    // start enumerating all available devices
+    /* start enumerating all available devices */
     Count = 0;
     DeviceIndex = 0;
 
     do
     {
-        // enumerate a device
+        /* enumerate a device */
         Status = EnumFunction(EnumContext, DeviceIndex, &DeviceName, &hMixer, &hKey);
 
         if (Status != MM_STATUS_SUCCESS)
         {
-            //check error code
+            /* check error code */
             if (Status == MM_STATUS_NO_MORE_DEVICES)
             {
-                // enumeration has finished
+                /* enumeration has finished */
                 break;
             }
+            else
+            {
+                DPRINT1("Failed to enumerate device %lu\n", DeviceIndex);
+
+                /* TODO cleanup */
+                return Status;
+            }
         }
         else
         {
-            // create a mixer data entry
+            /* create a mixer data entry */
             Status = MMixerCreateMixerData(MixerContext, MixerList, DeviceIndex, DeviceName, hMixer, hKey);
             if (Status != MM_STATUS_SUCCESS)
                 break;
         }
 
-        // increment device index
+        /* increment device index */
         DeviceIndex++;
     }while(TRUE);
 
-    //now all filters have been pre-opened
-    // lets enumerate the filters
+    /* now all filters have been pre-opened
+     * lets enumerate the filters
+     */
     Entry = MixerList->MixerData.Flink;
     while(Entry != &MixerList->MixerData)
     {
@@ -495,6 +684,8 @@ MMixerInitialize(
         Entry = Entry->Flink;
     }
 
-    // done
+    MMixerPrintMixers(MixerContext, MixerList);
+
+    /* done */
     return MM_STATUS_SUCCESS;
 }