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