ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

filter.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.