2014-11-15 2 views
0

Я пытаюсь написать программу, которая взаимодействует с Windows Core Audio и WASAPI. У меня возникают трудности со следующими парами.WASAPI GetDisplayName возвращает пусто

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

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

ответ

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 "" 
+0

Спасибо за помощь Роман. См. Мои изменения для получения дополнительной информации. – Jacky4566

0

Идея от another question.

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

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