Ðåôåðàòû. Ñèñòåìà óïðàâëåíèÿ ðàñïîçíàâàíèåì ðå÷åâîé èíôîðìàöèè

 m_Header.dwUser = (IntPtr)GCHandle.Alloc(this);

 m_HeaderData = new byte[size];

 m_HeaderDataHandle = GCHandle.Alloc(m_HeaderData, GCHandleType.Pinned);

 m_Header.lpData = m_HeaderDataHandle.AddrOfPinnedObject();

 m_Header.dwBufferLength = size;

 WaveOutHelper.Try(WaveNative.waveOutPrepareHeader(m_WaveOut, ref m_Header, Marshal.SizeOf(m_Header)));

                   }

 ~WaveOutBuffer()

 {

 Dispose();

 }

 public void Dispose()

 {

 if (m_Header.lpData != IntPtr.Zero)

 {

 WaveNative.waveOutUnprepareHeader(m_WaveOut, ref m_Header, Marshal.SizeOf(m_Header));

 m_HeaderHandle.Free();

 m_Header.lpData = IntPtr.Zero;

 }

 m_PlayEvent.Close();

 if (m_HeaderDataHandle.IsAllocated)

 m_HeaderDataHandle.Free();

 GC.SuppressFinalize(this);

 }


 public int Size

 {

 get { return m_Header.dwBufferLength; }

 }


 public IntPtr Data

 {

 get { return m_Header.lpData; }

 }


 public bool Play()

 {

 lock(this)

 {

 m_PlayEvent.Reset();

 m_Playing = WaveNative.waveOutWrite(m_WaveOut, ref m_Header, Marshal.SizeOf(m_Header)) == WaveNative.MMSYSERR_NOERROR;

 return m_Playing;

 }

 }

 public void WaitFor()

 {

 if (m_Playing)

 {

 m_Playing = m_PlayEvent.WaitOne();

 }

 else

 {

 Thread.Sleep(0);

 }

 }

 public void OnCompleted()

 {

 m_PlayEvent.Set();

 m_Playing = false;

 }

 }


 public class WaveOutPlayer : IDisposable

 {

 private IntPtr m_WaveOut;

 private WaveOutBuffer m_Buffers; // linked list

 private WaveOutBuffer m_CurrentBuffer;

 private Thread m_Thread;

 private BufferFillEventHandler m_FillProc;

                   private bool m_Finished;

                   private byte m_zero;


 private WaveNative.WaveDelegate m_BufferProc = new WaveNative.WaveDelegate(WaveOutBuffer.WaveOutProc);


 public static int DeviceCount

 {

 get { return WaveNative.waveOutGetNumDevs(); }

 }


 public WaveOutPlayer(int device, WaveFormat format, int bufferSize, int bufferCount, BufferFillEventHandler fillProc)

 {

                            m_zero = format.wBitsPerSample == 8 ? (byte)128 : (byte)0;

 m_FillProc = fillProc;

 WaveOutHelper.Try(WaveNative.waveOutOpen(out m_WaveOut, device, format, m_BufferProc, 0, WaveNative.CALLBACK_FUNCTION));

 AllocateBuffers(bufferSize, bufferCount);

 m_Thread = new Thread(new ThreadStart(ThreadProc));

 m_Thread.Start();

 }

 ~WaveOutPlayer()

 {

 Dispose();

 }

 public void Dispose()

 {

 if (m_Thread != null)

                                      try

                                      {

                                               m_Finished = true;

                                               if (m_WaveOut != IntPtr.Zero)

                                                        WaveNative.waveOutReset(m_WaveOut);

                                               m_Thread.Join();

                                               m_FillProc = null;

                                               FreeBuffers();

                                               if (m_WaveOut != IntPtr.Zero)

                                                        WaveNative.waveOutClose(m_WaveOut);

                                      }

                                      finally

                                      {

                                               m_Thread = null;

                                               m_WaveOut = IntPtr.Zero;

                                     }

 GC.SuppressFinalize(this);

 }

 private void ThreadProc()

 {

 while (!m_Finished)

 {

 Advance();

                                      if (m_FillProc != null && !m_Finished)

                                               m_FillProc(m_CurrentBuffer.Data, m_CurrentBuffer.Size);

                                      else

                                      {

                                               // zero out buffer

                                               byte v = m_zero;

                                               byte[] b = new byte[m_CurrentBuffer.Size];

                                               for (int i = 0; i < b.Length; i++)

                                                        b[i] = v;

                                               Marshal.Copy(b, 0, m_CurrentBuffer.Data, b.Length);


                                      }

 m_CurrentBuffer.Play();

 }

                            WaitForAllBuffers();

                   }

 private void AllocateBuffers(int bufferSize, int bufferCount)

 {

 FreeBuffers();

 if (bufferCount > 0)

 {

 m_Buffers = new WaveOutBuffer(m_WaveOut, bufferSize);

 WaveOutBuffer Prev = m_Buffers;

 try

 {

 for (int i = 1; i < bufferCount; i++)

 {

 WaveOutBuffer Buf = new WaveOutBuffer(m_WaveOut, bufferSize);

 Prev.NextBuffer = Buf;

 Prev = Buf;

 }

 }

 finally

 {

 Prev.NextBuffer = m_Buffers;

 }

 }

 }

 private void FreeBuffers()

 {

 m_CurrentBuffer = null;

 if (m_Buffers != null)

 {

 WaveOutBuffer First = m_Buffers;

 m_Buffers = null;


 WaveOutBuffer Current = First;

 do

 {

 WaveOutBuffer Next = Current.NextBuffer;

 Current.Dispose();

 Current = Next;

 } while(Current != First);

 }

 }

 private void Advance()

 {

 m_CurrentBuffer = m_CurrentBuffer == null ? m_Buffers : m_CurrentBuffer.NextBuffer;

 m_CurrentBuffer.WaitFor();

 }

 private void WaitForAllBuffers()

 {

 WaveOutBuffer Buf = m_Buffers;

 while (Buf.NextBuffer != m_Buffers)

 {

 Buf.WaitFor();

 Buf = Buf.NextBuffer;

 }

 }

 }

}


