[MMIXER]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Wed, 9 Dec 2009 09:51:39 +0000 (09:51 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Wed, 9 Dec 2009 09:51:39 +0000 (09:51 +0000)
- Store initialized mixers in a struct MIXER_LIST
- Implement MMixerGetCapabilities

svn path=/trunk/; revision=44479

reactos/lib/drivers/sound/mmixer/controls.c
reactos/lib/drivers/sound/mmixer/mixer.c
reactos/lib/drivers/sound/mmixer/mmixer.h
reactos/lib/drivers/sound/mmixer/priv.h
reactos/lib/drivers/sound/mmixer/sup.c

index 2cc7a45..5788a43 100644 (file)
@@ -781,6 +781,7 @@ MMixerHandlePhysicalConnection(
 MIXER_STATUS
 MMixerInitializeFilter(
     IN PMIXER_CONTEXT MixerContext,
+    IN PMIXER_LIST MixerList,
     IN HANDLE hMixer,
     IN LPWSTR DeviceName,
     IN PKSMULTIPLE_ITEM NodeTypes,
@@ -866,9 +867,9 @@ MMixerInitializeFilter(
     }
     MixerContext->Free(Pins);
 
-    //FIXME
-    // store MixerInfo in context
-
+    // store mixer info in list
+    InsertTailList(&MixerList->MixerList, &MixerInfo->Entry);
+    MixerList->MixerListCount++;
 
     // done
     return Status;
@@ -876,7 +877,8 @@ MMixerInitializeFilter(
 
 MIXER_STATUS
 MMixerSetupFilter(
-    IN PMIXER_CONTEXT MixerContext, 
+    IN PMIXER_CONTEXT MixerContext,
+    IN PMIXER_LIST MixerList,
     IN HANDLE hMixer,
     IN PULONG DeviceCount,
     IN LPWSTR DeviceName)
@@ -913,7 +915,7 @@ MMixerSetupFilter(
     if (NodeIndex != MAXULONG)
     {
         // it has
-        Status = MMixerInitializeFilter(MixerContext, hMixer, DeviceName, NodeTypes, NodeConnections, PinCount, NodeIndex, FALSE);
+        Status = MMixerInitializeFilter(MixerContext, MixerList, hMixer, DeviceName, NodeTypes, NodeConnections, PinCount, NodeIndex, FALSE);
 
         // check for success
         if (Status == MM_STATUS_SUCCESS)
@@ -929,7 +931,7 @@ MMixerSetupFilter(
     if (NodeIndex != MAXULONG)
     {
         // it has
-        Status = MMixerInitializeFilter(MixerContext, hMixer, DeviceName, NodeTypes, NodeConnections, PinCount, NodeIndex, TRUE);
+        Status = MMixerInitializeFilter(MixerContext, MixerList, hMixer, DeviceName, NodeTypes, NodeConnections, PinCount, NodeIndex, TRUE);
 
         // check for success
         if (Status == MM_STATUS_SUCCESS)
index 279d119..279551a 100644 (file)
 
 #include "priv.h"
 
+ULONG
+MMixerGetCount(
+    IN PMIXER_CONTEXT MixerContext)
+{
+    PMIXER_LIST MixerList;
+    MIXER_STATUS Status;
+
+    // verify mixer context
+    Status = MMixerVerifyContext(MixerContext);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // invalid context passed
+        return Status;
+    }
+
+    // grab mixer list
+    MixerList = (PMIXER_LIST)MixerContext->MixerContext;
+
+    // return number of mixers
+    return MixerList->MixerListCount;
+}
+
+MIXER_STATUS
+MMixerGetCapabilities(
+    IN PMIXER_CONTEXT MixerContext,
+    IN ULONG MixerIndex,
+    OUT LPMIXERCAPSW MixerCaps)
+{
+    MIXER_STATUS Status;
+    LPMIXER_INFO MixerInfo;
+
+    // verify mixer context
+    Status = MMixerVerifyContext(MixerContext);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // invalid context passed
+        return Status;
+    }
+
+    // get mixer info
+    MixerInfo = MMixerGetMixerInfoByIndex(MixerContext, MixerIndex);
+
+    if (!MixerInfo)
+    {
+        // invalid device index
+        return MM_STATUS_INVALID_PARAMETER;
+    }
+
+    MixerCaps->wMid = MixerInfo->MixCaps.wMid;
+    MixerCaps->wPid = MixerInfo->MixCaps.wPid;
+    MixerCaps->vDriverVersion = MixerInfo->MixCaps.vDriverVersion;
+    MixerCaps->fdwSupport = MixerInfo->MixCaps.fdwSupport;
+    MixerCaps->cDestinations = MixerInfo->MixCaps.cDestinations;
+    wcscpy(MixerCaps->szPname, MixerInfo->MixCaps.szPname);
+
+    return MM_STATUS_SUCCESS;
+}
+
+MIXER_STATUS
+MMixerOpen(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PVOID MixerEvent,
+    IN PMIXER_EVENT MixerEventRoutine,
+    OUT PHANDLE MixerHandle)
+{
+    MIXER_STATUS Status;
+
+    // verify mixer context
+    Status = MMixerVerifyContext(MixerContext);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // invalid context passed
+        return Status;
+    }
+
+    return MM_STATUS_NOT_IMPLEMENTED;
+}
+
+MIXER_STATUS
+MMixerGetLineInfo(
+    IN PMIXER_CONTEXT MixerContext,
+    IN  HANDLE MixerHandle,
+    IN  ULONG Flags,
+    OUT LPMIXERLINEW MixerLine)
+{
+    MIXER_STATUS Status;
+
+    // verify mixer context
+    Status = MMixerVerifyContext(MixerContext);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // invalid context passed
+        return Status;
+    }
+    return MM_STATUS_NOT_IMPLEMENTED;
+}
+
+MIXER_STATUS
+MMixerGetLineControls(
+    IN PMIXER_CONTEXT MixerContext,
+    IN HANDLE MixerHandle,
+    IN ULONG Flags,
+    OUT LPMIXERLINECONTROLS MixerLineControls)
+{
+    MIXER_STATUS Status;
+
+    // verify mixer context
+    Status = MMixerVerifyContext(MixerContext);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // invalid context passed
+        return Status;
+    }
+
+    return MM_STATUS_NOT_IMPLEMENTED;
+}
+
+MIXER_STATUS
+MMixerSetControlDetails(
+    IN PMIXER_CONTEXT MixerContext,
+    IN HANDLE MixerHandle,
+    IN ULONG Flags,
+    OUT LPMIXERCONTROLDETAILS MixerControlDetails)
+{
+    MIXER_STATUS Status;
+
+    // verify mixer context
+    Status = MMixerVerifyContext(MixerContext);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // invalid context passed
+        return Status;
+    }
+    return MM_STATUS_NOT_IMPLEMENTED;
+}
+
+MIXER_STATUS
+MMixerGetControlDetails(
+    IN PMIXER_CONTEXT MixerContext,
+    IN HANDLE MixerHandle,
+    IN ULONG Flags,
+    OUT LPMIXERCONTROLDETAILS MixerControlDetails)
+{
+    MIXER_STATUS Status;
+
+    // verify mixer context
+    Status = MMixerVerifyContext(MixerContext);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // invalid context passed
+        return Status;
+    }
+
+    return MM_STATUS_NOT_IMPLEMENTED;
+}
+
 MIXER_STATUS
 MMixerInitialize(
     IN PMIXER_CONTEXT MixerContext,
@@ -20,6 +183,7 @@ MMixerInitialize(
     HANDLE hMixer;
     ULONG DeviceIndex, Count;
     LPWSTR DeviceName;
+    PMIXER_LIST MixerList;
 
     if (!MixerContext || !EnumFunction || !EnumContext)
     {
@@ -27,12 +191,23 @@ MMixerInitialize(
         return MM_STATUS_INVALID_PARAMETER;
     }
 
-    if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free)
+    if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open || !MixerContext->Close)
     {
         // invalid parameter
         return MM_STATUS_INVALID_PARAMETER;
     }
 
+    // allocate a mixer list
+    MixerList = (PMIXER_LIST)MixerContext->Alloc(sizeof(MIXER_LIST));
+    if (!MixerList)
+    {
+        // no memory
+        return MM_STATUS_NO_MEMORY;
+    }
+
+     //initialize mixer list
+     MixerList->MixerListCount = 0;
+     InitializeListHead(&MixerList->MixerList);
 
     // start enumerating all available devices
     Count = 0;
@@ -59,7 +234,7 @@ MMixerInitialize(
         // increment device index
         DeviceIndex++;
 
-        Status = MMixerSetupFilter(MixerContext, hMixer, &Count, DeviceName);
+        Status = MMixerSetupFilter(MixerContext, MixerList, hMixer, &Count, DeviceName);
 
         if (Status != MM_STATUS_SUCCESS)
             break;
@@ -69,5 +244,3 @@ MMixerInitialize(
     // done
     return Status;
 }
-
-
index b577774..3f94eaf 100644 (file)
@@ -60,17 +60,12 @@ typedef struct
      PMIXER_CLOSE Close;
 }MIXER_CONTEXT, *PMIXER_CONTEXT;
 
-
-
-
-
 MIXER_STATUS
 MMixerInitialize(
-    IN PMIXER_CONTEXT MixerContext, 
+    IN PMIXER_CONTEXT MixerContext,
     IN PMIXER_ENUM EnumFunction,
     IN PVOID EnumContext);
 
-
 ULONG
 MMixerGetCount(
     IN PMIXER_CONTEXT MixerContext);
@@ -79,7 +74,7 @@ MIXER_STATUS
 MMixerGetCapabilities(
     IN PMIXER_CONTEXT MixerContext,
     IN ULONG MixerIndex,
-    OUT MIXERCAPSW MixerCaps);
+    OUT LPMIXERCAPSW MixerCaps);
 
 MIXER_STATUS
 MMixerOpen(
@@ -90,24 +85,28 @@ MMixerOpen(
 
 MIXER_STATUS
 MMixerGetLineInfo(
+    IN PMIXER_CONTEXT MixerContext,
     IN  HANDLE MixerHandle,
     IN  ULONG Flags,
     OUT LPMIXERLINEW MixerLine);
 
 MIXER_STATUS
 MMixerGetLineControls(
+    IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
     IN ULONG Flags,
     OUT LPMIXERLINECONTROLS MixerLineControls);
 
 MIXER_STATUS
 MMixerSetControlDetails(
+    IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
     IN ULONG Flags,
     OUT LPMIXERCONTROLDETAILS MixerControlDetails);
 
 MIXER_STATUS
 MMixerGetControlDetails(
+    IN PMIXER_CONTEXT MixerContext,
     IN HANDLE MixerHandle,
     IN ULONG Flags,
     OUT LPMIXERCONTROLDETAILS MixerControlDetails);
index 520fb88..430f509 100644 (file)
@@ -18,6 +18,7 @@
 
 typedef struct
 {
+    LIST_ENTRY    Entry;
     MIXERCAPSW    MixCaps;
     HANDLE        hMixer;
     LIST_ENTRY    LineList;
@@ -52,6 +53,11 @@ typedef struct
     PLONG Values;
 }MIXERVOLUME_DATA, *LPMIXERVOLUME_DATA;
 
+typedef struct
+{
+    ULONG MixerListCount;
+    LIST_ENTRY MixerList;
+}MIXER_LIST, *PMIXER_LIST;
 
 #define DESTINATION_LINE 0xFFFF0000
 
@@ -125,7 +131,8 @@ MMixerGetIndexOfGuid(
 
 MIXER_STATUS
 MMixerSetupFilter(
-    IN PMIXER_CONTEXT MixerContext, 
+    IN PMIXER_CONTEXT MixerContext,
+    IN PMIXER_LIST MixerList,
     IN HANDLE hMixer,
     IN PULONG DeviceCount,
     IN LPWSTR DeviceName);
@@ -148,4 +155,14 @@ MMixerGetControlsFromPin(
     IN ULONG bUpDirection,
     OUT PULONG Nodes);
 
+MIXER_STATUS
+MMixerVerifyContext(
+    IN PMIXER_CONTEXT MixerContext);
+
+LPMIXER_INFO
+MMixerGetMixerInfoByIndex(
+    IN PMIXER_CONTEXT MixerContext,
+    IN ULONG MixerIndex);
+
+
 #endif
index a5a9107..b1cd58d 100644 (file)
@@ -17,7 +17,7 @@ MMixerVerifyContext(
     if (MixerContext->SizeOfStruct != sizeof(MIXER_CONTEXT))
         return MM_STATUS_INVALID_PARAMETER;
 
-    if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free)
+    if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open || !MixerContext->Close)
         return MM_STATUS_INVALID_PARAMETER;
 
     if (!MixerContext->MixerContext)
@@ -38,6 +38,40 @@ MMixerFreeMixerInfo(
     MixerContext->Free((PVOID)MixerInfo);
 }
 
+LPMIXER_INFO
+MMixerGetMixerInfoByIndex(
+    IN PMIXER_CONTEXT MixerContext,
+    IN ULONG MixerIndex)
+{
+    LPMIXER_INFO MixerInfo;
+    PLIST_ENTRY Entry;
+    PMIXER_LIST MixerList;
+    ULONG Index = 0;
+
+    // get mixer list
+    MixerList = (PMIXER_LIST)MixerContext->MixerContext;
+
+    if (!MixerList->MixerListCount)
+        return NULL;
+
+    Entry = MixerList->MixerList.Flink;
+
+    while(Entry != &MixerList->MixerList)
+    {
+        MixerInfo = (LPMIXER_INFO)CONTAINING_RECORD(Entry, MIXER_INFO, Entry);
+
+        if (Index == MixerIndex)
+            return MixerInfo;
+
+        // move to next mixer entry
+        Index++;
+        Entry = Entry->Flink;
+    }
+
+    return NULL;
+}
+
+
 LPMIXERLINE_EXT
 MMixerGetSourceMixerLineByLineId(
     LPMIXER_INFO MixerInfo,