前面我们展示过语音识别时,语音片段的制作,保存,加载,那么加载后只有波形,如何播放出来?看代码:
首先,加载保存的.mch波形文件:
string curFileName = "d:\\加.mch";
//1,加载声音
FileInfo fiif = new FileInfo(curFileName);
long len = fiif.Length;
int rbuffer = (int)len;
int size = 1920;
FileStream fs1 = new FileStream(curFileName, FileMode.Open, FileAccess.Read, FileShare.Read);
fs1.Read(bt1920, 0, rbuffer);//返回0表示读完
fs1.Close();
其次,这句话,很熟悉,与前面录音(waveInOpen函数)相同:
// 2,初始化waveout
WaveInHelper.Try(WaveNative.waveOutOpen(out m_WaveOut, device, format, m_BufferProc, 0, WaveNative.CALLBACK_FUNCTION));
第三步,解决回调函数m_BufferProc://3,回调函数(与bios中断(int)函数相似)
private WaveNative.WaveDelegate m_BufferProc = new WaveNative.WaveDelegate(WaveOutProc);
internal static void WaveOutProc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2)
{
if (uMsg == WaveNative.MM_WOM_DONE)
{
try
{
// 收到此消息,已经播放完毕
}
catch
{
}
}
}
其实这个回调只是个摆设,什么也没做。没办法,微软是这样定制的。
第四步,当你点击位图“+”时放音:先声明
private WaveNative.WaveHdr m_Header;
private byte[] m_HeaderData;
private GCHandle m_HeaderHandle;
private GCHandle m_HeaderDataHandle;
然后, // 4,放音
m_HeaderHandle = GCHandle.Alloc(m_Header, GCHandleType.Pinned);
m_Header.dwUser = (IntPtr)GCHandle.Alloc(this);
m_HeaderData = new byte[size];
m_Header.dwBufferLength = size;
m_HeaderData = bt1920;
m_HeaderDataHandle = GCHandle.Alloc(m_HeaderData, GCHandleType.Pinned);
m_Header.lpData = m_HeaderDataHandle.AddrOfPinnedObject();
WaveInHelper.Try(WaveNative.waveOutPrepareHeader(m_WaveOut, ref m_Header, Marshal.SizeOf(m_Header)));
WaveInHelper.Try(WaveNative.waveOutWrite(m_WaveOut, ref m_Header, Marshal.SizeOf(m_Header)));
我的个神啊!这才多少行,放音程序就搞定了,看来我的录音程序还有很大的进化空间啊,赶紧的!看来程序中有许多啰嗦,绕死个人。简单明白,对吧!
待续(慢慢来!...........)每天一点小改变☺