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
);
30 /* check for success */
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
;
54 /* query for the size */
55 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Property
, sizeof(KSPROPERTY
), NULL
, 0, &BytesReturned
);
57 if (Status
!= MM_STATUS_MORE_ENTRIES
)
61 ASSERT(BytesReturned
);
63 /* allocate an result buffer */
64 MultipleItem
= (PKSMULTIPLE_ITEM
)MixerContext
->Alloc(BytesReturned
);
68 /* not enough memory */
69 return MM_STATUS_NO_MEMORY
;
72 /* query again with allocated buffer */
73 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Property
, sizeof(KSPROPERTY
), (PVOID
)MultipleItem
, BytesReturned
, &BytesReturned
);
75 if (Status
!= MM_STATUS_SUCCESS
)
78 MixerContext
->Free((PVOID
)MultipleItem
);
83 *OutMultipleItem
= MultipleItem
;
90 MMixerGetPhysicalConnection(
91 IN PMIXER_CONTEXT MixerContext
,
94 OUT PKSPIN_PHYSICALCONNECTION
*OutConnection
)
99 PKSPIN_PHYSICALCONNECTION Connection
;
101 /* setup the request */
102 Pin
.Property
.Flags
= KSPROPERTY_TYPE_GET
;
103 Pin
.Property
.Id
= KSPROPERTY_PIN_PHYSICALCONNECTION
;
104 Pin
.Property
.Set
= KSPROPSETID_Pin
;
107 /* query the pin for the physical connection */
108 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Pin
, sizeof(KSP_PIN
), NULL
, 0, &BytesReturned
);
110 if (Status
== MM_STATUS_UNSUCCESSFUL
)
112 /* pin does not have a physical connection */
115 DPRINT("Status %u BytesReturned %lu\n", Status
, BytesReturned
);
116 Connection
= (PKSPIN_PHYSICALCONNECTION
)MixerContext
->Alloc(BytesReturned
);
119 /* not enough memory */
120 return MM_STATUS_NO_MEMORY
;
123 /* query the pin for the physical connection */
124 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Pin
, sizeof(KSP_PIN
), (PVOID
)Connection
, BytesReturned
, &BytesReturned
);
125 if (Status
!= MM_STATUS_SUCCESS
)
127 /* failed to query the physical connection */
128 MixerContext
->Free(Connection
);
133 *OutConnection
= Connection
;
138 MMixerGetControlTypeFromTopologyNode(
141 if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_AGC
))
143 /* automatic gain control */
144 return MIXERCONTROL_CONTROLTYPE_ONOFF
;
146 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_LOUDNESS
))
148 /* loudness control */
149 return MIXERCONTROL_CONTROLTYPE_LOUDNESS
;
151 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_MUTE
))
154 return MIXERCONTROL_CONTROLTYPE_MUTE
;
156 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_TONE
))
160 * MIXERCONTROL_CONTROLTYPE_ONOFF if KSPROPERTY_AUDIO_BASS_BOOST is supported
161 * MIXERCONTROL_CONTROLTYPE_BASS if KSPROPERTY_AUDIO_BASS is supported
162 * MIXERCONTROL_CONTROLTYPE_TREBLE if KSPROPERTY_AUDIO_TREBLE is supported
165 return MIXERCONTROL_CONTROLTYPE_ONOFF
;
167 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_VOLUME
))
170 return MIXERCONTROL_CONTROLTYPE_VOLUME
;
172 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_PEAKMETER
))
174 /* peakmeter control */
175 return MIXERCONTROL_CONTROLTYPE_PEAKMETER
;
177 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_MUX
))
180 return MIXERCONTROL_CONTROLTYPE_MUX
;
182 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_MUX
))
185 return MIXERCONTROL_CONTROLTYPE_MUX
;
187 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_STEREO_WIDE
))
189 /* stero wide control */
190 return MIXERCONTROL_CONTROLTYPE_FADER
;
192 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_CHORUS
))
195 return MIXERCONTROL_CONTROLTYPE_FADER
;
197 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_REVERB
))
200 return MIXERCONTROL_CONTROLTYPE_FADER
;
202 else if (IsEqualGUIDAligned(NodeType
, (LPGUID
)&KSNODETYPE_SUPERMIX
))
205 * MIXERCONTROL_CONTROLTYPE_MUTE if KSPROPERTY_AUDIO_MUTE is supported
208 return MIXERCONTROL_CONTROLTYPE_VOLUME
;
211 * check for other supported node types
218 MMixerSetGetControlDetails(
219 IN PMIXER_CONTEXT MixerContext
,
227 KSNODEPROPERTY_AUDIO_CHANNEL Property
;
235 /* setup the request */
236 RtlZeroMemory(&Property
, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL
));
238 Property
.NodeProperty
.NodeId
= NodeId
;
239 Property
.NodeProperty
.Property
.Id
= PropertyId
;
240 Property
.NodeProperty
.Property
.Flags
= KSPROPERTY_TYPE_TOPOLOGY
;
241 Property
.NodeProperty
.Property
.Set
= KSPROPSETID_Audio
;
242 Property
.Channel
= Channel
;
243 Property
.Reserved
= 0;
246 Property
.NodeProperty
.Property
.Flags
|= KSPROPERTY_TYPE_SET
;
248 Property
.NodeProperty
.Property
.Flags
|= KSPROPERTY_TYPE_GET
;
250 /* send the request */
251 Status
= MixerContext
->Control(hMixer
, IOCTL_KS_PROPERTY
, (PVOID
)&Property
, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL
), (PVOID
)&Value
, sizeof(LONG
), &BytesReturned
);
253 if (!bSet
&& Status
== MM_STATUS_SUCCESS
)
258 DPRINT("Status %x bSet %u NodeId %u Value %d PropertyId %u\n", Status
, bSet
, NodeId
, Value
, PropertyId
);
263 MMixerGetPinInstanceCount(
264 PMIXER_CONTEXT MixerContext
,
269 KSPIN_CINSTANCES PinInstances
;
273 /* query the instance count */
274 PinRequest
.Reserved
= 0;
275 PinRequest
.PinId
= PinId
;
276 PinRequest
.Property
.Set
= KSPROPSETID_Pin
;
277 PinRequest
.Property
.Flags
= KSPROPERTY_TYPE_GET
;
278 PinRequest
.Property
.Id
= KSPROPERTY_PIN_CINSTANCES
;
280 Status
= MixerContext
->Control(hFilter
, IOCTL_KS_PROPERTY
, (PVOID
)&PinRequest
, sizeof(KSP_PIN
), (PVOID
)&PinInstances
, sizeof(KSPIN_CINSTANCES
), &BytesReturned
);
281 ASSERT(Status
== MM_STATUS_SUCCESS
);
282 return PinInstances
.CurrentCount
;