最近看了一下webrtc中音频采集部分代码,重点查看了采用windows api接口的实现方式。
代码文件名称:audio_device_wave_win.cc 和audio_device_wave_win.h
AudioDeviceWindowsWave类中创建了一个线程,线程调用函数为ThreadFunc,并在其中调用ThreadProcess函数,线程的调用通过_timeEvent事件进行控制,而_timeEvent中通过timer触发线程的周期性调用,周期为TIMER_PERIOD_MS = 2,说明为2ms调用1次。同时为了对声卡音量进行设置,创建2个线程分别设置音量和获取音量,线程函数为:GetCaptureVolumeThread()和 SetCaptureVolumeThread。也采用事件驱动方式实现。
异常处理:
如果timer两次调用间隔超过7ms,且连续多次出现,则说明可能有异常发生,则对timer进行重置。
对播放的处理:
如果连续两次播放间隔超过某一门限(5ms), 则进入PlayProc()接口,获取播放buffer中当前没有播放的数据长度,即播放延时。根据此播放延时,自动调整播放缓冲区的延时值(_minPlayBufDelay,_playBufDelay和_waitCo