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
112 DPRINT("Status %u BytesReturned %lu\n", Status
, BytesReturned
);
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
);
126 DPRINT("Status %u\n", Status
);
131 *OutConnection
= Connection
;
136 MMixerGetControlTypeFromTopologyNode(
139 if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_AGC
))
141 // automatic gain control
142 return MIXERCONTROL_CONTROLTYPE_ONOFF
;
144 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_LOUDNESS
))
147 return MIXERCONTROL_CONTROLTYPE_LOUDNESS
;
149 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_MUTE
))
152 return MIXERCONTROL_CONTROLTYPE_MUTE
;
154 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_TONE
))
158 // MIXERCONTROL_CONTROLTYPE_ONOFF if KSPROPERTY_AUDIO_BASS_BOOST is supported
159 // MIXERCONTROL_CONTROLTYPE_BASS if KSPROPERTY_AUDIO_BASS is supported
160 // MIXERCONTROL_CONTROLTYPE_TREBLE if KSPROPERTY_AUDIO_TREBLE is supported
162 return MIXERCONTROL_CONTROLTYPE_ONOFF
;
164 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_VOLUME
))
167 return MIXERCONTROL_CONTROLTYPE_VOLUME
;
169 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_PEAKMETER
))
172 return MIXERCONTROL_CONTROLTYPE_PEAKMETER
;
174 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_MUX
))
177 return MIXERCONTROL_CONTROLTYPE_MUX
;
179 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_MUX
))
182 return MIXERCONTROL_CONTROLTYPE_MUX
;
184 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_STEREO_WIDE
))
186 // stero wide control
187 return MIXERCONTROL_CONTROLTYPE_FADER
;
189 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_CHORUS
))
192 return MIXERCONTROL_CONTROLTYPE_FADER
;
194 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_REVERB
))
197 return MIXERCONTROL_CONTROLTYPE_FADER
;
199 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_SUPERMIX
))
202 // MIXERCONTROL_CONTROLTYPE_MUTE if KSPROPERTY_AUDIO_MUTE is supported
204 return MIXERCONTROL_CONTROLTYPE_VOLUME
;
207 //check for other supported node types
213 MMixerSetGetControlDetails(
214 IN PMIXER_CONTEXT MixerContext
,
222 KSNODEPROPERTY_AUDIO_CHANNEL Property
;
230 /* setup the request */
231 RtlZeroMemory(&Property
, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL
));
233 Property
.NodeProperty
.NodeId
= NodeId
;
234 Property
.NodeProperty
.Property
.Id
= PropertyId
;
235 Property
.NodeProperty
.Property
.Flags
= KSPROPERTY_TYPE_TOPOLOGY
;
236 Property
.NodeProperty
.Property
.Set
= KSPROPSETID_Audio
;
237 Property
.Channel
= Channel
;
238 Property
.Reserved
= 0;
241 Property
.NodeProperty
.Property
.Flags
|= KSPROPERTY_TYPE_SET
;
243 Property
.NodeProperty
.Property
.Flags
|= KSPROPERTY_TYPE_GET
;
245 /* send the request */
246 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Property
, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL
), (PVOID
)&Value
, sizeof(LONG
), &BytesReturned
);
248 if (!bSet
&& Status
== MM_STATUS_SUCCESS
)
253 DPRINT("Status %x bSet %u NodeId %u Value %d PropertyId %u\n", Status
, bSet
, NodeId
, Value
, PropertyId
);
258 MMixerGetPinInstanceCount(
259 PMIXER_CONTEXT MixerContext
,
264 KSPIN_CINSTANCES PinInstances
;
268 /* query the instance count */
269 PinRequest
.Reserved
= 0;
270 PinRequest
.PinId
= PinId
;
271 PinRequest
.Property
.Set
= KSPROPSETID_Pin
;
272 PinRequest
.Property
.Flags
= KSPROPERTY_TYPE_GET
;
273 PinRequest
.Property
.Id
= KSPROPERTY_PIN_CINSTANCES
;
275 Status
= MixerContext
->Control(hFilter
, IOCTL_KS_PROPERTY
, (PVOID
)&PinRequest
, sizeof(KSP_PIN
), (PVOID
)&PinInstances
, sizeof(KSPIN_CINSTANCES
), &BytesReturned
);
276 ASSERT(Status
== MM_STATUS_SUCCESS
);
277 return PinInstances
.CurrentCount
;