Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfilter.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel Streaming 00004 * FILE: lib/drivers/sound/mmixer/filter.c 00005 * PURPOSE: Mixer Filter Functions 00006 * PROGRAMMER: Johannes Anderwald 00007 */ 00008 00009 00010 00011 #include "priv.h" 00012 00013 ULONG 00014 MMixerGetFilterPinCount( 00015 IN PMIXER_CONTEXT MixerContext, 00016 IN HANDLE hMixer) 00017 { 00018 KSPROPERTY Pin; 00019 MIXER_STATUS Status; 00020 ULONG NumPins, BytesReturned; 00021 00022 /* setup property request */ 00023 Pin.Flags = KSPROPERTY_TYPE_GET; 00024 Pin.Set = KSPROPSETID_Pin; 00025 Pin.Id = KSPROPERTY_PIN_CTYPES; 00026 00027 /* query pin count */ 00028 Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&NumPins, sizeof(ULONG), (PULONG)&BytesReturned); 00029 00030 /* check for success */ 00031 if (Status != MM_STATUS_SUCCESS) 00032 return 0; 00033 00034 return NumPins; 00035 } 00036 00037 MIXER_STATUS 00038 MMixerGetFilterTopologyProperty( 00039 IN PMIXER_CONTEXT MixerContext, 00040 IN HANDLE hMixer, 00041 IN ULONG PropertyId, 00042 OUT PKSMULTIPLE_ITEM * OutMultipleItem) 00043 { 00044 KSPROPERTY Property; 00045 PKSMULTIPLE_ITEM MultipleItem; 00046 MIXER_STATUS Status; 00047 ULONG BytesReturned; 00048 00049 /* setup property request */ 00050 Property.Id = PropertyId; 00051 Property.Flags = KSPROPERTY_TYPE_GET; 00052 Property.Set = KSPROPSETID_Topology; 00053 00054 /* query for the size */ 00055 Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &BytesReturned); 00056 00057 if (Status != MM_STATUS_MORE_ENTRIES) 00058 return Status; 00059 00060 /* sanity check */ 00061 ASSERT(BytesReturned); 00062 00063 /* allocate an result buffer */ 00064 MultipleItem = (PKSMULTIPLE_ITEM)MixerContext->Alloc(BytesReturned); 00065 00066 if (!MultipleItem) 00067 { 00068 /* not enough memory */ 00069 return MM_STATUS_NO_MEMORY; 00070 } 00071 00072 /* query again with allocated buffer */ 00073 Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)MultipleItem, BytesReturned, &BytesReturned); 00074 00075 if (Status != MM_STATUS_SUCCESS) 00076 { 00077 /* failed */ 00078 MixerContext->Free((PVOID)MultipleItem); 00079 return Status; 00080 } 00081 00082 /* store result */ 00083 *OutMultipleItem = MultipleItem; 00084 00085 /* done */ 00086 return Status; 00087 } 00088 00089 MIXER_STATUS 00090 MMixerGetPhysicalConnection( 00091 IN PMIXER_CONTEXT MixerContext, 00092 IN HANDLE hMixer, 00093 IN ULONG PinId, 00094 OUT PKSPIN_PHYSICALCONNECTION *OutConnection) 00095 { 00096 KSP_PIN Pin; 00097 MIXER_STATUS Status; 00098 ULONG BytesReturned; 00099 PKSPIN_PHYSICALCONNECTION Connection; 00100 00101 /* setup the request */ 00102 Pin.Property.Flags = KSPROPERTY_TYPE_GET; 00103 Pin.Property.Id = KSPROPERTY_PIN_PHYSICALCONNECTION; 00104 Pin.Property.Set = KSPROPSETID_Pin; 00105 Pin.PinId = PinId; 00106 00107 /* query the pin for the physical connection */ 00108 Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned); 00109 00110 if (Status == MM_STATUS_UNSUCCESSFUL) 00111 { 00112 /* pin does not have a physical connection */ 00113 return Status; 00114 } 00115 DPRINT("Status %u BytesReturned %lu\n", Status, BytesReturned); 00116 Connection = (PKSPIN_PHYSICALCONNECTION)MixerContext->Alloc(BytesReturned); 00117 if (!Connection) 00118 { 00119 /* not enough memory */ 00120 return MM_STATUS_NO_MEMORY; 00121 } 00122 00123 /* query the pin for the physical connection */ 00124 Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)Connection, BytesReturned, &BytesReturned); 00125 if (Status != MM_STATUS_SUCCESS) 00126 { 00127 /* failed to query the physical connection */ 00128 MixerContext->Free(Connection); 00129 return Status; 00130 } 00131 00132 // store connection 00133 *OutConnection = Connection; 00134 return Status; 00135 } 00136 00137 ULONG 00138 MMixerGetControlTypeFromTopologyNode( 00139 IN LPGUID NodeType) 00140 { 00141 if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_AGC)) 00142 { 00143 /* automatic gain control */ 00144 return MIXERCONTROL_CONTROLTYPE_ONOFF; 00145 } 00146 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_LOUDNESS)) 00147 { 00148 /* loudness control */ 00149 return MIXERCONTROL_CONTROLTYPE_LOUDNESS; 00150 } 00151 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUTE)) 00152 { 00153 /* mute control */ 00154 return MIXERCONTROL_CONTROLTYPE_MUTE; 00155 } 00156 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_TONE)) 00157 { 00158 /* tone control 00159 * FIXME 00160 * MIXERCONTROL_CONTROLTYPE_ONOFF if KSPROPERTY_AUDIO_BASS_BOOST is supported 00161 * MIXERCONTROL_CONTROLTYPE_BASS if KSPROPERTY_AUDIO_BASS is supported 00162 * MIXERCONTROL_CONTROLTYPE_TREBLE if KSPROPERTY_AUDIO_TREBLE is supported 00163 */ 00164 UNIMPLEMENTED; 00165 return MIXERCONTROL_CONTROLTYPE_ONOFF; 00166 } 00167 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_VOLUME)) 00168 { 00169 /* volume control */ 00170 return MIXERCONTROL_CONTROLTYPE_VOLUME; 00171 } 00172 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_PEAKMETER)) 00173 { 00174 /* peakmeter control */ 00175 return MIXERCONTROL_CONTROLTYPE_PEAKMETER; 00176 } 00177 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX)) 00178 { 00179 /* mux control */ 00180 return MIXERCONTROL_CONTROLTYPE_MUX; 00181 } 00182 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX)) 00183 { 00184 /* mux control */ 00185 return MIXERCONTROL_CONTROLTYPE_MUX; 00186 } 00187 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_STEREO_WIDE)) 00188 { 00189 /* stero wide control */ 00190 return MIXERCONTROL_CONTROLTYPE_FADER; 00191 } 00192 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_CHORUS)) 00193 { 00194 /* chorus control */ 00195 return MIXERCONTROL_CONTROLTYPE_FADER; 00196 } 00197 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_REVERB)) 00198 { 00199 /* reverb control */ 00200 return MIXERCONTROL_CONTROLTYPE_FADER; 00201 } 00202 else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_SUPERMIX)) 00203 { 00204 /* supermix control 00205 * MIXERCONTROL_CONTROLTYPE_MUTE if KSPROPERTY_AUDIO_MUTE is supported 00206 */ 00207 UNIMPLEMENTED; 00208 return MIXERCONTROL_CONTROLTYPE_VOLUME; 00209 } 00210 /* TODO 00211 * check for other supported node types 00212 */ 00213 //UNIMPLEMENTED 00214 return 0; 00215 } 00216 00217 MIXER_STATUS 00218 MMixerSetGetControlDetails( 00219 IN PMIXER_CONTEXT MixerContext, 00220 IN HANDLE hMixer, 00221 IN ULONG NodeId, 00222 IN ULONG bSet, 00223 IN ULONG PropertyId, 00224 IN ULONG Channel, 00225 IN PLONG InputValue) 00226 { 00227 KSNODEPROPERTY_AUDIO_CHANNEL Property; 00228 MIXER_STATUS Status; 00229 LONG Value; 00230 ULONG BytesReturned; 00231 00232 if (bSet) 00233 Value = *InputValue; 00234 00235 /* setup the request */ 00236 RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL)); 00237 00238 Property.NodeProperty.NodeId = NodeId; 00239 Property.NodeProperty.Property.Id = PropertyId; 00240 Property.NodeProperty.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY; 00241 Property.NodeProperty.Property.Set = KSPROPSETID_Audio; 00242 Property.Channel = Channel; 00243 Property.Reserved = 0; 00244 00245 if (bSet) 00246 Property.NodeProperty.Property.Flags |= KSPROPERTY_TYPE_SET; 00247 else 00248 Property.NodeProperty.Property.Flags |= KSPROPERTY_TYPE_GET; 00249 00250 /* send the request */ 00251 Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), (PVOID)&Value, sizeof(LONG), &BytesReturned); 00252 00253 if (!bSet && Status == MM_STATUS_SUCCESS) 00254 { 00255 *InputValue = Value; 00256 } 00257 00258 DPRINT("Status %x bSet %u NodeId %u Value %d PropertyId %u\n", Status, bSet, NodeId, Value, PropertyId); 00259 return Status; 00260 } 00261 00262 ULONG 00263 MMixerGetPinInstanceCount( 00264 PMIXER_CONTEXT MixerContext, 00265 HANDLE hFilter, 00266 ULONG PinId) 00267 { 00268 KSP_PIN PinRequest; 00269 KSPIN_CINSTANCES PinInstances; 00270 ULONG BytesReturned; 00271 MIXER_STATUS Status; 00272 00273 /* query the instance count */ 00274 PinRequest.Reserved = 0; 00275 PinRequest.PinId = PinId; 00276 PinRequest.Property.Set = KSPROPSETID_Pin; 00277 PinRequest.Property.Flags = KSPROPERTY_TYPE_GET; 00278 PinRequest.Property.Id = KSPROPERTY_PIN_CINSTANCES; 00279 00280 Status = MixerContext->Control(hFilter, IOCTL_KS_PROPERTY, (PVOID)&PinRequest, sizeof(KSP_PIN), (PVOID)&PinInstances, sizeof(KSPIN_CINSTANCES), &BytesReturned); 00281 ASSERT(Status == MM_STATUS_SUCCESS); 00282 return PinInstances.CurrentCount; 00283 } Generated on Sun May 27 2012 04:24:45 for ReactOS by
1.7.6.1
|