日期:2014-05-19  浏览次数:20943 次

知道 音频 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试试