写给父亲的语音计算器(语音的加载播放C#,四)

前面我们展示过语音识别时,语音片段的制作,保存,加载,那么加载后只有波形,如何播放出来?看代码:

首先,加载保存的.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)));

我的个神啊!这才多少行,放音程序就搞定了,看来我的录音程序还有很大的进化空间啊,赶紧的!看来程序中有许多啰嗦,绕死个人。简单明白,对吧!

待续(慢慢来!...........)每天一点小改变☺

我的邮箱[email protected];[email protected]

发布了66 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ganggangwawa/article/details/102730781