流管理
枚举系统中 音频终结点设备并识别合适的呈现或捕获设备后,音频客户端应用程序的下一个任务是打开与终结点设备的连接,并通过该连接管理音频数据流。 WASAPI 使客户端能够创建和管理音频流。
WASAPI 实现多个接口,为音频客户端提供流管理服务。 主接口 IAudioClient。 客户端通过调用终结点设备上的 IMMDevice::Activate 方法(参数 iid 设置为 REFIID IID_IAudioClient)来获取音频终结点设备的 IAudioClient 接口。
客户端调用 IAudioClient 接口中的方法执行以下作:
- 发现终结点设备支持的音频格式。
- 获取终结点缓冲区大小。
- 获取流格式和延迟。
- 启动、停止和重置流经终结点设备。
- 访问其他音频服务。
若要创建流,客户端调用 IAudioClient::Initialize 方法。 通过此方法,客户端指定流的数据格式、终结点缓冲区的大小以及流是以共享模式还是独占模式运行。
IAudioClient 接口中的其余方法分为两个组:
- 只有在 IAudioClient::Initialize打开流后才能调用的方法。
- 可在 初始化 调用之前或之后随时调用的方法。
只有在调用 IAudioClient::Initialize后,才能调用以下方法:
- IAudioClient::GetBufferSize
- IAudioClient::GetCurrentPadding
- IAudioClient::GetService
- IAudioClient::GetStreamLatency
- IAudioClient::Reset
- IAudioClient::Start
- IAudioClient::Stop
可以在 IAudioClient::Initialize 调用之前或之后调用以下方法:
若要访问其他音频客户端服务,客户端将调用 IAudioClient::GetService 方法。 通过此方法,客户端可以获取对以下接口的引用:
-
将数据写入音频呈现终结点缓冲区。
-
从音频捕获终结点缓冲区读取捕获的数据。
-
与音频会话管理器通信,以配置和管理与流关联的音频会话。
-
控制与流关联的音频会话的音量级别。
-
控制与流关联的音频会话中各个通道的音量级别。
-
监视流数据速率和流位置。
此外,需要通知会话相关事件的 WASAPI 客户端应实现以下接口:
-
若要接收事件通知,客户端会将指向其 IAudioSessionEvents 接口的指针作为调用参数传递给 IAudioSessionControl::RegisterAudioSessionNotification 方法。
最后,客户端可能使用更高级别的 API 创建音频流,但也需要访问包含流的会话的会话控件和音量控件。 高级 API 通常不提供此访问权限。 客户端可以通过 IAudioSessionManager 接口获取特定会话的控件。 此接口使客户端能够获取会话的 IAudioSessionControl 和 ISimpleAudioVolume 接口,而无需客户端使用 IAudioClient 接口来创建流并将流分配给会话。 客户端通过调用终结点对象的 IMMDevice::Activate 方法(参数 iid 设置为 REFIID IID_IAudioSessionManager)来获取音频终结点设备的 IAudioSessionManager 接口。
IAudioSessionControl、IAudioSessionEvents和 IAudioSessionManager 接口在头文件 Audiopolicy.h 中定义。 所有其他 WASAPI 接口都在头文件 Audioclient.h 中定义。
以下部分介绍如何使用 WASAPI 管理音频流:
相关主题