如何测试音频会话的相等性

时间:2011-05-22 18:24:48

标签: c++ winapi com core-audio wasapi

我正在尝试使用Windows Audio Session API在当前音频会话的枚举中找到默认音频会话。目前,我引用了IAudioSessionControl角色中音频渲染端点的默认会话的eConsole以及枚举此默认端点的音频会话的IAudioSessionEnumerator对象,但是我需要能够将IAudioSessionControl对象与IAudioSessionEnumerator::GetSession返回的IAudioSessionControl对象进行比较。

我希望通过比较IAudioSessionControl相等的指针来测试相等性。当我使用IAudioClient::GetService多次获得默认会话的IAudioSessionControl时,此方法有效。不幸的是,IAudioClient::GetService返回的此指针不会出现在IAudioSessionEnumerator的音频会话枚举中。此外,即使使用相同的音频会话GUID(IAudioSessionControl)和GUID_NULL值,通过IAudioSessionManager::GetAudioSessionControl路由多次获取默认音频会话也不会产生相同的CrossProcessSession指针。

如何在给出两个IAudioSessionControl指针的情况下测试音频会话的相等性?是否可以获取给定IAudioSessionControl对象的音频会话GUID和进程标识符?

2 个答案:

答案 0 :(得分:2)

查看IAudioSessionControl2::GetSessionIdentifier API,这是音频子系统用于持久保存会话卷的内容。如果要在运行时区分会话(同时运行同一应用程序的两个实例),请检查GetSessionInstanceIdentifier API。

答案 1 :(得分:1)

COM唯一能帮到你的是object identity requirement

您从两个对象中查询IUnknown*并进行比较。如果这些对象的IUnknown*是相同的,则它是同一个对象,否则它们是不同的对象。

当然,实现可能违反对象标识要求,或者那些不同的对象可能以某种方式映射到同一内部对象。 COM无法帮助您 - 您必须找到特定于该组件实现的信息。