Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'app può rilevare quando il sistema abbassa o disattiva il livello audio di un flusso audio usato dall'app. Puoi ricevere notifiche per i flussi di acquisizione e di rendering, per uno specifico dispositivo audio e una specifica categoria audio oppure per un oggetto MediaPlayer utilizzato dall'applicazione per la riproduzione di contenuti multimediali. Ad esempio, il sistema può abbassare, o "attenuare", il livello di riproduzione dell'audio quando suona un allarme o quando un'altra app apre un flusso audio per comunicazioni, ad esempio per una chiamata VoIP.
Annotazioni
In ambiente desktop, l'attenuazione dell'audio viene attivata quando il sistema rileva un flusso audio di comunicazione attivo, ad esempio una chiamata che utilizza la categoria AudioRenderCategory.Communications. Il comportamento è controllato dalla scheda Communications nel pannello impostazioni audio Windows. Alcune app di comunicazione (ad esempio Microsoft Teams) gestiscono autonomamente il proprio missaggio audio e potrebbero non attivare l'attenuazione automatica dell'audio a livello di sistema.
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 monitor dello stato audio associato al flusso di acquisizione audio della chat vocale di gioco del dispositivo di comunicazione predefinito. Successivamente, viene registrato un gestore eventi per l'evento SoundLevelChanged, che viene generato quando il sistema modifica il livello audio del flusso associato.
AudioStateMonitor gameChatAudioStateMonitor;
// Create an AudioStateMonitor for game chat capture on the default communications device
string deviceId = Windows.Media.Devices.MediaDevice.GetDefaultAudioCaptureId(
Windows.Media.Devices.AudioDeviceRole.Communications);
gameChatAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoringWithCategoryAndDeviceId(
MediaCategory.GameChat, deviceId);
gameChatAudioStateMonitor.SoundLevelChanged += GameChatSoundLevelChanged;
Nel gestore dell'evento SoundLevelChanged, controllare la proprietà SoundLevel del mittente AudioStateMonitor passato al gestore per determinare il nuovo livello audio del 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:
// Resume audio capture
break;
case SoundLevel.Muted:
// Stop audio capture
break;
case SoundLevel.Low:
// Audio capture should never be "ducked", only muted or full volume.
break;
}
}
Per altre informazioni sull'acquisizione di audio con MediaCapture, vedi Acquisizione di foto, video e audio di base con MediaCapture.
Ogni istanza della classe MediaPlayer dispone di un AudioStateMonitor associato a esso che è possibile usare per rilevare quando il sistema modifica il livello di volume del contenuto attualmente in riproduzione. È 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(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, vedi Riprodurre audio e video con MediaPlayer.