Recupero di eventi di anatraggio
Un'applicazione multimediale che vuole offrire un'esperienza personalizzata di anatraggio deve essere in ascolto delle notifiche degli eventi quando un flusso di comunicazione viene aperto o chiuso nel sistema. L'implementazione personalizzata può essere fornita tramite MediaFoundation, DirectShow o DirectSound, che usano le API Audio principali. Un client WASAPI diretto può anche eseguire l'override della gestione predefinita se sa quando viene avviata e terminata la sessione di comunicazione.
Per fornire un'implementazione personalizzata, un'applicazione multimediale deve ricevere notifiche dal sistema quando un'applicazione di comunicazione avvia o termina un flusso di comunicazione. L'applicazione multimediale deve implementare l'interfaccia IAudioVolumeDuckNotification e registrare l'implementazione con il sistema audio. Al termine della registrazione, l'applicazione multimediale riceve notifiche degli eventi sotto forma di callback tramite i metodi nell'interfaccia. Per altre informazioni, vedere Considerazioni sull'implementazione per le notifiche di ducking.
Per inviare notifiche di anatraggio, il sistema audio deve sapere quale sessione audio è in ascolto degli eventi di anatraggio. Ogni sessione audio viene identificata in modo univoco con un GUID, ovvero l'identificatore dell'istanza di sessione. Gestione sessioni consente a un'applicazione di ottenere informazioni sulla sessione, ad esempio il titolo della sessione audio, lo stato di rendering e l'identificatore dell'istanza di sessione. L'identificatore può essere recuperato usando l'interfaccia del controllo dei criteri IAudioSessionControl2.
I passaggi seguenti riepilogano il processo di recupero dell'identificatore dell'istanza di sessione dell'applicazione multimediale:
- Creare un'istanza dell'enumeratore del dispositivo e usarlo per ottenere un riferimento all'endpoint del dispositivo usato dall'applicazione multimediale per eseguire il rendering del flusso non di comunicazione.
- Attivare il gestore di sessioni dall'endpoint del dispositivo e ottenere un riferimento all'interfaccia IAudioSessionManager2 del gestore sessione.
- Usando il puntatore IAudioSessionManager2, ottenere un riferimento all'interfaccia IAudioSessionControl del gestore sessione.
- Eseguire una query per IAudioSessionControl2 dall'interfaccia IAudioSessionControl.
- Chiama IAudioSessionControl2::GetSessionInstanceIdentifier e recupera una stringa contenente l'identificatore di sessione per la sessione audio corrente.
Per ricevere notifiche di anatraggio sui flussi di comunicazione, l'applicazione multimediale chiama IAudioSessionManager2::RegisterDuckNotification. L'applicazione multimediale fornisce l'identificatore dell'istanza di sessione al sistema audio e un puntatore all'implementazione di IAudioVolumeDuckNotification . L'applicazione può ora ricevere la notifica degli eventi quando un flusso aperto nel dispositivo di comunicazione. Per interrompere la notifica, l'applicazione multimediale deve chiamare IAudioSessionManager2::UnregisterDuckNotification.
Il codice seguente illustra come un'applicazione può registrarsi per ricevere notifiche di anatraggio. La classe CMediaPlayer è definita in Considerazioni sull'implementazione per le notifiche di anatraggio. L'esempio DuckingMediaPlayer implementa questa funzionalità.
////////////////////////////////////////////////////////////////////
//Description: Registers for duck notifications depending on the
// the ducking options specified by the caller.
//Parameters:
// If DuckingOptOutChecked is TRUE, the client is registered for
// to receive ducking notifications;
// FALSE, the client's registration is deleted.
////////////////////////////////////////////////////////////////////
HRESULT CMediaPlayer::DuckingOptOut(bool DuckingOptOutChecked)
{
HRESULT hr = S_OK;
IMMDeviceEnumerator* pDeviceEnumerator NULL;
IMMDevice* pEndpoint = NULL;
IAudioSessionManager2* pSessionManager2 = NULL;
IAudioSessionControl* pSessionControl = NULL;
IAudioSessionControl2* pSessionControl2 = NULL;
LPWSTR sessionId = NULL;
// Start with the default endpoint.
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pDeviceEnumerator));
if (SUCCEEDED(hr))
{
hr = pDeviceEnumerator>GetDefaultAudioEndpoint(
eRender, eConsole, &pEndpoint);
pDeviceEnumerator>Release();
pDeviceEnumerator = NULL;
}
// Activate the session manager.
if (SUCCEEDED(hr))
{
hr = pEndpoint->Activate(__uuidof(IAudioSessionManager2),
CLSCTX_INPROC_SERVER,
NULL,
reinterpret_cast<void **>
(&pSessionManager2));
pEndpoint->Release();
pEndpoint = NULL;
}
if (SUCCEEDED(hr))
{
hr = pSessionManager2->GetAudioSessionControl(
NULL, 0, &pSessionControl);
}
if (SUCCEEDED(hr))
{
hr = pSessionControl->QueryInterface(
IID_PPV_ARGS(&pSessionControl2));
pSessionControl->Release();
pSessionControl = NULL;
}
// Get the session instance identifier.
if (SUCCEEDED(hr))
{
hr = pSessionControl2->GetSessionInstanceIdentifier(
sessionId);
pSessionControl2->Release();
pSessionControl2 = NULL;
}
// Register for ducking events depending on
// the specified preference.
if (SUCCEEDED(hr))
{
if (DuckingOptOutChecked)
{
hr = pSessionManager2->RegisterDuckNotification(
sessionId, this);
}
else
{
hr = pSessionManager2->UnregisterDuckNotification
(FALSE);
}
pSessionManager2->Release();
pSessionManager2 = NULL;
}
return hr;
}
Argomenti correlati