WebRTC音频01 - 设备管理(本文)
WebRTC音频 02 - Windows平台设备管理
WebRTC音频 03 - 实时通信框架
WebRTC音频 04 - 关键类
WebRTC音频 05 - 音频采集编码
一、前言:
想象一下,我们在PC上安装了一个钉钉,需要开一个音视频会议。在呼叫建立这个音视频的会议的过程中,与音频相关的必要操作步骤有哪些呢?
首先,你得有硬件设备,麦克风和扬声器;
其次,你是不是得编写麦克风和扬声器的驱动程序,并添加到windows系统的内核态,并暴露接口给应用层?
接着,硬件有了,驱动有了你就可以直接写一个app去操控这个设备了(调音量、静音什么的);
那么问题来了,如果明天换了一个品牌的麦克风呢?你是不是又得做一遍?
现实中肯定不是这样的,因为微软已经规定了好了,你如果是麦克风,你就得按照我规定的一套标准API去开发驱动,无论你换啥麦克风,我都可以用通用驱动程序。那么问题又来了,既然驱动的接口已经定了标准,那么对应用层暴露的API是不是也可以有个标准呢?答案是肯定的,不光提供了接口,微软还做了一个专门的管理模块去管理这些音频相关的设备。
那么,问题又来了,人家微软不管什么麦克风怼上去都可以使用。我们WebRtc是跨平台的,既要在windows上可以使用麦克风,又要在linux上使用麦克风,又要在mac上使用麦克风,我们是不是也得不管你怼什么系统上来我就一套API去操作呢?答案也是肯定的,这个东西就叫做Audio Device Module (ADM)。
二、ADM介绍:
Audio Device Module (ADM) 用来管理
1、类关系图:
- 顶层的WebRtcVoiceEngine就是音频引擎,一般是提供给上层的PeerConnection使用的;
- WebRtcVoiceEngine 里面的成员变量adm_就是指向我们的ADM模块;
- ADM模块中最顶层的 AudioDeviceModule 是一个接口类, AudioDeviceModuleForTest只是增加了一些必要的测试功能(先别管),最终实现类就是AudioDeviceModuleImpl,我们以后说ADM,就记住是AudioDeviceModuleImpl;
- AudioDeviceModuleImpl中有个成员变量audio_device_指向 AudioDeviceGeneric,这也是个接口类,子类去实现具体的功能,理解成就是一个音频设备;
- AudioDeviceGeneric在每个平台实现不一样,比如,windows平台就是AudioDeviceWindowsCore,而linux平台是AudioDeviceLinuxALSA;
2、ADM创建:
知道了ADM的类关系图,我们就得看看它是什么时候创建的;
我们所有代码分析都是从PeerConnectionClient这个官方的demo开始.
前面的调用顺序是:
Conductor::InitializePeerConnection -> CreatePeerConnectionFactory -> CreateModularPeerConnectionFactory -> PeerConnectionFactory::Create ->ConnectionContext::Create(根据dependencies创建一个连接上下文类)-> ChannelManager::Init
到了ChannelManager::Init就是我们重点关注的部分了
- adm->CheckPlatform检查是windows还是linux;
- CreatePlatformSpecificObjects 最终会生成一个audio_device_的对象,windows就是AudioDeviceWindowsCore 。
- 我们发现 AudioDeviceModuleImpl 只是一个集合,真正实现的地方在 AudioDeviceWindowsCore 里面,他才是真正访问底层设备的;
- 在执行了CreatePlatformSpecificObjects 之后,AudioDeviceModuleImpl里面就有个成员变量叫做AudioDeviceWindowsCore 了;
- audioDevice->AttachAudioBuffer() 将 AudioDeviceModuleImpl 里面的Buffer设置到 AudioDeviceWindowsCore 中,这样,采集的数据就可以放到buffer中;
注意,图中除了最后一个矩形框,其他目前都是和平台无关的,不管你是windows、linux、mac都一样的,设计得非常好!
三、总结:
webrtc中队音频设备得管理都是通过ADM完成的,并且抽象出了统一的接口类AudioDeviceModule,使用者不用管是什么系统平台,直接调用统一的方法即可。
欢迎关注微信公众号:
版权归原作者 红米饭配南瓜汤 所有, 如有侵权,请联系我们删除。