Condividi tramite


Rilevare e rispondere ai cambiamenti di stato dell'audio

A partire da Windows 10, versione 1803, l'app può rilevare quando il sistema abbassa o disattiva il livello audio di uno stream audio usato dall'app. Si possono ricevere notifiche per l'acquisizione e il rendering dei flussi, per un particolare dispositivo audio e categoria audio o per un oggetto MediaPlayer usato dall'app per la riproduzione multimediale. Ad esempio, il sistema può abbassare o "duck", il livello di riproduzione audio quando sta suonando una sveglia. Il sistema disattiva l'app quando entra in background se l'app non ha dichiarato la funzionalità fackgroundMediaPlayback nel manifesto dell'app.

Il modello per la gestione delle modifiche dello stato audio è lo stesso per tutti i flussi audio supportati. Creare prima di tutto un'istanza della classe AudioStateMonitor. Nell'esempio seguente l'app usa la classe MediaCapture per acquisire l'audio per la chat di gioco. Viene chiamato un metodo factory per ottenere un monitoraggio dello stato audio associato al flusso di acquisizione audio della chat del dispositivo di comunicazione predefinito. Successivamente, un gestore viene registrato per l'evento SoundLevelChanged, che verrà generato quando il livello audio per il flusso associato viene modificato dal sistema.

AudioStateMonitor gameChatAudioStateMonitor;
string deviceId = Windows.Media.Devices.MediaDevice.GetDefaultAudioCaptureId(Windows.Media.Devices.AudioDeviceRole.Communications);
gameChatAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoringWithCategoryAndDeviceId(MediaCategory.GameChat, deviceId);
gameChatAudioStateMonitor.SoundLevelChanged += GameChatSoundLevelChanged;

Nel gestore evento SoundLevelChanged, controllare la proprietà SoundLevel di AudioStateMonitor passata al gestore per determinare qual è il nuovo livello audio per il flusso. In questo esempio l'app interrompe l'acquisizione dell'audio quando il livello audio viene disattivato e riprende l'acquisizione quando il livello audio torna a un volume completo.

private void GameChatSoundLevelChanged(AudioStateMonitor sender, object args)
{
    switch (sender.SoundLevel)
    {
        case SoundLevel.Full:
            StartAudioCapture();
            break;
        case SoundLevel.Muted:
            StopAudioCapture();
            break;
        case SoundLevel.Low:
            // Audio capture should never be "ducked", only muted or full volume.
            Debug.WriteLine("Unexpected audio state change.");
            break;
    }
}

Per altre informazioni sull'acquisizione di audio con MediaCapture, vedere Acquisizione di foto, video e audio di base con MediaCapture.

A ogni istanza della classe MediaPlayer è associato un AudioStateMonitor che si può usare per rilevare quando il sistema modifica il livello di volume del contenuto attualmente riprodotto. È possibile decidere di gestire le modifiche dello stato audio in modo diverso a seconda del tipo di contenuto riprodotto. Ad esempio, è possibile decidere di sospendere la riproduzione di un podcast quando l'audio viene abbassato, ma continuare la riproduzione se il contenuto è musica.

bool isPodcast;
bool isPausedDueToAudioStateMonitor;
private void AudioStateMonitor_SoundLevelChanged(Windows.Media.Audio.AudioStateMonitor sender, object args)
{
    if ((sender.SoundLevel == SoundLevel.Full) || (sender.SoundLevel == SoundLevel.Low && !isPodcast))
    {
        if (isPausedDueToAudioStateMonitor)
        {
            mediaPlayer.Play();
            isPausedDueToAudioStateMonitor = false;
        }
    }
    else if ((sender.SoundLevel == SoundLevel.Muted) ||
         (sender.SoundLevel == SoundLevel.Low && isPodcast))
    {
        if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
        {
            mediaPlayer.Pause();
            isPausedDueToAudioStateMonitor = true;
        }
    }

}

Per altre informazioni sull'uso di MediaPlayer, vedere Riprodurre audio e video con MediaPlayer.