[AUDIO-BRINGUP]
[reactos.git] / lib / drivers / sound / mmixer / priv.h
index 2097294..07e7fa4 100644 (file)
 #define YDEBUG
 #include <debug.h>
 
+typedef struct __TOPOLOGY_NODE__
+{
+    GUID NodeType;
+    ULONG NodeIndex;
+
+    ULONG NodeConnectedToCount;
+    struct __TOPOLOGY_NODE__ ** NodeConnectedTo;
+
+    ULONG NodeConnectedFromCount;
+    struct __TOPOLOGY_NODE__ ** NodeConnectedFrom;
+
+    ULONG PinConnectedFromCount;
+    PULONG PinConnectedFrom;
+
+    ULONG PinConnectedToCount;
+    PULONG PinConnectedTo;
+
+    ULONG Visited;
+    ULONG Reserved;
+}TOPOLOGY_NODE, *PTOPOLOGY_NODE;
+
 typedef struct
 {
-    KSEVENTDATA EventData;
-    LIST_ENTRY Entry;
-}EVENT_ITEM, *LPEVENT_ITEM;
+    ULONG PinId;
+
+    ULONG NodesConnectedToCount;
+    PTOPOLOGY_NODE * NodesConnectedTo;
+
+    ULONG NodesConnectedFromCount;
+    PTOPOLOGY_NODE * NodesConnectedFrom;
+
+    ULONG PinConnectedFromCount;
+    PULONG PinConnectedFrom;
+
+    ULONG PinConnectedToCount;
+    PULONG PinConnectedTo;
+
+    ULONG Visited;
+}PIN, *PPIN;
+
+
+typedef struct
+{
+    ULONG TopologyPinsCount;
+    PPIN TopologyPins;
+
+    ULONG TopologyNodesCount;
+    PTOPOLOGY_NODE TopologyNodes;
+
+}TOPOLOGY, *PTOPOLOGY;
 
 typedef struct
 {
@@ -68,6 +113,7 @@ typedef struct
     HANDLE hDevice;
     HANDLE hDeviceInterfaceKey;
     LPWSTR DeviceName;
+    PTOPOLOGY Topology;
 }MIXER_DATA, *LPMIXER_DATA;
 
 typedef struct
@@ -82,20 +128,50 @@ typedef struct
     }u;
 }WAVE_INFO, *LPWAVE_INFO;
 
+typedef struct
+{
+    LIST_ENTRY Entry;
+    ULONG DeviceId;
+    ULONG PinId;
+    union
+    {
+        MIDIOUTCAPSW OutCaps;
+        MIDIINCAPSW InCaps;
+    }u;
+
+}MIDI_INFO, *LPMIDI_INFO;
+
 typedef struct
 {
     ULONG MixerListCount;
     LIST_ENTRY MixerList;
+
     ULONG MixerDataCount;
     LIST_ENTRY MixerData;
+
     ULONG WaveInListCount;
     LIST_ENTRY WaveInList;
+
     ULONG WaveOutListCount;
     LIST_ENTRY WaveOutList;
+
+    ULONG MidiInListCount;
+    LIST_ENTRY MidiInList;
+
+    ULONG MidiOutListCount;
+    LIST_ENTRY MidiOutList;
 }MIXER_LIST, *PMIXER_LIST;
 
-#define DESTINATION_LINE 0xFFFF0000
+typedef struct
+{
+    LIST_ENTRY Entry;
+    PVOID MixerEventContext;
+    PMIXER_EVENT MixerEventRoutine;
+
+}EVENT_NOTIFICATION_ENTRY, *PEVENT_NOTIFICATION_ENTRY;
 
