[AUDIO-BRINGUP]
[reactos.git] / lib / drivers / sound / mmixer / priv.h
index 1580c8a..f794d71 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;
+    PULONG LogicalPinNodeConnectedFrom;
+
+    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;
+    ULONG Reserved;
+}PIN, *PPIN;
+
+
+typedef struct
+{
+    ULONG TopologyPinsCount;
+    PPIN TopologyPins;
+
+    ULONG TopologyNodesCount;
+    PTOPOLOGY_NODE TopologyNodes;
+
+}TOPOLOGY, *PTOPOLOGY;
 
 typedef struct
 {
     LIST_ENTRY    Entry;
     MIXERCAPSW    MixCaps;
-    HANDLE        hMixer;
     LIST_ENTRY    LineList;
     ULONG         ControlId;
     LIST_ENTRY    EventList;
@@ -36,12 +82,19 @@ typedef struct
 typedef struct
 {
     LIST_ENTRY Entry;
-    ULONG PinId;
+    MIXERCONTROLW Control;
+    ULONG NodeID;
     HANDLE hDevice;
+    PVOID ExtraData;
+}MIXERCONTROL_EXT, *LPMIXERCONTROL_EXT;
+
+typedef struct
+{
+    LIST_ENTRY Entry;
+    ULONG PinId;
     MIXERLINEW Line;
-    LPMIXERCONTROLW LineControls;
-    PULONG          NodeIds;
-    LIST_ENTRY LineControlsExtraData;
+    LIST_ENTRY ControlsList;
+
 }MIXERLINE_EXT, *LPMIXERLINE_EXT;
 
 typedef struct
@@ -68,6 +121,8 @@ typedef struct
     HANDLE hDevice;
     HANDLE hDeviceInterfaceKey;
     LPWSTR DeviceName;
+    PTOPOLOGY Topology;
+    LPMIXER_INFO MixerInfo;
 }MIXER_DATA, *LPMIXER_DATA;
 
 typedef struct
@@ -82,20 +137,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 +227,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 +234,6 @@ MMixerGetPhysicalConnection(
     IN ULONG PinId,
     OUT PKSPIN_PHYSICALCONNECTION *OutConnection);
 
-ULONG
-MMixerGetIndexOfGuid(
-    PKSMULTIPLE_ITEM MultipleItem,
-    LPCGUID NodeType);
-
 MIXER_STATUS
 MMixerSetupFilter(
     IN PMIXER_CONTEXT MixerContext,
@@ -171,24 +241,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,
-    IN ULONG PinCount,
-    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(
@@ -209,14 +279,14 @@ MMixerGetMixerControlById(
     LPMIXER_INFO MixerInfo,
     DWORD dwControlID,
     LPMIXERLINE_EXT *MixerLine,
-    LPMIXERCONTROLW *MixerControl,
+    LPMIXERCONTROL_EXT *MixerControl,
     PULONG NodeId);
 
 MIXER_STATUS
 MMixerSetGetMuteControlDetails(
     IN PMIXER_CONTEXT MixerContext,
-    IN HANDLE hMixer,
-    IN ULONG NodeId,
+    IN LPMIXER_INFO MixerInfo,
+    IN LPMIXERCONTROL_EXT MixerControl,
     IN ULONG dwLineID,
     IN LPMIXERCONTROLDETAILS MixerControlDetails,
     IN ULONG bSet);
@@ -224,10 +294,10 @@ MMixerSetGetMuteControlDetails(
 MIXER_STATUS
 MMixerSetGetVolumeControlDetails(
     IN PMIXER_CONTEXT MixerContext,
-    IN HANDLE hMixer,
+    IN LPMIXER_INFO MixerInfo,
     IN ULONG NodeId,
     IN ULONG bSet,
-    LPMIXERCONTROLW MixerControl,
+    LPMIXERCONTROL_EXT MixerControl,
     IN LPMIXERCONTROLDETAILS MixerControlDetails,
     LPMIXERLINE_EXT MixerLine);
 
@@ -260,22 +330,180 @@ MMixerCreateMixerData(
     IN HANDLE hDevice,
     IN HANDLE hKey);
 
+MIXER_STATUS
+MMixerInitializeWaveInfo(
+    IN PMIXER_CONTEXT MixerContext,
+    IN PMIXER_LIST MixerList,
+    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,
-    IN LPMIXER_INFO MixerInfo,
+    OUT LPWSTR DeviceName,
     IN HANDLE hKey);
 
+VOID
+MMixerInitializePinConnect(
+    IN OUT PKSPIN_CONNECT PinConnect,
+    IN ULONG PinId);
+
 MIXER_STATUS
-MMixerInitializeWaveInfo(
+MMixerGetPinDataFlowAndCommunication(
+    IN PMIXER_CONTEXT MixerContext,
+    IN HANDLE hDevice,
+    IN ULONG PinId,
+    OUT PKSPIN_DATAFLOW DataFlow,
+    OUT PKSPIN_COMMUNICATION Communication);
+
+VOID
+MMixerHandleAlternativeMixers(
     IN PMIXER_CONTEXT MixerContext,
     IN PMIXER_LIST MixerList,
     IN LPMIXER_DATA MixerData,
-    IN LPWSTR DeviceName,
-    IN ULONG bWaveIn,
-    IN ULONG PinId);
+    IN PTOPOLOGY Topology);
+
+MIXER_STATUS
+MMixerGetMixerByName(
+    IN PMIXER_LIST MixerList,
+    IN LPWSTR MixerName,
+    OUT LPMIXER_INFO *MixerInfo);
+
+/* topology.c */
+
+MIXER_STATUS
+MMixerCreateTopology(
+    IN PMIXER_CONTEXT MixerContext,
+    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
-MMixerAddEvents(
+MMixerGetAllUpOrDownstreamNodesFromNodeIndex(
     IN PMIXER_CONTEXT MixerContext,
-    IN OUT LPMIXER_INFO MixerInfo);
+    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
+MMixerSetTopologyPinReserved(
+    IN PTOPOLOGY Topology,
+    IN ULONG PinId);
+
+VOID
+MMixerIsTopologyPinReserved(
+    IN PTOPOLOGY Topology,
+    IN ULONG PinId,
+    OUT PULONG bReserved);
+
+VOID
+MMixerGetTopologyPinCount(
+    IN PTOPOLOGY Topology,
+    OUT PULONG PinCount);
+