【问题标题】:How to get audio session GUID with Windows API如何使用 Windows API 获取音频会话 GUID
【发布时间】:2021-04-03 01:44:07
【问题描述】:

我正在尝试使用 Windows 音频 API 制作一个简单的混音器应用程序。我已经想出了如何获取IAudioSessionEnumeratorIAudioSessionControl,这使我可以检索每个会话的 DisplayName。现在我想获取/设置这些会话的数量。从winApi docs我想我首先需要使用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, CLSCTX_ALL, NULL, (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';
    }
}

【问题讨论】:

标签: c++ winapi mixer


【解决方案1】:

每个音频会话都由一个 GUID 唯一标识——会话实例 标识符。

您可以IAudioSessionControl2::GetSessionInstanceIdentifier 并检索包含会话标识符的字符串。

或者你可以像这样在IAudioSessionControl接口上查询ISimpleAudioVolume接口:

ISimpleAudioVolume *simpleAudioVol = NULL;
controls->QueryInterface(IID_PPV_ARGS(&simpleAudioVol));

【讨论】:

  • 非常感谢!我很困惑 GetSessionInstanceIdentifier 返回 LPWSTR 而不是 GUID
猜你喜欢
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多