90 lines
2.9 KiB
C#
90 lines
2.9 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace SafeMobileLib
|
|||
|
{
|
|||
|
public class test_NewAudio
|
|||
|
{
|
|||
|
private WaveOutPlayer m_Player;
|
|||
|
private WaveInRecorder m_Recorder;
|
|||
|
public FifoStream m_Fifo = new FifoStream();
|
|||
|
private byte[] m_PlayBuffer;
|
|||
|
private byte[] m_RecBuffer;
|
|||
|
|
|||
|
private int inDevID;
|
|||
|
private int outDevID;
|
|||
|
public test_NewAudio(int _inDevID , int _outDevID)
|
|||
|
{
|
|||
|
Utils.WriteLine("Create newAudio IN:"+_inDevID+" OUT:"+_outDevID,ConsoleColor.Blue);
|
|||
|
inDevID = _inDevID;
|
|||
|
outDevID = _outDevID;
|
|||
|
//WaveFormat fmt = new WaveFormat(44100, 16, 1);
|
|||
|
WaveFormat fmt = new WaveFormat(8000, 16, 1);//44100 //2048 //8192
|
|||
|
m_Player = new WaveOutPlayer(outDevID, fmt, 512, 6, new BufferFillEventHandler(Filler));//16384
|
|||
|
m_Recorder = new WaveInRecorder(inDevID, fmt, 512, 6, new BufferDoneEventHandler(Voice_Out));//16384
|
|||
|
}
|
|||
|
|
|||
|
public void PlaySound(byte[] data, int len)
|
|||
|
{
|
|||
|
m_Fifo.Write(data, 0, len);
|
|||
|
}
|
|||
|
|
|||
|
private void Filler(IntPtr data, int size)
|
|||
|
{
|
|||
|
if (m_PlayBuffer == null || m_PlayBuffer.Length < size)
|
|||
|
m_PlayBuffer = new byte[size];
|
|||
|
if (m_Fifo.Length >= size)
|
|||
|
m_Fifo.Read(m_PlayBuffer, 0, size);
|
|||
|
else
|
|||
|
for (int i = 0; i < m_PlayBuffer.Length; i++)
|
|||
|
m_PlayBuffer[i] = 0;
|
|||
|
System.Runtime.InteropServices.Marshal.Copy(m_PlayBuffer, 0, data, size);
|
|||
|
// m_Fifo ==> m_PlayBuffer==> data ==> Speakers
|
|||
|
}
|
|||
|
|
|||
|
private void Voice_Out(IntPtr data, int size)
|
|||
|
{
|
|||
|
//for Recorder
|
|||
|
if (m_RecBuffer == null || m_RecBuffer.Length < size)
|
|||
|
m_RecBuffer = new byte[size];
|
|||
|
System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size);
|
|||
|
if (this.OnVoiceRecv != null)
|
|||
|
{
|
|||
|
this.OnVoiceRecv(m_RecBuffer, m_RecBuffer.Length);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public delegate void VoiceRecv(byte[] data, int recv);
|
|||
|
public event VoiceRecv OnVoiceRecv;
|
|||
|
|
|||
|
public void Dispose()
|
|||
|
{
|
|||
|
Console.WriteLine("Begin Dispose");
|
|||
|
if (m_Player != null)
|
|||
|
try
|
|||
|
{
|
|||
|
m_Player.Dispose();
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
m_Player = null;
|
|||
|
}
|
|||
|
Console.WriteLine("After Player");
|
|||
|
if (m_Recorder != null)
|
|||
|
try
|
|||
|
{
|
|||
|
m_Recorder.Dispose();
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
m_Recorder = null;
|
|||
|
}
|
|||
|
Console.WriteLine("After record");
|
|||
|
m_Fifo.Flush();
|
|||
|
Console.WriteLine("End Dispose");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|