void AudioVolume::InitAudioSessionControlList() { HRESULT hr = S_OK; if (m_spAudioSessionManager2 == NULL) return; CComQIPtr<IAudioSessionEnumerator> spAudioSessionEnumerator; try { // Get audio session enumerator hr = m_spAudioSessionManager2->GetSessionEnumerator(&spAudioSessionEnumerator); if (FAILED(hr)) { throw "Cannot get audio session enumerator!"; } // Get audio session number int nSessions = 0; hr = spAudioSessionEnumerator->GetCount(&nSessions); if (FAILED(hr)) { throw "Cannot get audio session number!"; } // Map indicating whether a process belongs to firefox std::map<DWORD, DWORD> map; if (!BuildProcesseTree(map)) { throw "AudioVolume::GetSubProcesseMap failed!"; } // Enumerate audio sessions for (int i=0; i<nSessions; i++) { CComQIPtr<IAudioSessionControl> spAudioSessionControl; try { // Get AudioSessionControl HRESULT hr = spAudioSessionEnumerator->GetSession(i, &spAudioSessionControl); if (FAILED(hr)) { throw "Cannot get AudioSessionControl!"; } AddSession(map, spAudioSessionControl); } catch (LPCSTR szError) { TRACE("[MuterWin7] AudioVolume::InitAudioSessionControlList: %s\n", szError); } } } catch (LPCSTR szError) { TRACE("[MuterWin7] AudioVolume::InitAudioSessionControlList: %s\n", szError); } SAFE_RELEASE(spAudioSessionEnumerator); }