14const GUID KSNODETYPE_SUM = {0xDA441A60L, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
15const GUID KSNODETYPE_DAC = {0x507AE360L, 0xC554, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
16const GUID KSNODETYPE_ADC = {0x4D837FE0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
17const GUID KSNODETYPE_AGC = {0xE88C9BA0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
18const GUID KSNODETYPE_LOUDNESS = {0x41887440L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
19const GUID KSNODETYPE_MUTE = {0x02B223C0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
20const GUID KSNODETYPE_TONE = {0x7607E580L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
21const GUID KSNODETYPE_VOLUME = {0x3A5ACC00L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
22const GUID KSNODETYPE_PEAKMETER = {0xa085651e, 0x5f0d, 0x4b36, {0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e}};
23const GUID KSNODETYPE_MUX = {0x2CEAF780, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
24const GUID KSNODETYPE_STEREO_WIDE = {0xA9E69800L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
25const GUID KSNODETYPE_CHORUS = {0x20173F20L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
26const GUID KSNODETYPE_REVERB = {0xEF0328E0L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
27const GUID KSNODETYPE_SUPERMIX = {0xE573ADC0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
29const GUID KSPROPSETID_Audio = {0x45FFAAA0L, 0x6E1B, 0x11D0, {0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}};
30const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
31const GUID KSPROPSETID_General = {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
32const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
33const GUID KSEVENTSETID_AudioControlChange = {0xE85E9698L, 0xFA2F, 0x11D1, {0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}};
35const GUID KSDATAFORMAT_TYPE_MUSIC = {0xE725D360L, 0x62CC, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
36const GUID KSDATAFORMAT_SUBTYPE_MIDI = {0x1D262760L, 0xE957, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
37const GUID KSDATAFORMAT_SPECIFIER_NONE = {0x0F6417D6L, 0xC318, 0x11D0, {0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
67 Entry = MixerInfo->LineList.Flink;
69 while(
Entry != &MixerInfo->LineList)
77 if (MixerControl->
NodeID == NodeID)
81 ControlEntry = ControlEntry->
Flink;
103 ASSERT(LogicalPinArray[
Index] != LogicalPinArray[LowestId]);
106 if (LogicalPinArray[
Index] < LogicalPinArray[LowestId])
111 *PinOffset = LowestId;
148 if (MixerData->
hDevice == hDevice)
179 if (
Index == MixerIndex)
199 Entry = MixerList->MixerList.Flink;
200 while(
Entry != &MixerList->MixerList)
207 *OutMixerInfo = MixerInfo;
231 DPRINT(
"dwLineID %x dwLineID %x MixerLineSrc %p\n", MixerLineSrc->
Line.
dwLineID, dwLineID, MixerLineSrc);
257 DWORD dwComponentType)
303 *OutMixerLine = MixerLineSrc;
305 *OutMixerControl = MixerControl;
307 *NodeId = MixerControl->
NodeID;
310 ControlEntry = ControlEntry->
Flink;
346 Entry = MixerInfo->EventList.Flink;
347 while(
Entry != &MixerInfo->EventList)
419 PULONG LogicalNodes, ConnectedNodes;
427 DPRINT(
"MixerControlDetails %p\n", MixerControlDetails);
428 DPRINT(
"bSet %lx\n", bSet);
430 DPRINT(
"NodeId %lu\n", MixerControl->NodeID);
431 DPRINT(
"MixerControlDetails dwControlID %lu\n", MixerControlDetails->dwControlID);
432 DPRINT(
"MixerControlDetails cChannels %lu\n", MixerControlDetails->cChannels);
433 DPRINT(
"MixerControlDetails cMultipleItems %lu\n", MixerControlDetails->cMultipleItems);
434 DPRINT(
"MixerControlDetails cbDetails %lu\n", MixerControlDetails->cbDetails);
435 DPRINT(
"MixerControlDetails paDetails %p\n", MixerControlDetails->paDetails);
440 if (MixerControlDetails->cChannels != 1)
443 DPRINT1(
"Expected 1 channel but got %lu\n", MixerControlDetails->cChannels);
449 if (MixerControlDetails->cMultipleItems != MixerControl->Control.cMultipleItems)
451 DPRINT1(
"MultipleItems mismatch %lu expected %lu\n", MixerControlDetails->cMultipleItems, MixerControl->Control.cMultipleItems);
470 for(
Index = 0; Index < MixerControlDetails->cMultipleItems;
Index++)
472 if (Values[
Index].fValue)
476 CurLogicalPinOffset =
Index;
495 DPRINT(
"OldLogicalPinOffset %lu CurLogicalPinOffset %lu\n", OldLogicalPinOffset, CurLogicalPinOffset);
497 if (OldLogicalPinOffset == CurLogicalPinOffset)
557 ASSERT(LogicalNodesCount == MixerControlDetails->cMultipleItems);
558 ASSERT(LogicalNodesCount == MixerControl->Control.Metrics.dwReserved[0]);
566 if (CurLogicalPinOffset == OldLogicalPinOffset)
578 LogicalNodes[CurLogicalPinOffset] =
MAXULONG;
624 ASSERT(ConnectedNodesCount == LogicalNodesCount);
625 ASSERT(ConnectedNodesCount == MixerControlDetails->cMultipleItems);
626 ASSERT(ConnectedNodesCount == MixerControl->Control.Metrics.dwReserved[0]);
641 DPRINT1(
"PinOffset %lu LogicalPin %lu NodeId %lu LineName %S\n", CurLogicalPinOffset, LogicalNodes[CurLogicalPinOffset], ConnectedNodes[CurLogicalPinOffset], SourceLine->
Line.
szName);
649 LogicalNodes[CurLogicalPinOffset] =
MAXULONG;
724 Input->dwValue = dwValue;
742 Entry = MixerList->MixerData.Flink;
743 while(
Entry != &MixerList->MixerData)
746 if (MixerData->
DeviceId == DeviceId)
763 Entry = MixerList->MixerData.Flink;
764 while(
Entry != &MixerList->MixerData)
799 MixerList->MixerDataCount++;
815 HANDLE hMediaKey, hGuidKey;
907 PinConnect->Interface.Flags = 0;
910 PinConnect->Medium.Flags = 0;
911 PinConnect->PinToHandle =
NULL;
912 PinConnect->PinId = PinId;
914 PinConnect->Priority.PrioritySubClass = 1;
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
MIXER_CONTEXT MixerContext
#define KSPROPERTY_TYPE_SET
#define KSPROPERTY_TYPE_TOPOLOGY
#define KSPROPERTY_TYPE_GET
#define InsertTailList(ListHead, Entry)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
#define KSPRIORITY_NORMAL
#define KSMEDIUM_TYPE_ANYINSTANCE
#define KSMEDIUMSETID_Standard
#define IOCTL_KS_PROPERTY
@ KSINTERFACE_STANDARD_STREAMING
#define KSINTERFACESETID_Standard
@ KSPROPERTY_GENERAL_COMPONENTID
@ MM_STATUS_NOT_IMPLEMENTED
@ MM_STATUS_INVALID_PARAMETER
#define MIXERCONTROL_CONTROLF_UNIFORM
#define MIXER_SETCONTROLDETAILSF_VALUE
struct tMIXERCONTROLDETAILS_BOOLEAN * LPMIXERCONTROLDETAILS_BOOLEAN
#define MIXER_GETCONTROLDETAILSF_VALUE
#define MIXER_GETCONTROLDETAILSF_QUERYMASK
#define MM_MIXM_CONTROL_CHANGE
#define MIXER_SETCONTROLDETAILSF_CUSTOM
#define MIXER_SETCONTROLDETAILSF_QUERYMASK
#define MIXER_GETCONTROLDETAILSF_LISTTEXT
#define MM_MIXM_LINE_CHANGE
struct tagMIXERCONTROLDETAILS_LISTTEXTW * LPMIXERCONTROLDETAILS_LISTTEXTW
struct tMIXERCONTROLDETAILS_UNSIGNED * LPMIXERCONTROLDETAILS_UNSIGNED
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
_In_ ULONG _In_ ULONG _In_ ULONG Length
static const WCHAR szName[]
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
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)
struct MIXERLINE_EXT * LPMIXERLINE_EXT
struct EVENT_NOTIFICATION_ENTRY * PEVENT_NOTIFICATION_ENTRY
struct MIXERVOLUME_DATA * LPMIXERVOLUME_DATA
struct MIXER_DATA * LPMIXER_DATA
struct MIXERCONTROL_EXT * LPMIXERCONTROL_EXT
struct MIXER_LIST * PMIXER_LIST
VOID MMixerGetConnectedFromLogicalTopologyPins(IN PTOPOLOGY Topology, IN ULONG NodeIndex, OUT PULONG OutPinCount, OUT PULONG OutPins)
MIXER_STATUS MMixerAllocateTopologyNodeArray(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, OUT PULONG *OutPins)
VOID MMixerGetNextNodesFromNodeIndex(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN ULONG NodeIndex, IN ULONG bUpStream, OUT PULONG OutNodesCount, OUT PULONG OutNodes)
struct MIXER_INFO * LPMIXER_INFO
const GUID KSNODETYPE_DAC
const GUID KSPROPSETID_Audio
const GUID KSPROPSETID_Pin
const GUID KSNODETYPE_PEAKMETER
MIXER_STATUS MMixerSetGetMuteControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN LPMIXERCONTROL_EXT MixerControl, IN ULONG dwLineID, IN LPMIXERCONTROLDETAILS MixerControlDetails, IN ULONG bSet)
VOID MMixerFreeMixerInfo(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo)
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
const GUID KSDATAFORMAT_TYPE_MUSIC
LPMIXER_DATA MMixerGetDataByDeviceName(IN PMIXER_LIST MixerList, IN LPWSTR DeviceName)
const GUID KSEVENTSETID_AudioControlChange
VOID MMixerInitializePinConnect(IN OUT PKSPIN_CONNECT PinConnect, IN ULONG PinId)
const GUID KSNODETYPE_VOLUME
MIXER_STATUS MMixerGetDeviceNameWithComponentId(IN PMIXER_CONTEXT MixerContext, IN HANDLE hMixer, OUT LPWSTR OutDeviceName)
ULONG MMixerGetVolumeControlIndex(LPMIXERVOLUME_DATA VolumeData, LONG Value)
const GUID KSNODETYPE_CHORUS
const GUID KSNODETYPE_AGC
const GUID KSNODETYPE_SUPERMIX
LPGUID MMixerGetNodeType(IN PKSMULTIPLE_ITEM MultipleItem, IN ULONG Index)
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)
const GUID KSNODETYPE_SUM
MIXER_STATUS MMixerGetMixerByName(IN PMIXER_LIST MixerList, IN LPWSTR MixerName, OUT LPMIXER_INFO *OutMixerInfo)
MIXER_STATUS MMixerGetDeviceName(IN PMIXER_CONTEXT MixerContext, OUT LPWSTR DeviceName, IN HANDLE hKey)
const GUID KSDATAFORMAT_SPECIFIER_NONE
const GUID KSNODETYPE_ADC
MIXER_STATUS MMixerGetMixerControlById(LPMIXER_INFO MixerInfo, DWORD dwControlID, LPMIXERLINE_EXT *OutMixerLine, LPMIXERCONTROL_EXT *OutMixerControl, PULONG NodeId)
const GUID KSNODETYPE_MUX
const GUID KSNODETYPE_MUTE
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
LPMIXERLINE_EXT MMixerGetSourceMixerLineByComponentType(LPMIXER_INFO MixerInfo, DWORD dwComponentType)
VOID MMixerGetLowestLogicalTopologyPinOffsetFromArray(IN ULONG LogicalPinArrayCount, IN PULONG LogicalPinArray, OUT PULONG PinOffset)
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 MMixerCreateMixerData(IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList, IN ULONG DeviceId, IN LPWSTR DeviceName, IN HANDLE hDevice, IN HANDLE hKey)
LPMIXERLINE_EXT MMixerGetMixerLineContainingNodeId(IN LPMIXER_INFO MixerInfo, IN ULONG NodeID)
const GUID KSNODETYPE_STEREO_WIDE
VOID MMixerNotifyControlChange(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN ULONG NotificationType, IN ULONG Value)
const GUID KSNODETYPE_REVERB
const GUID KSNODETYPE_TONE
LPMIXERLINE_EXT MMixerGetSourceMixerLineByLineId(LPMIXER_INFO MixerInfo, DWORD dwLineID)
const GUID KSPROPSETID_General
LPMIXER_DATA MMixerGetMixerDataByDeviceHandle(IN PMIXER_CONTEXT MixerContext, IN HANDLE hDevice)
const GUID KSDATAFORMAT_SUBTYPE_MIDI
const GUID KSPROPSETID_Topology
LPMIXER_DATA MMixerGetDataByDeviceId(IN PMIXER_LIST MixerList, IN ULONG DeviceId)
const GUID KSNODETYPE_LOUDNESS
base of all file and directory entries
PMIXER_ALLOC_EVENT_DATA AllocEventData
PMIXER_DEVICE_CONTROL Control
PMIXER_QUERY_KEY_VALUE QueryKeyValue
PMIXER_FREE_EVENT_DATA FreeEventData
HANDLE hDeviceInterfaceKey
struct _LIST_ENTRY * Flink
WCHAR szPname[MAXPNAMELEN]
WCHAR szName[MIXER_LONG_NAME_CHARS]
#define CONTAINING_RECORD(address, type, field)
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
_In_ WDF_SPECIAL_FILE_TYPE NotificationType
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
_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
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Must_inspect_result_ _In_ ULONG Flags
_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