1.3) SignalGenerator.cs

// Speech recognition

// singal generator => to generate various signals like sawtooth…


using System;

using System.Collections.Generic;

using System.Text;


namespace SoundViewer

{

 class SignalGenerator

 {

 private string _waveForm = "Sine";

 private double _amplitude = 128.0;

 private double _samplingRate = 44100;

 private double _frequency = 5000.0;

 private double _dcLevel = 0.0;

 private double _noise = 0.0;

 private int _samples = 16384;

 private bool _addDCLevel = false;

 private bool _addNoise = false;


 public SignalGenerator()

 {

 }


 public void SetWaveform(string waveForm)

 {

 _waveForm = waveForm;

 }


 public String GetWaveform()

 {

 return _waveForm;

 }


 public void SetAmplitude(double amplitude)

 {

 _amplitude = amplitude;

 }


 public double GetAmplitude()

 {

 return _amplitude;

 }


 public void SetFrequency(double frequency)

 {

 _frequency = frequency;

 }


 public double GetFrequency()

 {

 return _frequency;

 }


 public void SetSamplingRate(double rate)

 {

 _samplingRate = rate;

 }


 public double GetSamplingRate()

 {

 return _samplingRate;

 }


 public void SetSamples(int samples)

 {

 _samples = samples;

 }


 public int GetSamples()

 {

 return _samples;

 }


 public void SetDCLevel(double dc)

 {

 _dcLevel = dc;

 }


 public double GetDCLevel()

 {

 return _dcLevel;

 }


 public void SetNoise(double noise)

 {

 _noise = noise;

 }


 public double GetNoise()

 {

 return _noise;

 }


 public void SetDCLevelState(bool dcstate)

 {

 _addDCLevel = dcstate;

 }


 public bool IsDCLevel()

 {

 return _addDCLevel;

 }


 public void SetNoiseState(bool noisestate)

 {

 _addNoise = noisestate;

 }


 public bool IsNoise()

 {

 return _addNoise;

 }


 public double[] GenerateSignal()

 {

 double[] values = new double[_samples];

 if (_waveForm.Equals("Sine"))

 {

 double theta = 2.0 * Math.PI * _frequency / _samplingRate;

 for (int i = 0; i < _samples; i++)

 {

 values[i] = _amplitude * Math.Sin(i * theta);

 }

 }

 if (_waveForm.Equals("Cosine"))

 {

 double theta = 2.0f * (double)Math.PI * _frequency / _samplingRate;

 for (int i = 0; i < _samples; i++)

 values[i] = _amplitude * Math.Cos(i * theta);

 }

 if (_waveForm.Equals("Square"))

 {

 double p = 2.0 * _frequency / _samplingRate;

 for (int i = 0; i < _samples; i++)

 values[i] = Math.Round(i * p) % 2 == 0 ? _amplitude : -_amplitude;

 }

 if (_waveForm.Equals("Triangular"))

 {

 double p = 2.0 * _frequency / _samplingRate;

 for (int i = 0; i < _samples; i++)

 {

 int ip = (int)Math.Round(i * p);

 values[i] = 2.0 * _amplitude * (1 - 2 * (ip % 2)) * (i * p - ip);

 }

 }

 if (_waveForm.Equals("Sawtooth"))

 {

 for (int i = 0; i < _samples; i++)

 {

 double q = i * _frequency / _samplingRate;

 values[i] = 2.0 * _amplitude * (q - Math.Round(q));

 }

 }

 if (_addDCLevel)

 {

 for (int i = 0; i < _samples; i++)

 values[i] += _dcLevel;

 }

 if (_addNoise)

 {

 Random r = new Random();

 for (int i = 0; i < _samples; i++)

 values[i] += _noise * r.Next();

 }

 return values;

 }

 }

}


1.4) AudioFrame.cs

// Speech recognition

// audioframe => working on audio frame

using System;

using System.Drawing;

Ñòðàíèöû: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12



2012 © Âñå ïðàâà çàùèùåíû
Ïðè èñïîëüçîâàíèè ìàòåðèàëîâ àêòèâíàÿ ññûëêà íà èñòî÷íèê îáÿçàòåëüíà.