流管理
枚举系统中的音频终结点设备并确定合适的呈现或捕获设备后,音频客户端应用程序的下一个任务是打开与终结点设备的连接,并管理通过该连接传输的音频数据流。 WASAPI 使客户端能够创建和管理音频流。
WASAPI 实现多个接口,为音频客户端提供流管理服务。 主接口为 IAudioClient。 客户端通过对终结点对象调用 IMMDevice::Activate 方法(参数 iid设置为 REFIID IID_IAudioClient)来获取音频终结点设备的 IAudioClient 接口。
客户端在 IAudioClient 接口中调用方法执行以下操作:
- 发现终结点设备支持的音频格式。
- 获取终结点缓冲区大小。
- 获取流格式和延迟。
- 启动、停止和重置流经终结点设备的流。
- 访问其他音频服务。
若要创建流,客户端调用 IAudioClient::Initialize 方法。 通过此方法,客户端指定流的数据格式、终结点缓冲区的大小以及流是以共享模式还是独占模式运行。
IAudioClient 接口中的剩余方法分为两组:
- 仅在 IAudioClient::Initialize 打开流后才能调用的方法。
- 可在 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 管理音频流:
相关主题