#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
{
HANDLE hDevice;
HANDLE hDeviceInterfaceKey;
LPWSTR DeviceName;
+ PTOPOLOGY Topology;
}MIXER_DATA, *LPMIXER_DATA;
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,
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,
IN ULONG PinId,
OUT PKSPIN_PHYSICALCONNECTION *OutConnection);
-ULONG
-MMixerGetIndexOfGuid(
- PKSMULTIPLE_ITEM MultipleItem,
- LPCGUID NodeType);
-
MIXER_STATUS
MMixerSetupFilter(
IN PMIXER_CONTEXT MixerContext,
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(
MIXER_STATUS
MMixerSetGetMuteControlDetails(
IN PMIXER_CONTEXT MixerContext,
- IN HANDLE hMixer,
+ IN LPMIXER_INFO MixerInfo,
IN ULONG NodeId,
IN ULONG dwLineID,
IN LPMIXERCONTROLDETAILS MixerControlDetails,
MIXER_STATUS
MMixerSetGetVolumeControlDetails(
IN PMIXER_CONTEXT MixerContext,
- IN HANDLE hMixer,
+ IN LPMIXER_INFO MixerInfo,
IN ULONG NodeId,
IN ULONG bSet,
LPMIXERCONTROLW MixerControl,
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,
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);
+
+/* 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
+MMixerGetTopologyPinCount(
+ IN PTOPOLOGY Topology,
+ OUT PULONG PinCount);
+