如何使用 Windows API 获取音频会话 GUID

问题描述

我正在尝试使用 Windows 音频 API 制作一个简单的混音器应用程序。我已经想出了如何获取 IAudioSessionEnumeratorIAudioSessionControl,这允许我检索每个会话的 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));

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...