不同操作系统管理音频设备及提供的音频接口方式各不同,ADM用于屏蔽音频设备管理及接口的差异,抽象统一接口。它的全称是Adio Device Module。
设备管理模块(ADM)
类结构图
首先它肯定是个接口类,不同平台的实现都继承于它,实现具体的接口。如下为整个ADM体系的类结构图。
AudioDeviceWindowCore
和AudiDeviceMac
就分属windows和mac下的实现,linux下的实现为AudioDeviceLinuxALSA
。
ADM的接口分为三大类:
- 音频设备管理:检索音频设备,初始化音频设备,指定使用的音频设备。
- 音频回放。
- 音频采集。
在整个音频模块中,它属于最底层,将上层的处理后的音频数据给到音频设备进行回放或采集音频给到上层处理。
创建时机
全局只有一个ADM对象,由所有的pc(peerconnection)对象所共享。
相关堆栈
创建ADM的具体代码可以看看webrtc_voice_engine.cc
文件中的void WebRtcVoiceEngine::Init()
方法。
windows下的实现
windows下的实现具有代表性,也方便调试。后面回放,采集的流程都以windows下的实现来分析。
对应的实现类是AudioDeviceWindowCore
,类图如下:
作为windows下的具体实现,它直接管理Windows提供的音频COM对象。
以I开头的都是属于windows下的音频设备相关的接口。
IMMDevice
代表一个音频设备。IMMDeviceCollection
音频设备集。IMMDeviceEnumerator
用于枚举音频设备。IMMEndpoint
代表一个音频终端设备。
以上为ADM基本架构图及它主要功能的介绍。