Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Speech / Src / Internal / SapiInterop / SpAudioStreamWrapper.cs / 1 / SpAudioStreamWrapper.cs
//------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // // // // Description: // Maps an audio stream the SAPI ISpStreamFormat // // History: // 7/10/2005 jeanfp //----------------------------------------------------------------- using System; using System.IO; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Speech.AudioFormat; using System.Speech.Internal.SapiInterop; using System.Speech.Internal.Synthesis; #pragma warning disable 1634, 1691 // Allows suppression of certain PreSharp messages. using STATSTG = System.Runtime.InteropServices.ComTypes.STATSTG; namespace System.Speech.Internal.SapiInterop { internal class SpAudioStreamWrapper : SpStreamWrapper, ISpStreamFormat { //******************************************************************* // // Constructors // //******************************************************************* #region Constructors internal SpAudioStreamWrapper (Stream stream, SpeechAudioFormatInfo audioFormat) : base (stream) { // Assume PCM to start with _formatType = SAPIGuids.SPDFID_WaveFormatEx; if (audioFormat != null) { WAVEFORMATEX wfx = new WAVEFORMATEX (); wfx.wFormatTag = (short) audioFormat.EncodingFormat; wfx.nChannels = (short) audioFormat.ChannelCount; wfx.nSamplesPerSec = audioFormat.SamplesPerSecond; wfx.nAvgBytesPerSec = audioFormat.AverageBytesPerSecond; wfx.nBlockAlign = (short) audioFormat.BlockAlign; wfx.wBitsPerSample = (short) audioFormat.BitsPerSample; wfx.cbSize = (short) audioFormat.FormatSpecificData ().Length; _wfx = wfx.ToBytes (); if (wfx.cbSize == 0) { byte [] wfxTemp = new byte [_wfx.Length + wfx.cbSize]; Array.Copy (_wfx, wfxTemp, _wfx.Length); Array.Copy (audioFormat.FormatSpecificData (), 0, wfxTemp, _wfx.Length, wfx.cbSize); _wfx = wfxTemp; } } else { try { GetStreamOffsets (stream); } catch (IOException) { throw new FormatException (SR.Get (SRID.SynthesizerInvalidWaveFile)); } } } #endregion //******************************************************************** // // Public Methods // //******************************************************************* #region public Methods #region ISpStreamFormat interface implementation void ISpStreamFormat.GetFormat (out Guid guid, out IntPtr format) { guid = _formatType; format = Marshal.AllocCoTaskMem (_wfx.Length); Marshal.Copy (_wfx, 0, format, _wfx.Length); } #endregion #endregion //******************************************************************** // // Internal Properties // //******************************************************************** #region Internal Methods #pragma warning disable 56518 // The Binary reader cannot be disposed or it would close the underlying stream ////// Builds the /// /// internal void GetStreamOffsets (Stream stream) { BinaryReader br = new BinaryReader (stream); // Read the riff Header RIFFHDR riff = new RIFFHDR (); riff._id = br.ReadUInt32 (); riff._len = br.ReadInt32 (); riff._type = br.ReadUInt32 (); if (riff._id != RIFF_MARKER && riff._type != WAVE_MARKER) { throw new FormatException (); } BLOCKHDR block = new BLOCKHDR (); block._id = br.ReadUInt32 (); block._len = br.ReadInt32 (); if (block._id != FMT_MARKER) { throw new FormatException (); } // If the format is of type WAVEFORMAT then fake a cbByte with a length of zero _wfx = br.ReadBytes (block._len); // Hardcode the value of the size for the structure element // as the C# compiler pads the structure to the closest 4 or 8 bytes if (block._len == 16) { byte [] wfxTemp = new byte [18]; Array.Copy (_wfx, wfxTemp, 16); _wfx = wfxTemp; } while (true) { DATAHDR dataHdr = new DATAHDR (); // check for the end of file (+8 for the 2 DWORD) if (stream.Position + 8 >= stream.Length) { break; } dataHdr._id = br.ReadUInt32 (); dataHdr._len = br.ReadInt32 (); // Is this the WAVE data? if (dataHdr._id == DATA_MARKER) { _endOfStreamPosition = stream.Position + dataHdr._len; break; } else { // Skip this RIFF fragment. stream.Seek (dataHdr._len, SeekOrigin.Current); } } } #pragma warning restore 56518 // The Binary reader cannot be disposed or it would close the underlying stream #endregion //******************************************************************* // // Private Types // //******************************************************************** #region Private Types private const UInt32 RIFF_MARKER = 0x46464952; private const UInt32 WAVE_MARKER = 0x45564157; private const UInt32 FMT_MARKER = 0x20746d66; private const UInt32 DATA_MARKER = 0x61746164; [StructLayout (LayoutKind.Sequential)] private struct RIFFHDR { internal UInt32 _id; internal Int32 _len; /* file length less header */ internal UInt32 _type; /* should be "WAVE" */ } [StructLayout (LayoutKind.Sequential)] private struct BLOCKHDR { internal UInt32 _id; /* should be "fmt " or "data" */ internal Int32 _len; /* block size less header */ }; [StructLayout (LayoutKind.Sequential)] private struct DATAHDR { internal UInt32 _id; /* should be "fmt " or "data" */ internal Int32 _len; /* block size less header */ } #endregion //******************************************************************* // // Private Fields // //******************************************************************* #region Private Fields private byte [] _wfx; private Guid _formatType; #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // // // // Description: // Maps an audio stream the SAPI ISpStreamFormat // // History: // 7/10/2005 jeanfp //----------------------------------------------------------------- using System; using System.IO; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Speech.AudioFormat; using System.Speech.Internal.SapiInterop; using System.Speech.Internal.Synthesis; #pragma warning disable 1634, 1691 // Allows suppression of certain PreSharp messages. using STATSTG = System.Runtime.InteropServices.ComTypes.STATSTG; namespace System.Speech.Internal.SapiInterop { internal class SpAudioStreamWrapper : SpStreamWrapper, ISpStreamFormat { //******************************************************************* // // Constructors // //******************************************************************* #region Constructors internal SpAudioStreamWrapper (Stream stream, SpeechAudioFormatInfo audioFormat) : base (stream) { // Assume PCM to start with _formatType = SAPIGuids.SPDFID_WaveFormatEx; if (audioFormat != null) { WAVEFORMATEX wfx = new WAVEFORMATEX (); wfx.wFormatTag = (short) audioFormat.EncodingFormat; wfx.nChannels = (short) audioFormat.ChannelCount; wfx.nSamplesPerSec = audioFormat.SamplesPerSecond; wfx.nAvgBytesPerSec = audioFormat.AverageBytesPerSecond; wfx.nBlockAlign = (short) audioFormat.BlockAlign; wfx.wBitsPerSample = (short) audioFormat.BitsPerSample; wfx.cbSize = (short) audioFormat.FormatSpecificData ().Length; _wfx = wfx.ToBytes (); if (wfx.cbSize == 0) { byte [] wfxTemp = new byte [_wfx.Length + wfx.cbSize]; Array.Copy (_wfx, wfxTemp, _wfx.Length); Array.Copy (audioFormat.FormatSpecificData (), 0, wfxTemp, _wfx.Length, wfx.cbSize); _wfx = wfxTemp; } } else { try { GetStreamOffsets (stream); } catch (IOException) { throw new FormatException (SR.Get (SRID.SynthesizerInvalidWaveFile)); } } } #endregion //******************************************************************** // // Public Methods // //******************************************************************* #region public Methods #region ISpStreamFormat interface implementation void ISpStreamFormat.GetFormat (out Guid guid, out IntPtr format) { guid = _formatType; format = Marshal.AllocCoTaskMem (_wfx.Length); Marshal.Copy (_wfx, 0, format, _wfx.Length); } #endregion #endregion //******************************************************************** // // Internal Properties // //******************************************************************** #region Internal Methods #pragma warning disable 56518 // The Binary reader cannot be disposed or it would close the underlying stream ////// Builds the /// /// internal void GetStreamOffsets (Stream stream) { BinaryReader br = new BinaryReader (stream); // Read the riff Header RIFFHDR riff = new RIFFHDR (); riff._id = br.ReadUInt32 (); riff._len = br.ReadInt32 (); riff._type = br.ReadUInt32 (); if (riff._id != RIFF_MARKER && riff._type != WAVE_MARKER) { throw new FormatException (); } BLOCKHDR block = new BLOCKHDR (); block._id = br.ReadUInt32 (); block._len = br.ReadInt32 (); if (block._id != FMT_MARKER) { throw new FormatException (); } // If the format is of type WAVEFORMAT then fake a cbByte with a length of zero _wfx = br.ReadBytes (block._len); // Hardcode the value of the size for the structure element // as the C# compiler pads the structure to the closest 4 or 8 bytes if (block._len == 16) { byte [] wfxTemp = new byte [18]; Array.Copy (_wfx, wfxTemp, 16); _wfx = wfxTemp; } while (true) { DATAHDR dataHdr = new DATAHDR (); // check for the end of file (+8 for the 2 DWORD) if (stream.Position + 8 >= stream.Length) { break; } dataHdr._id = br.ReadUInt32 (); dataHdr._len = br.ReadInt32 (); // Is this the WAVE data? if (dataHdr._id == DATA_MARKER) { _endOfStreamPosition = stream.Position + dataHdr._len; break; } else { // Skip this RIFF fragment. stream.Seek (dataHdr._len, SeekOrigin.Current); } } } #pragma warning restore 56518 // The Binary reader cannot be disposed or it would close the underlying stream #endregion //******************************************************************* // // Private Types // //******************************************************************** #region Private Types private const UInt32 RIFF_MARKER = 0x46464952; private const UInt32 WAVE_MARKER = 0x45564157; private const UInt32 FMT_MARKER = 0x20746d66; private const UInt32 DATA_MARKER = 0x61746164; [StructLayout (LayoutKind.Sequential)] private struct RIFFHDR { internal UInt32 _id; internal Int32 _len; /* file length less header */ internal UInt32 _type; /* should be "WAVE" */ } [StructLayout (LayoutKind.Sequential)] private struct BLOCKHDR { internal UInt32 _id; /* should be "fmt " or "data" */ internal Int32 _len; /* block size less header */ }; [StructLayout (LayoutKind.Sequential)] private struct DATAHDR { internal UInt32 _id; /* should be "fmt " or "data" */ internal Int32 _len; /* block size less header */ } #endregion //******************************************************************* // // Private Fields // //******************************************************************* #region Private Fields private byte [] _wfx; private Guid _formatType; #endregion } } // 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
- IsolatedStorage.cs
- BaseConfigurationRecord.cs
- OleDbCommand.cs
- EntityDataSourceUtil.cs
- XmlSerializerFactory.cs
- InfoCardConstants.cs
- Confirm.cs
- SQLConvert.cs
- CodeIdentifiers.cs
- TextBox.cs
- FormatterServices.cs
- ExpressionReplacer.cs
- ClientConfigPaths.cs
- MarshalByRefObject.cs
- FragmentNavigationEventArgs.cs
- Attribute.cs
- GeometryGroup.cs
- TemplateControlParser.cs
- QuaternionRotation3D.cs
- URLAttribute.cs
- SqlCommandBuilder.cs
- ViewGenerator.cs
- CaseCqlBlock.cs
- MenuItem.cs
- FakeModelItemImpl.cs
- TextSelection.cs
- QueryResultOp.cs
- KeyEvent.cs
- WebPartConnectionsDisconnectVerb.cs
- BuildManager.cs
- MembershipUser.cs
- DaylightTime.cs
- XmlSchemaSimpleType.cs
- ColorBlend.cs
- EdmTypeAttribute.cs
- PerfCounters.cs
- SqlCacheDependencyDatabase.cs
- ContentElementAutomationPeer.cs
- MergeFilterQuery.cs
- SimpleWebHandlerParser.cs
- RelationshipConverter.cs
- Int32RectValueSerializer.cs
- DataViewListener.cs
- WebEventCodes.cs
- TextEncodedRawTextWriter.cs
- DbTransaction.cs
- SiteMapHierarchicalDataSourceView.cs
- KeyedHashAlgorithm.cs
- ToolStripPanelDesigner.cs
- StylusPointProperties.cs
- DataGridViewCellContextMenuStripNeededEventArgs.cs
- AsnEncodedData.cs
- PermissionSetEnumerator.cs
- LicenseManager.cs
- LinqDataSourceHelper.cs
- OpCopier.cs
- ListItemConverter.cs
- ResXResourceReader.cs
- IPEndPoint.cs
- SequentialUshortCollection.cs
- SetIterators.cs
- BrowserCapabilitiesCompiler.cs
- EntityViewGenerator.cs
- DecimalKeyFrameCollection.cs
- CodeStatementCollection.cs
- PolyBezierSegment.cs
- ASCIIEncoding.cs
- StringSorter.cs
- CaseInsensitiveHashCodeProvider.cs
- DataGridViewLayoutData.cs
- SecurityTokenProviderContainer.cs
- DocumentViewerBaseAutomationPeer.cs
- COM2IDispatchConverter.cs
- SynchronizedDisposablePool.cs
- ErrorTableItemStyle.cs
- TraceData.cs
- Typography.cs
- CharacterMetrics.cs
- AttributeUsageAttribute.cs
- XsdBuilder.cs
- PeerNameResolver.cs
- WebPartEditorCancelVerb.cs
- SoapTypeAttribute.cs
- ByteStreamGeometryContext.cs
- GeneralTransform.cs
- HotSpot.cs
- NativeMethods.cs
- BamlLocalizationDictionary.cs
- EditorPartCollection.cs
- TagElement.cs
- OletxTransactionFormatter.cs
- OpCellTreeNode.cs
- ParserHooks.cs
- AssemblyAttributesGoHere.cs
- DocumentPaginator.cs
- BmpBitmapEncoder.cs
- CompressionTransform.cs
- WorkflowTimerService.cs
- LineServicesRun.cs
- XmlSerializerAssemblyAttribute.cs