2009-04-04 2 views
0

Я играю с материалами CoreAudio от Vista, в частности с IAudionSessionEvents, с целью мониторинга звукового сеанса по умолчанию для изменения объема, вызванного загруженным кодом.Можете ли вы запретить SndVol отображать пустой сеанс аудио?

Однако, как только вы устанавливаете прослушиватель IAudioSessionEvents, SndVol перечисляет программу со всеми связанными регуляторами громкости. Как хорошая часть времени, ни один код не загружен, что фактически будет играть что-либо, это меньше, чем идеально.

В принципе, есть ли способ отслеживать сеанс аудио по умолчанию, не заставляя SndVol перечислить его?

Решение для Vista предпочтительнее, но что-то в зависимости от нового apis, предоставляемого в Windows 7, лучше, чем ничего.


Ларри Остерман указал интерфейсы ISessionManager2 и IAudioSessionNotification добавлены в Windows 7. Тем не менее, я никогда не получить уведомление о новой сессии. Кто-нибудь знает об ошибках или проблемах с этим API под Windows 7 build 7000?

Код регистрации IAudioSessionNotifications, опуская много ошибок проверки кода *:

BOOL success = false; 
HRESULT hr; 
IMMDeviceEnumerator *pEnumerator = NULL; 
IMMDevice *pDevice = NULL; 
IAudioSessionManager2* pManager = NULL; 
IClassFactory* pFactory = NULL; 

hr = CoInitialize(NULL); 

hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator); 

hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice); 

pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&pManager); 

listener = NULL; 

hr = CoGetClassObject(CLSID_CustomFactory, CLSCTX_ALL, NULL, __uuidof(IClassFactory), (void**)&pFactory); 

hr = pFactory->CreateInstance(NULL, __uuidof(IAudioSessionNotification), (void**)&listener); 

hr = pManager->RegisterSessionNotification(listener); 

* Пока не цель этого вопроса, конструктивный критик мой COM код приветствуется.

ответ

1

Если вы хотите контролировать аудиофайлы, вы должны использовать интерфейс IAudioSessionManager для извлечения объекта IAudioSessionControl. Сеанс появляется только в SndVol, когда он переходит из неактивного в активное состояние - это происходит, когда кто-то вызывает IAudioClient :: Start() - если вы не вызываете IAudioClient :: Start, вы не должны получать сеанс слайдер.

В Windows 7 появился новый набор API (IAudioSessionManager2), которые позволяют прослушивать создание сеанса и уничтожение.

Кроме того, для Windows 7, есть флаг AUDCLNT_SESSIONFLAGS_HIDE (документация для этого пока не обновляется, но это в заголовках)

+0

Я, безусловно, не называя IAudioClient: Start(), но сессия появляется в SndVol. Мне кажется, что установка обработчика событий через IAudioSessionControl :: RegisterAudioSessionNotification (...) активирует сеанс. По крайней мере, на windows 7 build 7000. –

+0

IAudioSessionManager2 :: RegisterSessionNotification(), похоже, не работает. Я не получаю уведомления о новых сеансах от любого процесса, включая его установку. Есть ли какие-то ошибки, о которых вы знаете? Запуск на Windows 7 build 7000. –

+0

Я не знаю, почему это не сработает - это тот же механизм, что и sndvol, который используется внутри - мы просто сделали API общедоступным. –

Смежные вопросы