+#define DESTINATION_LINE (0xFFFF0000)
+#define SOURCE_LINE (0x10000)
 ULONG
 MMixerGetFilterPinCount(
     IN PMIXER_CONTEXT MixerContext,
@@ -142,16 +218,6 @@ MMixerFreeMixerInfo(
     IN PMIXER_CONTEXT MixerContext,
     IN LPMIXER_INFO MixerInfo);
 
-MIXER_STATUS
-MMixerGetTargetPins(
-    IN PMIXER_CONTEXT MixerContext,
-    IN PKSMULTIPLE_ITEM NodeTypes,
-    IN PKSMULTIPLE_ITEM NodeConnections,
-    IN ULONG NodeIndex,
-    IN ULONG bUpDirection,
-    OUT PULONG Pins,
-    IN ULONG PinCount);
-
 MIXER_STATUS
 MMixerGetPhysicalConnection(
     IN PMIXER_CONTEXT MixerContext,
@@ -159,11 +225,6 @@ MMixerGetPhysicalConnection(
     IN ULONG PinId,
     OUT PKSPIN_PHYSICALCONNECTION *OutConnection);
 
-ULONG
-MMixerGetIndexOfGuid(
-    PKSMULTIPLE_ITEM MultipleItem,
-    LPCGUID NodeType);
-
 MIXER_STATUS
 MMixerSetupFilter(
     IN PMIXER_CONTEXT MixerContext,
@@ -171,23 +232,24 @@ MMixerSetupFilter(
     IN LPMIXER_DATA MixerData,
     IN PULONG DeviceCount);
 
-MIXER_STATUS
-MMixerGetTargetPinsByNodeConnectionIndex(
+PKSPIN_CONNECT
+MMixerAllocatePinConnect(
     IN PMIXER_CONTEXT MixerContext,
-    IN PKSMULTIPLE_ITEM NodeConnections,
-    IN PKSMULTIPLE_ITEM NodeTypes,
-    IN ULONG bUpDirection,
-    IN ULONG NodeConnectionIndex,
-    OUT PULONG Pins);
+    ULONG DataFormatSize);
 
 MIXER_STATUS
-MMixerGetControlsFromPin(
+MMixerGetAudioPinDataRanges(
     IN PMIXER_CONTEXT MixerContext,
-    IN PKSMULTIPLE_ITEM NodeConnections,
-    IN PKSMULTIPLE_ITEM NodeTypes,
+    IN HANDLE hDevice,
     IN ULONG PinId,
-    IN ULONG bUpDirection,
-    OUT PULONG Nodes);
+    IN OUT PKSMULTIPLE_ITEM * OutMultipleItem);
+
+VOID
+MMixerInitializeMidiForFilter(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PMIXER_LIST MixerList,
+    IN LPMIXER_DATA MixerData,
+    IN PTOPOLOGY Topology);
 
 MIXER_STATUS
 MMixerVerifyContext(
@@ -214,7 +276,7 @@ MMixerGetMixerControlById(
 MIXER_STATUS
 MMixerSetGetMuteControlDetails(
     IN PMIXER_CONTEXT MixerContext,
-    IN HANDLE hMixer,
+    IN LPMIXER_INFO MixerInfo,
     IN ULONG NodeId,
     IN ULONG dwLineID,
     IN LPMIXERCONTROLDETAILS MixerControlDetails,
@@ -223,7 +285,7 @@ MMixerSetGetMuteControlDetails(
 MIXER_STATUS
 MMixerSetGetVolumeControlDetails(
     IN PMIXER_CONTEXT MixerContext,
-    IN HANDLE hMixer,
+    IN LPMIXER_INFO MixerInfo,
     IN ULONG NodeId,
     IN ULONG bSet,
     LPMIXERCONTROLW MixerControl,
@@ -259,12 +321,6 @@ MMixerCreateMixerData(
     IN HANDLE hDevice,
     IN HANDLE hKey);
 
-MIXER_STATUS
-MMixerGetDeviceName(
-    IN PMIXER_CONTEXT MixerContext,
-    IN LPMIXER_INFO MixerInfo,
-    IN HANDLE hKey);
-
 MIXER_STATUS
 MMixerInitializeWaveInfo(
     IN PMIXER_CONTEXT MixerContext,
@@ -272,9 +328,150 @@ MMixerInitializeWaveInfo(
     IN LPMIXER_DATA MixerData,
     IN LPWSTR DeviceName,
     IN ULONG bWaveIn,
+    IN ULONG PinCount,
+    IN PULONG Pins);
+
+MIXER_STATUS
+MMixerAddEvent(
+    IN PMIXER_CONTEXT MixerContext,
+    IN OUT LPMIXER_INFO MixerInfo,
+    IN PVOID MixerEvent,
+    IN PMIXER_EVENT MixerEventRoutine);
+
+MIXER_STATUS
+MMixerGetDeviceName(
+    IN PMIXER_CONTEXT MixerContext,
+    OUT LPWSTR DeviceName,
+    IN HANDLE hKey);
+
+VOID
+MMixerInitializePinConnect(
+    IN OUT PKSPIN_CONNECT PinConnect,
     IN ULONG PinId);
 
 MIXER_STATUS
-MMixerAddEvents(
+MMixerGetPinDataFlowAndCommunication(
+    IN PMIXER_CONTEXT MixerContext,
+    IN HANDLE hDevice,
+    IN ULONG PinId,
+    OUT PKSPIN_DATAFLOW DataFlow,
+    OUT PKSPIN_COMMUNICATION Communication);
+
+
+/* topology.c */
+
+MIXER_STATUS
+MMixerCreateTopology(
     IN PMIXER_CONTEXT MixerContext,
-    IN OUT LPMIXER_INFO MixerInfo);
+    IN ULONG PinCount,
+    IN PKSMULTIPLE_ITEM NodeConnections,
+    IN PKSMULTIPLE_ITEM NodeTypes,
+    OUT PTOPOLOGY *OutTopology);
+
+VOID
+MMixerGetAllUpOrDownstreamPinsFromNodeIndex(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PTOPOLOGY Topology,
+    IN ULONG NodeIndex,
+    IN ULONG bUpStream,
+    OUT PULONG OutPinsCount,
+    OUT PULONG OutPins);
+
+MIXER_STATUS
+MMixerGetAllUpOrDownstreamPinsFromPinIndex(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PTOPOLOGY Topology,
+    IN ULONG PinIndex,
+    IN ULONG bUpStream,
+    OUT PULONG OutPinsCount,
+    OUT PULONG OutPins);
+
+VOID
+MMixerGetNextNodesFromPinIndex(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PTOPOLOGY Topology,
+    IN ULONG PinIndex,
+    IN ULONG bUpStream,
+    OUT PULONG OutNodesCount,
+    OUT PULONG OutNodes);
+
+MIXER_STATUS
+MMixerAllocateTopologyPinArray(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PTOPOLOGY Topology,
+    OUT PULONG * OutPins);
+
+MIXER_STATUS
+MMixerAllocateTopologyNodeArray(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PTOPOLOGY Topology,
+    OUT PULONG * OutPins);
+
+VOID
+MMixerGetAllUpOrDownstreamNodesFromPinIndex(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PTOPOLOGY Topology,
+    IN ULONG PinIndex,
+    IN ULONG bUpStream,
+    OUT PULONG OutNodesCount,
+    OUT PULONG OutNodes);
+
+VOID
+MMixerIsNodeTerminator(
+    IN PTOPOLOGY Topology,
+    IN ULONG NodeIndex,
+    OUT ULONG * bTerminator);
+
+VOID
+MMixerGetNextNodesFromNodeIndex(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PTOPOLOGY Topology,
+    IN ULONG NodeIndex,
+    IN ULONG bUpStream,
+    OUT PULONG OutNodesCount,
+    OUT PULONG OutNodes);
+
+LPGUID
+MMixerGetNodeTypeFromTopology(
+    IN PTOPOLOGY Topology,
+    IN ULONG NodeIndex);
+
+MIXER_STATUS
+MMixerGetAllUpOrDownstreamNodesFromNodeIndex(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PTOPOLOGY Topology,
+    IN ULONG NodeIndex,
+    IN ULONG bUpStream,
+    OUT PULONG OutNodesCount,
+    OUT PULONG OutNodes);
+
+MIXER_STATUS
+MMixerIsNodeConnectedToPin(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PTOPOLOGY Topology,
+    IN ULONG NodeIndex,
+    IN ULONG PinId,
+    IN ULONG bUpStream,
+    OUT PULONG bConnected);
+
+ULONG
+MMixerGetNodeIndexFromGuid(
+    IN PTOPOLOGY Topology,
+    IN const GUID *NodeType);
+
+VOID
+MMixerSetTopologyNodeReserved(
+    IN PTOPOLOGY Topology,
+    IN ULONG NodeIndex);
+
+VOID
+MMixerIsTopologyNodeReserved(
+    IN PTOPOLOGY Topology,
+    IN ULONG NodeIndex,
+    OUT PULONG bReserved);
+
+VOID
+MMixerGetTopologyPinCount(
+    IN PTOPOLOGY Topology,
+    OUT PULONG PinCount);
+