Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Speech / Src / Internal / SapiInterop / SpeechEvent.cs / 1 / SpeechEvent.cs
//------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------- using System; using System.Runtime.InteropServices; using System.Speech.AudioFormat; namespace System.Speech.Internal.SapiInterop { // Internal helper class that wraps a SAPI event structure. // A new instance is created by calling SpeechEvent.TryCreateSpeechEvent // Disposing this class will dispose all unmanmanaged memory. internal class SpeechEvent : IDisposable { //******************************************************************* // // Constructors // //******************************************************************* #region Constructors private SpeechEvent(SPEVENTENUM eEventId, SPEVENTLPARAMTYPE elParamType, ulong ullAudioStreamOffset, IntPtr wParam, IntPtr lParam) { // We make a copy of the SPEVENTEX data but that's okay because the lParam will only be deleted once. _eventId = eEventId; _paramType = elParamType; _audioStreamOffset = ullAudioStreamOffset; _wParam = (ulong)wParam.ToInt64(); _lParam = (ulong)lParam; // Let the GC know if we have a unmanaged object with a given size if (_paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_POINTER || _paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_STRING) { GC.AddMemoryPressure(_sizeMemoryPressure = Marshal.SizeOf(_lParam)); } } private SpeechEvent(SPEVENT sapiEvent, SpeechAudioFormatInfo audioFormat) : this(sapiEvent.eEventId, sapiEvent.elParamType, sapiEvent.ullAudioStreamOffset, sapiEvent.wParam, sapiEvent.lParam) { if (audioFormat == null || audioFormat.EncodingFormat == 0) { _audioPosition = TimeSpan.Zero; } else { _audioPosition = audioFormat.AverageBytesPerSecond > 0 ? new TimeSpan ((long) ((sapiEvent.ullAudioStreamOffset * TimeSpan.TicksPerSecond) / (ulong) audioFormat.AverageBytesPerSecond)) : TimeSpan.Zero; } } private SpeechEvent(SPEVENTEX sapiEventEx) : this(sapiEventEx.eEventId, sapiEventEx.elParamType, sapiEventEx.ullAudioStreamOffset, sapiEventEx.wParam, sapiEventEx.lParam) { _audioPosition = new TimeSpan((long)sapiEventEx.ullAudioTimeOffset); } ~SpeechEvent() { Dispose (); } public void Dispose () { // General code to free event data if (_lParam != 0) { if (_paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_TOKEN || _paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_OBJECT) { Marshal.Release ((IntPtr) _lParam); } else { if (_paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_POINTER || _paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_STRING) { Marshal.FreeCoTaskMem ((IntPtr) _lParam); } } // Update the GC if (_sizeMemoryPressure > 0) { GC.RemoveMemoryPressure (_sizeMemoryPressure); _sizeMemoryPressure = 0; } // Mark the object as beeing freed _lParam = 0; } GC.SuppressFinalize (this); } #endregion //******************************************************************** // // Internal Methods // //******************************************************************* #region Internal Methods // This tries to get an event from the ISpEventSource. // If there are no events queued then null is returned. // Otherwise a new SpeechEvent is created and returned. static internal SpeechEvent TryCreateSpeechEvent(ISpEventSource sapiEventSource, bool additionalSapiFeatures, SpeechAudioFormatInfo audioFormat) { uint fetched; SpeechEvent speechEvent = null; if (additionalSapiFeatures) { SPEVENTEX sapiEventEx; ((ISpEventSource2)sapiEventSource).GetEventsEx(1, out sapiEventEx, out fetched); if (fetched == 1) { speechEvent = new SpeechEvent(sapiEventEx); } } else { SPEVENT sapiEvent; sapiEventSource.GetEvents(1, out sapiEvent, out fetched); if (fetched == 1) { speechEvent = new SpeechEvent(sapiEvent, audioFormat); } } return speechEvent; } #endregion //******************************************************************** // // Internal Properties // //******************************************************************** #region Internal Properties internal SPEVENTENUM EventId { get { return _eventId; } } internal ulong AudioStreamOffset { get { return _audioStreamOffset; } } // The WParam is returned as a 64-bit value since unmanaged wParam is always 32 or 64 depending on architecture. // This is always some kind of numeric value in SAPI - it is never a pointer that needs to freed. internal ulong WParam { get { return _wParam; } } internal ulong LParam { get { return _lParam; } } internal TimeSpan AudioPosition { get { return _audioPosition; } } #endregion //******************************************************************* // // Private Fields // //******************************************************************** #region Private Fields private SPEVENTENUM _eventId; private SPEVENTLPARAMTYPE _paramType; private ulong _audioStreamOffset; private ulong _wParam; private ulong _lParam; private TimeSpan _audioPosition; private int _sizeMemoryPressure; #endregion } internal enum SPEVENTLPARAMTYPE : ushort { SPET_LPARAM_IS_UNDEFINED = 0x0000, SPET_LPARAM_IS_TOKEN = 0x0001, SPET_LPARAM_IS_OBJECT = 0x0002, SPET_LPARAM_IS_POINTER = 0x0003, SPET_LPARAM_IS_STRING = 0x0004 } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------- using System; using System.Runtime.InteropServices; using System.Speech.AudioFormat; namespace System.Speech.Internal.SapiInterop { // Internal helper class that wraps a SAPI event structure. // A new instance is created by calling SpeechEvent.TryCreateSpeechEvent // Disposing this class will dispose all unmanmanaged memory. internal class SpeechEvent : IDisposable { //******************************************************************* // // Constructors // //******************************************************************* #region Constructors private SpeechEvent(SPEVENTENUM eEventId, SPEVENTLPARAMTYPE elParamType, ulong ullAudioStreamOffset, IntPtr wParam, IntPtr lParam) { // We make a copy of the SPEVENTEX data but that's okay because the lParam will only be deleted once. _eventId = eEventId; _paramType = elParamType; _audioStreamOffset = ullAudioStreamOffset; _wParam = (ulong)wParam.ToInt64(); _lParam = (ulong)lParam; // Let the GC know if we have a unmanaged object with a given size if (_paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_POINTER || _paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_STRING) { GC.AddMemoryPressure(_sizeMemoryPressure = Marshal.SizeOf(_lParam)); } } private SpeechEvent(SPEVENT sapiEvent, SpeechAudioFormatInfo audioFormat) : this(sapiEvent.eEventId, sapiEvent.elParamType, sapiEvent.ullAudioStreamOffset, sapiEvent.wParam, sapiEvent.lParam) { if (audioFormat == null || audioFormat.EncodingFormat == 0) { _audioPosition = TimeSpan.Zero; } else { _audioPosition = audioFormat.AverageBytesPerSecond > 0 ? new TimeSpan ((long) ((sapiEvent.ullAudioStreamOffset * TimeSpan.TicksPerSecond) / (ulong) audioFormat.AverageBytesPerSecond)) : TimeSpan.Zero; } } private SpeechEvent(SPEVENTEX sapiEventEx) : this(sapiEventEx.eEventId, sapiEventEx.elParamType, sapiEventEx.ullAudioStreamOffset, sapiEventEx.wParam, sapiEventEx.lParam) { _audioPosition = new TimeSpan((long)sapiEventEx.ullAudioTimeOffset); } ~SpeechEvent() { Dispose (); } public void Dispose () { // General code to free event data if (_lParam != 0) { if (_paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_TOKEN || _paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_OBJECT) { Marshal.Release ((IntPtr) _lParam); } else { if (_paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_POINTER || _paramType == SPEVENTLPARAMTYPE.SPET_LPARAM_IS_STRING) { Marshal.FreeCoTaskMem ((IntPtr) _lParam); } } // Update the GC if (_sizeMemoryPressure > 0) { GC.RemoveMemoryPressure (_sizeMemoryPressure); _sizeMemoryPressure = 0; } // Mark the object as beeing freed _lParam = 0; } GC.SuppressFinalize (this); } #endregion //******************************************************************** // // Internal Methods // //******************************************************************* #region Internal Methods // This tries to get an event from the ISpEventSource. // If there are no events queued then null is returned. // Otherwise a new SpeechEvent is created and returned. static internal SpeechEvent TryCreateSpeechEvent(ISpEventSource sapiEventSource, bool additionalSapiFeatures, SpeechAudioFormatInfo audioFormat) { uint fetched; SpeechEvent speechEvent = null; if (additionalSapiFeatures) { SPEVENTEX sapiEventEx; ((ISpEventSource2)sapiEventSource).GetEventsEx(1, out sapiEventEx, out fetched); if (fetched == 1) { speechEvent = new SpeechEvent(sapiEventEx); } } else { SPEVENT sapiEvent; sapiEventSource.GetEvents(1, out sapiEvent, out fetched); if (fetched == 1) { speechEvent = new SpeechEvent(sapiEvent, audioFormat); } } return speechEvent; } #endregion //******************************************************************** // // Internal Properties // //******************************************************************** #region Internal Properties internal SPEVENTENUM EventId { get { return _eventId; } } internal ulong AudioStreamOffset { get { return _audioStreamOffset; } } // The WParam is returned as a 64-bit value since unmanaged wParam is always 32 or 64 depending on architecture. // This is always some kind of numeric value in SAPI - it is never a pointer that needs to freed. internal ulong WParam { get { return _wParam; } } internal ulong LParam { get { return _lParam; } } internal TimeSpan AudioPosition { get { return _audioPosition; } } #endregion //******************************************************************* // // Private Fields // //******************************************************************** #region Private Fields private SPEVENTENUM _eventId; private SPEVENTLPARAMTYPE _paramType; private ulong _audioStreamOffset; private ulong _wParam; private ulong _lParam; private TimeSpan _audioPosition; private int _sizeMemoryPressure; #endregion } internal enum SPEVENTLPARAMTYPE : ushort { SPET_LPARAM_IS_UNDEFINED = 0x0000, SPET_LPARAM_IS_TOKEN = 0x0001, SPET_LPARAM_IS_OBJECT = 0x0002, SPET_LPARAM_IS_POINTER = 0x0003, SPET_LPARAM_IS_STRING = 0x0004 } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ErrorHandler.cs
- CoreSwitches.cs
- AffineTransform3D.cs
- CompositeActivityMarkupSerializer.cs
- HostingEnvironment.cs
- GC.cs
- TableLayoutCellPaintEventArgs.cs
- basecomparevalidator.cs
- XmlSerializerSection.cs
- MouseOverProperty.cs
- HwndAppCommandInputProvider.cs
- ContentDisposition.cs
- GraphicsContainer.cs
- FlowDocumentView.cs
- MultipleViewProviderWrapper.cs
- Bits.cs
- SiteMapNodeCollection.cs
- Scene3D.cs
- XmlMtomWriter.cs
- Fonts.cs
- SystemIcmpV4Statistics.cs
- Closure.cs
- DiscoveryEndpointValidator.cs
- GraphicsContainer.cs
- IDictionary.cs
- COM2IPerPropertyBrowsingHandler.cs
- EventLogPermissionEntryCollection.cs
- TimeSpanConverter.cs
- XamlDesignerSerializationManager.cs
- XmlCDATASection.cs
- XmlTextReaderImpl.cs
- KnownTypesProvider.cs
- StreamResourceInfo.cs
- PerfService.cs
- StringValueSerializer.cs
- GeneralTransformGroup.cs
- BuiltInExpr.cs
- XPathQilFactory.cs
- SerializationIncompleteException.cs
- TransactionManager.cs
- BaseCAMarshaler.cs
- MaskedTextProvider.cs
- StreamUpgradeInitiator.cs
- FrugalList.cs
- LogSwitch.cs
- XmlDataCollection.cs
- ReadOnlyCollectionBuilder.cs
- BaseTreeIterator.cs
- Vector3D.cs
- input.cs
- DataSourceControl.cs
- WebPartEditorApplyVerb.cs
- CertificateElement.cs
- SplineKeyFrames.cs
- XPathBinder.cs
- activationcontext.cs
- RuleRef.cs
- ArcSegment.cs
- MimeMapping.cs
- WindowsTreeView.cs
- StorageModelBuildProvider.cs
- AutoResetEvent.cs
- CalendarDay.cs
- Drawing.cs
- StorageEntityContainerMapping.cs
- Msmq4PoisonHandler.cs
- HorizontalAlignConverter.cs
- FillRuleValidation.cs
- LogSwitch.cs
- View.cs
- HashMembershipCondition.cs
- AppSettingsReader.cs
- RectAnimation.cs
- AuthenticationService.cs
- MenuItemStyleCollection.cs
- _SslState.cs
- EvidenceBase.cs
- RectAnimationClockResource.cs
- HttpResponseInternalWrapper.cs
- TrackingDataItemValue.cs
- KnownTypeAttribute.cs
- SecurityHeaderTokenResolver.cs
- SqlNode.cs
- ContextMenu.cs
- EntityDataSourceChangingEventArgs.cs
- XmlSchemaAll.cs
- XmlDataSourceNodeDescriptor.cs
- ShaderEffect.cs
- X509SecurityTokenProvider.cs
- XamlFigureLengthSerializer.cs
- ToolStripButton.cs
- PriorityQueue.cs
- _AutoWebProxyScriptWrapper.cs
- StaticFileHandler.cs
- FloaterBaseParaClient.cs
- DetailsViewUpdatedEventArgs.cs
- IsolatedStorageException.cs
- DocumentsTrace.cs
- nulltextnavigator.cs
- AppendHelper.cs