2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: lib/drivers/sound/mmixer/filter.c
5 * PURPOSE: Mixer Filter Functions
6 * PROGRAMMER: Johannes Anderwald
14 MMixerGetFilterPinCount(
15 IN PMIXER_CONTEXT MixerContext
,
20 ULONG NumPins
, BytesReturned
;
22 // setup property request
23 Pin
.Flags
= KSPROPERTY_TYPE_GET
;
24 Pin
.Set
= KSPROPSETID_Pin
;
25 Pin
.Id
= KSPROPERTY_PIN_CTYPES
;
28 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Pin
, sizeof(KSPROPERTY
), (PVOID
)&NumPins
, sizeof(ULONG
), (PULONG
)&BytesReturned
);
31 if (Status
!= MM_STATUS_SUCCESS
)
38 MMixerGetFilterTopologyProperty(
39 IN PMIXER_CONTEXT MixerContext
,
42 OUT PKSMULTIPLE_ITEM
* OutMultipleItem
)
45 PKSMULTIPLE_ITEM MultipleItem
;
49 // setup property request
50 Property
.Id
= PropertyId
;
51 Property
.Flags
= KSPROPERTY_TYPE_GET
;
52 Property
.Set
= KSPROPSETID_Topology
;
55 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Property
, sizeof(KSPROPERTY
), NULL
, 0, &BytesReturned
);
57 if (Status
!= MM_STATUS_MORE_ENTRIES
)
60 // allocate an result buffer
61 MultipleItem
= (PKSMULTIPLE_ITEM
)MixerContext
->Alloc(BytesReturned
);
66 return MM_STATUS_NO_MEMORY
;
69 // query again with allocated buffer
70 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Property
, sizeof(KSPROPERTY
), (PVOID
)MultipleItem
, BytesReturned
, &BytesReturned
);
72 if (Status
!= MM_STATUS_SUCCESS
)
75 MixerContext
->Free((PVOID
)MultipleItem
);
80 *OutMultipleItem
= MultipleItem
;
87 MMixerGetPhysicalConnection(
88 IN PMIXER_CONTEXT MixerContext
,
91 OUT PKSPIN_PHYSICALCONNECTION
*OutConnection
)
96 PKSPIN_PHYSICALCONNECTION Connection
;
98 /* setup the request */
99 Pin
.Property
.Flags
= KSPROPERTY_TYPE_GET
;
100 Pin
.Property
.Id
= KSPROPERTY_PIN_PHYSICALCONNECTION
;
101 Pin
.Property
.Set
= KSPROPSETID_Pin
;
104 /* query the pin for the physical connection */
105 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Pin
, sizeof(KSP_PIN
), NULL
, 0, &BytesReturned
);
107 if (Status
== MM_STATUS_UNSUCCESSFUL
)
109 // pin does not have a physical connection
113 Connection
= (PKSPIN_PHYSICALCONNECTION
)MixerContext
->Alloc(BytesReturned
);
117 return MM_STATUS_NO_MEMORY
;
120 // query the pin for the physical connection
121 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Pin
, sizeof(KSP_PIN
), (PVOID
)Connection
, BytesReturned
, &BytesReturned
);
122 if (Status
!= MM_STATUS_SUCCESS
)
124 // failed to query the physical connection
125 MixerContext
->Free(Connection
);
130 *OutConnection
= Connection
;
135 MMixerGetControlTypeFromTopologyNode(
138 if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_AGC
))
140 // automatic gain control
141 return MIXERCONTROL_CONTROLTYPE_ONOFF
;
143 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_LOUDNESS
))
146 return MIXERCONTROL_CONTROLTYPE_LOUDNESS
;
148 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_MUTE
))
151 return MIXERCONTROL_CONTROLTYPE_MUTE
;
153 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_TONE
))
157 // MIXERCONTROL_CONTROLTYPE_ONOFF if KSPROPERTY_AUDIO_BASS_BOOST is supported
158 // MIXERCONTROL_CONTROLTYPE_BASS if KSPROPERTY_AUDIO_BASS is supported
159 // MIXERCONTROL_CONTROLTYPE_TREBLE if KSPROPERTY_AUDIO_TREBLE is supported
161 return MIXERCONTROL_CONTROLTYPE_ONOFF
;
163 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_VOLUME
))
166 return MIXERCONTROL_CONTROLTYPE_VOLUME
;
168 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_PEAKMETER
))
171 return MIXERCONTROL_CONTROLTYPE_PEAKMETER
;
173 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_MUX
))
176 return MIXERCONTROL_CONTROLTYPE_MUX
;
178 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_MUX
))
181 return MIXERCONTROL_CONTROLTYPE_MUX
;
183 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_STEREO_WIDE
))
185 // stero wide control
186 return MIXERCONTROL_CONTROLTYPE_FADER
;
188 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_CHORUS
))
191 return MIXERCONTROL_CONTROLTYPE_FADER
;
193 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_REVERB
))
196 return MIXERCONTROL_CONTROLTYPE_FADER
;
198 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_SUPERMIX
))
201 // MIXERCONTROL_CONTROLTYPE_MUTE if KSPROPERTY_AUDIO_MUTE is supported
203 return MIXERCONTROL_CONTROLTYPE_VOLUME
;
210 MMixerSetGetControlDetails(
211 IN PMIXER_CONTEXT MixerContext
,
219 KSNODEPROPERTY_AUDIO_CHANNEL Property
;
227 /* setup the request */
228 RtlZeroMemory(&Property
, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL
));
230 Property
.NodeProperty
.NodeId
= NodeId
;
231 Property
.NodeProperty
.Property
.Id
= PropertyId
;
232 Property
.NodeProperty
.Property
.Flags
= KSPROPERTY_TYPE_TOPOLOGY
;
233 Property
.NodeProperty
.Property
.Set
= KSPROPSETID_Audio
;
234 Property
.Channel
= Channel
;
235 Property
.Reserved
= 0;
238 Property
.NodeProperty
.Property
.Flags
|= KSPROPERTY_TYPE_SET
;
240 Property
.NodeProperty
.Property
.Flags
|= KSPROPERTY_TYPE_GET
;
242 /* send the request */
243 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Property
, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL
), (PVOID
)&Value
, sizeof(LONG
), &BytesReturned
);
245 if (!bSet
&& Status
== MM_STATUS_SUCCESS
)
250 DPRINT("Status %x bSet %u NodeId %u Value %d PropertyId %u\n", Status
, bSet
, NodeId
, Value
, PropertyId
);