WASAPI GetDisplayName возвращает пустое значение

0

Я пытаюсь написать программу, которая взаимодействует с 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-мя программами, которые все активны и создают шум. Кажется, я вижу программу звуков системы, но ничего больше.

Спасибо за помощь.

Теги:
audio
wasapi

2 ответа

1

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 ""
  • 0
    Спасибо за помощь Роман. Смотрите мои правки для получения дополнительной информации.
0

Идея из другого вопроса.

Проблема должна заключаться в самих сеансах. Большинство программ никогда не называют их сеансы, поэтому обычно сеансы не имеют имен, а имя, показанное в аудиомикшере, может быть названием заголовка окна процесса владельца сеанса.

Использование IAudioSessionControl2::GetProcessID и получить заголовок окна процесса через другие API-интерфейсы должны дать разумное имя, аналогичное имени из аудиомикшера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню