Windows的录制过程大致如下:
1 首先检查本机是否有声音输入设备。
2 获取声音输入设备信息
一般上面这两个都不是很需要,毕竟现在大部分电脑都集成了声卡。但从稳定性和通用性的角度来看,还是很有必要的。
3 打开设备,获取设备句柄,传入相应的事件句柄。
4 准备一个异步线程,专用于录制完成后的处理工作,等待事件发生。
5 通过设备句柄为其准备缓冲区
6 通过句柄将准备好的缓冲区添加到设备中
接下来就属于系统的工作了。一般情况下,缓冲区被填满后,会触发一个事件,通知异步线程进行处理。获取到声音信息后,必须重新添加缓冲区才能继续录音。
有时在缓冲区的建立中,一般采用栈分配或堆分配的方法。栈分配内存的销毁过程是通过出栈完成的,不需要用户手动处理。但是在堆分配的时候会遇到麻烦,如下:
waveInPrepareHeader 函数在准备缓冲区时被调用。调用该函数后,为其分配的内存无法通过delete或free释放,因为调用该函数后内存区域被锁定。这时必须调用waveInUnprepareHeader函数解锁,然后释放。
但是在调用waveInPrepareHeader函数后,再调用waveInAddBuffer函数,当缓冲区未满时,尝试使用waveInUnprepareHeader函数解锁,会返回失败代码33。这里的解决方案是在决定释放空间之前先调用一个函数:waveInReset。调用该函数后,可以从waveInAddBuffer函数的限制中释放内存,然后通过waveInUnprepareHeader的常规使用释放,最后调用delete或free释放内存空间。
09113137909[下载].rar
|