我目前正在处理音频会话。假设我有一个音频会话,它是通过使用 GetSessionEnumerator 和 GetSession 枚举所有会话而获得的。可以使用 RegisterAudioSessionNotification 注册通知以了解会话何时更改音量、更改状态……。
但是,我没有找到如何知道会话何时被删除。根据文档,API 没有提供会话过期机制。
考虑到这些信息,我不明白两种行为:
在 Windows 的音量混合器 (sndvol) 中,当您终止产生声音的应用程序时,与其关联的图标和音量滑块将从列表中消失。由于没有过期机制,sndvol 是如何知道这一点的?
这是一个场景:
一个。您有 n 个音频会话处于活动状态
湾。你枚举这些会话并听取新的会话
C。您启动一个应用程序产生声音,会话创建通知启动,您的列表中现在有 n+1 个会话
d。您终止应用程序。由于没有过期机制,您仍然有 n+1 个通知
e. 我不明白的是:如果您重新枚举音频会话,您将获得 n 个会话。如果重新枚举时列表中没有事件,终止的应用程序的额外会话为什么仍然有效?而且,它为什么会从列表中消失?
有没有人有任何信息?我一直在寻找几个星期,没有结果!
非常感谢!
编辑:所以我研究了 sndvol,发现了一个有趣的接口:{604e2ae7-c4c5-4032-93ff-88b26cdd75b8},它 sndvol 从 IAudioSessionControl 查询每个会话。显然这是一个没有文档的私有接口。有趣的是:如果该查询失败,则会话不会显示在 sndvol 中! 这似乎在这里得到证实
我在该界面上找不到更多信息。