Я пытаюсь написать программу, которая взаимодействует с 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-мя программами, которые все активны и создают шум. Кажется, я вижу программу звуков системы, но ничего больше.
Спасибо за помощь.
IAudioSessionControl::GetDisplayName
- это правильный API, и он может возвращать непустые строки, однако вы также можете увидеть неактивные сеансы, для которых строки действительно пусты. В вашем случае вы можете использовать неактивные сеансы, код ошибки, который вы не предоставили или иным образом неверно использовали API.
Этот фрагмент кода/приложение перечисляет сеансы и опросы для изменений тома - он печатает непустые строки.
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 ""
Идея из другого вопроса.
Проблема должна заключаться в самих сеансах. Большинство программ никогда не называют их сеансы, поэтому обычно сеансы не имеют имен, а имя, показанное в аудиомикшере, может быть названием заголовка окна процесса владельца сеанса.
Использование IAudioSessionControl2::GetProcessID
и получить заголовок окна процесса через другие API-интерфейсы должны дать разумное имя, аналогичное имени из аудиомикшера.