我正在尝试编写一个与Windows Core Audio和WASAPI接口的程序。我对以下几行有困难。
CComHeapPtr<WCHAR> name;
hr = pAudioSessionControl->GetDisplayName(&name);
if (FAILED(hr)) {
LOG(L"IAudioSessionControl::GetDisplayName() failed: hr = 0x%08x", hr);
return -__LINE__; }
_tprintf(_T("Session Index %d, \"%s\"\n"), i, CString(name));
输出:
Session Index 0, "@%SystemRoot%\System32\AudioSrv.Dll,-202"
Session Index 1, ""
Session Index 2, ""
Session Index 3, ""
Press any key to continue . . .
这是3个程序都处于活动状态并产生噪音。似乎我可以看到系统声音程序,但没有别的。
感谢您的帮助。
答案 0 :(得分:1)
IAudioSessionControl::GetDisplayName
是正确的API,它可能会返回非空字符串,但是您可能还会看到字符串确实为空的非活动会话。在您的情况下,您可能会遇到非活动会话,您未提供的错误代码或其他不正确的API使用。
This code snippet/application枚举卷更改的会话和轮询 - 它会打印非空字符串。
CComHeapPtr<WCHAR> pszDisplayName;
ATLENSURE_SUCCEEDED(pSessionControl->GetDisplayName(&pszDisplayName));
_tprintf(_T("nSessionIndex %d, pszDisplayName \"%s\"\n"),
nSessionIndex, CString(pszDisplayName));
C:\AudioSessionVolumeNotification\Debug>AudioSessionVolumeNotification.exe
nSessionCount 5
nSessionIndex 0, pszDisplayName "@%SystemRoot%\System32\AudioSrv.Dll,-202"
nSessionIndex 1, pszDisplayName "Mozilla Firefox"
nSessionIndex 2, pszDisplayName "Mozilla Thunderbird"
nSessionIndex 3, pszDisplayName "Mozilla Firefox"
nSessionIndex 4, pszDisplayName ""
答案 1 :(得分:0)
来自another question的想法。
问题应该是会话本身。大多数节目从不命名他们的会话,因此通常会话没有名称,并且音频混音器上显示的名称可能是会话窗口标题的名称&#39;所有者流程。
使用IAudioSessionControl2::GetProcessID
并通过其他API获取进程的窗口标题应该给出一个类似于音频混音器的合理名称。