问题描述
我正在尝试使用 Windows 音频 API 制作一个简单的混音器应用程序。我已经想出了如何获取 IAudioSessionEnumerator
和 IAudioSessionControl
,这允许我检索每个会话的 displayName。现在我想获取/设置这些会话的数量。从 winApi 文档我想我首先需要使用 GetSimpleAudioVolume
方法,但它需要会话 GUID
作为参数。那么我如何获得现有会话的 GUID
?我在文档或谷歌中找不到任何答案。或者我可能误解了什么?
//code prints displayNames of all sessions
void getSessions() {
CoInitialize(NULL);
IMMDeviceEnumerator *pDEnumerator = NULL;
CoCreateInstance(CLSID_MMDeviceEnumerator,NULL,CLSCTX_ALL,IID_IMMDeviceEnumerator,(void**)&pDEnumerator);
IMMDevice *pDevice = NULL;
pDEnumerator->GetDefaultAudioEndpoint(eRender,eMultimedia,&pDevice);
IAudioSessionManager2 *pSManager2 = NULL;
pDevice->Activate(IID_IAudioSessionManager2,(void**)&pSManager2);
IAudioSessionEnumerator *pSEnumerator = NULL;
pSManager2->GetSessionEnumerator(&pSEnumerator);
int audioSessionCount;
pSEnumerator->GetCount(&audioSessionCount);
std::cout << audioSessionCount << '\n';
for (int i = 0; i < audioSessionCount; ++i) {
IAudioSessionControl *controls;
pSEnumerator->GetSession(i,&controls);
LPWSTR name;
controls->GetdisplayName(&name);
while (*name != 0) {
std::wcout << *name;
++name;
}
std::cout << '\n';
}
}
解决方法
每个音频会话都用一个 GUID 唯一标识——会话实例 标识符。
您可以 IAudioSessionControl2::GetSessionInstanceIdentifier
并检索包含会话标识符的字符串。
或者你可以像这样在 IAudioSessionControl
接口上查询 ISimpleAudioVolume
接口:
ISimpleAudioVolume *simpleAudioVol = NULL;
controls->QueryInterface(IID_PPV_ARGS(&simpleAudioVol));