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()
if (m_Thread != null)
try
m_Finished = true;
if (m_WaveOut != IntPtr.Zero)
WaveNative.waveOutReset(m_WaveOut);
m_Thread.Join();
m_FillProc = null;
FreeBuffers();
WaveNative.waveOutClose(m_WaveOut);
finally
m_Thread = null;
m_WaveOut = IntPtr.Zero;
private void ThreadProc()
while (!m_Finished)
Advance();
if (m_FillProc != null && !m_Finished)
m_FillProc(m_CurrentBuffer.Data, m_CurrentBuffer.Size);
// 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)
if (bufferCount > 0)
m_Buffers = new WaveOutBuffer(m_WaveOut, bufferSize);
WaveOutBuffer Prev = m_Buffers;
for (int i = 1; i < bufferCount; i++)
WaveOutBuffer Buf = new WaveOutBuffer(m_WaveOut, bufferSize);
Prev.NextBuffer = Buf;
Prev = Buf;
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;
values[i] = _amplitude * Math.Cos(i * theta);
if (_waveForm.Equals("Square"))
double p = 2.0 * _frequency / _samplingRate;
values[i] = Math.Round(i * p) % 2 == 0 ? _amplitude : -_amplitude;
if (_waveForm.Equals("Triangular"))
int ip = (int)Math.Round(i * p);
values[i] = 2.0 * _amplitude * (1 - 2 * (ip % 2)) * (i * p - ip);
if (_waveForm.Equals("Sawtooth"))
double q = i * _frequency / _samplingRate;
values[i] = 2.0 * _amplitude * (q - Math.Round(q));
if (_addDCLevel)
values[i] += _dcLevel;
if (_addNoise)
Random r = new Random();
values[i] += _noise * r.Next();
return values;
1.4) AudioFrame.cs
// audioframe => working on audio frame
using System.Drawing;
Ñòðàíèöû: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12