代码人生的小狗窝

一行行枯燥的代码,却描绘出人生的点点滴滴

您现在的位置是:首页>_C#

知道 音频 API 请进,最近发的帖沉的快,希望这个帖能浮起来,该如何处理

发布时间:2019-10-15浏览(2318)

    知道 音频 API 请进,最近发的帖沉的快,希望这个帖能浮起来
    定义一个代理,用于使用回调函数
    public   delegate   void   WaveDelegate(IntPtr   hdrvr,   int   uMsg,   int   dwUser,   int   dwParam1,   int   dwParam2);


    WaveDelegate   wdel   =   new   WaveDelegate(WaveOutProc);

    ///打开音频设备
    waveOutOpen(out   m_hPlay,WAVE_MAPPER,wFormat,wdel,0,0);

    ///回调函数
    public   static   void   WaveOutProc(IntPtr   hwo,int   uMsg,int   dwInstance,int   dwParam1,int   dwParam2)      
    {
    switch(uMsg)      
    {
    case   Wave.MM_WOM_DONE://播访完一段缓冲录音
    Wave.waveOutUnprepareHeader(m_hPlay,ref   wHdr,uSize);
    break;      
    }      
    }

    以上是我写的代码。

    我要在回调函数中获取是否播放完一段录音,然后释放掉内存;
    可是这个回调函数为什么不执行呢?

    或者是我的代码写错了,
    我的目的是要知道什么时候播放完一段录音,然后释放内存。
    各位大哥大姐,不知道是不是用这个方法?

    还望各位高手指教!不胜感激!




    ------解决方案--------------------
    ding..............................................................
    ------解决方案--------------------
    关注一下。

    怎么,没这方面的高手吗?
    ------解决方案--------------------
    不懂,关注中。
    不过,据俺所知,.net在windows编程方面并不占优势(相对VB、Delphi、PB),请问楼主为何会有用.net开发音频项目的需求?不会是自己练手吧!
    ------解决方案--------------------
    加个条件

    case Wave.MM_WOM_DONE://大概仅仅是缓冲区填写满也会引发这个消息的,此时不代表声音已经播放完毕

    if ( ((WAVEHDR)dwParam1).dwFlags == WHDR_DONE)
    Wave.waveOutUnprepareHeader(m_hPlay,ref wHdr,uSize);//此时再释放

    ------解决方案--------------------
    最近流行DirectX~~~~
    ------解决方案--------------------
    要不你直接拿
    原先
    Wave.waveOutUnprepareHeader(m_hPlay,ref wHdr,uSize);语句中得wHdr来做判断
    if ( wHdr.dwFlags == WHDR_DONE)试试

    WHDR_DONE的具体值我也不清楚,可能需要lz到一堆.h中去搜索一下 define了
    ------解决方案--------------------
    难道你设置wHdr中的loops是无限次循环?所以一直没有播放完成?
    dwFlags是当前缓冲数据的处理标志吧

    因为没有具体使用过,所以也没有实际经验,见谅
    ------解决方案--------------------
    LZ的代码段看起来都没有什么问题,请把原型Win32函数拿出来看看。代码段也有点乱。
    ------解决方案--------------------
    考虑用DirectX
    ------解决方案--------------------
    loops设成1试试