14 const GUID KSNODETYPE_SUM = {0xDA441A60
L, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
15 const GUID KSNODETYPE_DAC = {0x507AE360
L, 0xC554, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
16 const GUID KSNODETYPE_ADC = {0x4D837FE0
L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
17 const GUID KSNODETYPE_AGC = {0xE88C9BA0
L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
18 const GUID KSNODETYPE_LOUDNESS = {0x41887440
L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
19 const GUID KSNODETYPE_MUTE = {0x02B223C0
L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
20 const GUID KSNODETYPE_TONE = {0x7607E580
L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
21 const GUID KSNODETYPE_VOLUME = {0x3A5ACC00
L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
22 const GUID KSNODETYPE_PEAKMETER = {0xa085651e, 0x5f0d, 0x4b36, {0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e}};
23 const GUID KSNODETYPE_MUX = {0x2CEAF780, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
24 const GUID KSNODETYPE_STEREO_WIDE = {0xA9E69800
L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
25 const GUID KSNODETYPE_CHORUS = {0x20173F20
L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
26 const GUID KSNODETYPE_REVERB = {0xEF0328E0
L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
27 const GUID KSNODETYPE_SUPERMIX = {0xE573ADC0
L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
29 const GUID KSPROPSETID_Audio = {0x45FFAAA0
L, 0x6E1B, 0x11D0, {0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}};
30 const GUID KSPROPSETID_Pin = {0x8C134960
L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
31 const GUID KSPROPSETID_General = {0x1464EDA5
L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
32 const GUID KSPROPSETID_Topology = {0x720D4AC0
L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
33 const GUID KSEVENTSETID_AudioControlChange = {0xE85E9698
L, 0xFA2F, 0x11D1, {0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}};
35 const GUID KSDATAFORMAT_TYPE_MUSIC = {0xE725D360
L, 0x62CC, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
36 const GUID KSDATAFORMAT_SUBTYPE_MIDI = {0x1D262760
L, 0xE957, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
37 const GUID KSDATAFORMAT_SPECIFIER_NONE = {0x0F6417D6
L, 0xC318, 0x11D0, {0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
68 Entry = MixerInfo->LineList.Flink;
70 while(
Entry != &MixerInfo->LineList)
78 if (MixerControl->
NodeID == NodeID)
82 ControlEntry = ControlEntry->
Flink;
104 ASSERT(LogicalPinArray[
Index] != LogicalPinArray[LowestId]);
107 if (LogicalPinArray[
Index] < LogicalPinArray[LowestId])
112 *PinOffset = LowestId;
150 if (MixerData->
hDevice == hDevice)
182 if (
Index == MixerIndex)
202 Entry = MixerList->MixerList.Flink;
203 while(
Entry != &MixerList->MixerList)
210 *OutMixerInfo = MixerInfo;
234 DPRINT(
"dwLineID %x dwLineID %x MixerLineSrc %p\n", MixerLineSrc->
Line.
dwLineID, dwLineID, MixerLineSrc);
260 DWORD dwComponentType)
306 *OutMixerLine = MixerLineSrc;
308 *OutMixerControl = MixerControl;
310 *NodeId = MixerControl->
NodeID;
313 ControlEntry = ControlEntry->
Flink;
349 Entry = MixerInfo->EventList.Flink;
350 while(
Entry != &MixerInfo->EventList)
422 PULONG LogicalNodes, ConnectedNodes;
430 DPRINT(
"MixerControlDetails %p\n", MixerControlDetails);
431 DPRINT(
"bSet %lx\n", bSet);
433 DPRINT(
"NodeId %lu\n", MixerControl->NodeID);
434 DPRINT(
"MixerControlDetails dwControlID %lu\n", MixerControlDetails->dwControlID);
435 DPRINT(
"MixerControlDetails cChannels %lu\n", MixerControlDetails->cChannels);
436 DPRINT(
"MixerControlDetails cMultipleItems %lu\n", MixerControlDetails->cMultipleItems);
437 DPRINT(
"MixerControlDetails cbDetails %lu\n", MixerControlDetails->cbDetails);
438 DPRINT(
"MixerControlDetails paDetails %p\n", MixerControlDetails->paDetails);
443 if (MixerControlDetails->cChannels != 1)
446 DPRINT1(
"Expected 1 channel but got %lu\n", MixerControlDetails->cChannels);
452 if (MixerControlDetails->cMultipleItems != MixerControl->Control.cMultipleItems)
454 DPRINT1(
"MultipleItems mismatch %lu expected %lu\n", MixerControlDetails->cMultipleItems, MixerControl->Control.cMultipleItems);
475 if (Values[
Index].fValue)
479 CurLogicalPinOffset =
Index;
498 DPRINT(
"OldLogicalPinOffset %lu CurLogicalPinOffset %lu\n", OldLogicalPinOffset, CurLogicalPinOffset);
500 if (OldLogicalPinOffset == CurLogicalPinOffset)
560 ASSERT(LogicalNodesCount == MixerControlDetails->cMultipleItems);
561 ASSERT(LogicalNodesCount == MixerControl->Control.Metrics.dwReserved[0]);
569 if (CurLogicalPinOffset == OldLogicalPinOffset)
581 LogicalNodes[CurLogicalPinOffset] =
MAXULONG;
627 ASSERT(ConnectedNodesCount == LogicalNodesCount);
628 ASSERT(ConnectedNodesCount == MixerControlDetails->cMultipleItems);
629 ASSERT(ConnectedNodesCount == MixerControl->Control.Metrics.dwReserved[0]);
644 DPRINT1(
"PinOffset %lu LogicalPin %lu NodeId %lu LineName %S\n", CurLogicalPinOffset, LogicalNodes[CurLogicalPinOffset], ConnectedNodes[CurLogicalPinOffset], SourceLine->
Line.
szName);
652 LogicalNodes[CurLogicalPinOffset] =
MAXULONG;
727 Input->dwValue = dwValue;
745 Entry = MixerList->MixerData.Flink;
746 while(
Entry != &MixerList->MixerData)
749 if (MixerData->
DeviceId == DeviceId)
766 Entry = MixerList->MixerData.Flink;
767 while(
Entry != &MixerList->MixerData)
802 MixerList->MixerDataCount++;
818 HANDLE hMediaKey, hGuidKey;
910 PinConnect->Interface.Flags = 0;
913 PinConnect->Medium.Flags = 0;
914 PinConnect->PinToHandle =
NULL;
915 PinConnect->PinId = PinId;
917 PinConnect->Priority.PrioritySubClass = 1;
VOID MMixerNotifyControlChange(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN ULONG NotificationType, IN ULONG Value)
const GUID KSNODETYPE_TONE
LPMIXER_DATA MMixerGetMixerDataByDeviceHandle(IN PMIXER_CONTEXT MixerContext, IN HANDLE hDevice)
LPMIXERLINE_EXT MMixerGetMixerLineContainingNodeId(IN LPMIXER_INFO MixerInfo, IN ULONG NodeID)
#define IOCTL_KS_PROPERTY
const GUID KSDATAFORMAT_TYPE_MUSIC
static const WCHAR szName[]
#define MIXER_GETCONTROLDETAILSF_VALUE
LPGUID MMixerGetNodeType(IN PKSMULTIPLE_ITEM MultipleItem, IN ULONG Index)
const GUID KSNODETYPE_PEAKMETER
_In_ ULONG _In_ ULONG _In_ ULONG Length
VOID MMixerFreeMixerInfo(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo)
MIXER_STATUS MMixerGetMixerControlById(LPMIXER_INFO MixerInfo, DWORD dwControlID, LPMIXERLINE_EXT *OutMixerLine, LPMIXERCONTROL_EXT *OutMixerControl, PULONG NodeId)
#define MIXER_SETCONTROLDETAILSF_CUSTOM
#define KSPRIORITY_NORMAL
MIXER_STATUS MMixerSetGetMuteControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN LPMIXERCONTROL_EXT MixerControl, IN ULONG dwLineID, IN LPMIXERCONTROLDETAILS MixerControlDetails, IN ULONG bSet)
const GUID KSEVENTSETID_AudioControlChange
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
struct tMIXERCONTROLDETAILS_BOOLEAN * LPMIXERCONTROLDETAILS_BOOLEAN
const GUID KSNODETYPE_MUTE
LPMIXER_DATA MMixerGetDataByDeviceName(IN PMIXER_LIST MixerList, IN LPWSTR DeviceName)
#define MIXER_GETCONTROLDETAILSF_LISTTEXT
#define KSINTERFACESETID_Standard
MIXER_STATUS MMixerGetMixerByName(IN PMIXER_LIST MixerList, IN LPWSTR MixerName, OUT LPMIXER_INFO *OutMixerInfo)
const GUID KSNODETYPE_VOLUME
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 ComponentId
const GUID KSNODETYPE_MUX
#define KSMEDIUMSETID_Standard
#define InsertTailList(ListHead, Entry)
#define KSPROPERTY_TYPE_GET
struct MIXER_DATA * LPMIXER_DATA
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_ ULONG _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesReturned
#define MIXERCONTROL_CONTROLF_UNIFORM
_In_ WDF_SPECIAL_FILE_TYPE NotificationType
const GUID KSNODETYPE_LOUDNESS
#define MIXER_SETCONTROLDETAILSF_QUERYMASK
MIXER_STATUS MMixerSetGetMuxControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG bSet, IN ULONG Flags, IN LPMIXERCONTROL_EXT MixerControl, IN LPMIXERCONTROLDETAILS MixerControlDetails, IN LPMIXERLINE_EXT MixerLine)
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
_In_ ULONG _In_opt_ PVOID _In_ PDRIVER_OBJECT _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE _Inout_opt_ __drv_aliasesMem PVOID _Outptr_result_nullonfailure_ _At_ * NotificationEntry(return==0, __drv_allocatesMem(Mem))) PVOID *NotificationEntry
const GUID KSNODETYPE_SUPERMIX
const GUID KSNODETYPE_STEREO_WIDE
MIXER_CONTEXT MixerContext
PMIXER_DEVICE_CONTROL Control
#define MIXER_SETCONTROLDETAILSF_VALUE
const GUID KSDATAFORMAT_SPECIFIER_NONE
struct MIXERCONTROL_EXT * LPMIXERCONTROL_EXT
HANDLE hDeviceInterfaceKey
MIXER_STATUS MMixerSetGetVolumeControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG bSet, LPMIXERCONTROL_EXT MixerControl, IN LPMIXERCONTROLDETAILS MixerControlDetails, LPMIXERLINE_EXT MixerLine)
MIXER_STATUS MMixerGetDeviceNameWithComponentId(IN PMIXER_CONTEXT MixerContext, IN HANDLE hMixer, OUT LPWSTR OutDeviceName)
struct tagMIXERCONTROLDETAILS_LISTTEXTW * LPMIXERCONTROLDETAILS_LISTTEXTW
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
PMIXER_ALLOC_EVENT_DATA AllocEventData
PMIXER_FREE_EVENT_DATA FreeEventData
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
struct _LIST_ENTRY * Flink
VOID MMixerGetNextNodesFromNodeIndex(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN ULONG NodeIndex, IN ULONG bUpStream, OUT PULONG OutNodesCount, OUT PULONG OutNodes)
_Must_inspect_result_ _In_ ULONG Flags
MIXER_STATUS MMixerCreateMixerData(IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList, IN ULONG DeviceId, IN LPWSTR DeviceName, IN HANDLE hDevice, IN HANDLE hKey)
PMIXER_QUERY_KEY_VALUE QueryKeyValue
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
_In_ WDFCOLLECTION _In_ ULONG Index
const GUID KSNODETYPE_AGC
struct EVENT_NOTIFICATION_ENTRY * PEVENT_NOTIFICATION_ENTRY
const GUID KSDATAFORMAT_SUBTYPE_MIDI
const GUID KSNODETYPE_DAC
const GUID KSNODETYPE_SUM
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define MIXER_GETCONTROLDETAILSF_QUERYMASK
MIXER_STATUS MMixerGetDeviceName(IN PMIXER_CONTEXT MixerContext, OUT LPWSTR DeviceName, IN HANDLE hKey)
const GUID KSNODETYPE_REVERB
const GUID KSPROPSETID_Audio
struct tMIXERCONTROLDETAILS_UNSIGNED * LPMIXERCONTROLDETAILS_UNSIGNED
MIXER_STATUS MMixerSetGetControlDetails(IN PMIXER_CONTEXT MixerContext, IN HANDLE hMixer, IN ULONG NodeId, IN ULONG bSet, IN ULONG PropertyId, IN ULONG Channel, IN PLONG InputValue)
const GUID KSPROPSETID_Pin
VOID MMixerGetLowestLogicalTopologyPinOffsetFromArray(IN ULONG LogicalPinArrayCount, IN PULONG LogicalPinArray, OUT PULONG PinOffset)
struct MIXERVOLUME_DATA * LPMIXERVOLUME_DATA
VOID MMixerInitializePinConnect(IN OUT PKSPIN_CONNECT PinConnect, IN ULONG PinId)
const GUID KSNODETYPE_ADC
#define KSMEDIUM_TYPE_ANYINSTANCE
WCHAR szName[MIXER_LONG_NAME_CHARS]
LPMIXER_DATA MMixerGetDataByDeviceId(IN PMIXER_LIST MixerList, IN ULONG DeviceId)
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
LPMIXERLINE_EXT MMixerGetSourceMixerLineByComponentType(LPMIXER_INFO MixerInfo, DWORD dwComponentType)
const GUID KSNODETYPE_CHORUS
const GUID KSPROPSETID_General
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
struct MIXER_LIST * PMIXER_LIST
struct MIXER_INFO * LPMIXER_INFO
WCHAR szPname[MAXPNAMELEN]
VOID MMixerGetConnectedFromLogicalTopologyPins(IN PTOPOLOGY Topology, IN ULONG NodeIndex, OUT PULONG OutPinCount, OUT PULONG OutPins)
LPMIXERLINE_EXT MMixerGetSourceMixerLineByLineId(LPMIXER_INFO MixerInfo, DWORD dwLineID)
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
#define MM_MIXM_LINE_CHANGE
#define KSPROPERTY_TYPE_TOPOLOGY
const GUID KSPROPSETID_Topology
#define KSPROPERTY_TYPE_SET
base of all file and directory entries
MIXER_STATUS MMixerAllocateTopologyNodeArray(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, OUT PULONG *OutPins)
ULONG MMixerGetVolumeControlIndex(LPMIXERVOLUME_DATA VolumeData, LONG Value)
struct MIXERLINE_EXT * LPMIXERLINE_EXT
#define MM_MIXM_CONTROL_CHANGE