Mendeteksi dan merespons perubahan status audio

Dimulai dengan Windows 10, versi 1803, aplikasi Anda dapat mendeteksi kapan sistem menurunkan atau mematikan suara tingkat audio aliran audio yang digunakan aplikasi Anda. Anda dapat menerima pemberitahuan untuk mengambil dan merender streaming, untuk perangkat audio dan kategori audio tertentu, atau untuk objek MediaPlayer yang digunakan aplikasi Anda untuk pemutaran media. Misalnya, sistem mungkin lebih rendah, atau "bebek", tingkat pemutaran audio saat alarm berdering. Sistem akan membisukan aplikasi Anda saat masuk ke latar belakang jika aplikasi Anda belum mendeklarasikan kemampuan backgroundMediaPlayback dalam manifes aplikasi.

Pola untuk menangani perubahan status audio sama untuk semua aliran audio yang didukung. Pertama, buat instans kelas AudioStateMonitor . Dalam contoh berikut, aplikasi menggunakan kelas MediaCapture untuk mengambil audio untuk obrolan game. Metode pabrik dipanggil untuk mendapatkan monitor status audio yang terkait dengan aliran pengambilan audio obrolan game dari perangkat komunikasi default. Selanjutnya, handler terdaftar untuk peristiwa SoundLevelChanged , yang akan dinaikkan ketika tingkat audio untuk aliran terkait diubah oleh sistem.

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

Di penanganan aktivitas SoundLevelChanged , periksa properti SoundLevel pengirim AudioStateMonitor yang diteruskan ke handler untuk menentukan tingkat audio baru untuk streaming. Dalam contoh ini, aplikasi berhenti menangkap audio saat tingkat suara dimatikan suaranya dan melanjutkan pengambilan saat tingkat audio kembali ke volume penuh.

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;
    }
}

Untuk informasi selengkapnya tentang menangkap audio dengan MediaCapture, lihat Pengambilan foto, video, dan audio dasar dengan MediaCapture.

Setiap instans kelas MediaPlayer memiliki AudioStateMonitor yang terkait dengannya yang dapat Anda gunakan untuk mendeteksi kapan sistem mengubah tingkat volume konten yang saat ini sedang diputar. Anda dapat memutuskan untuk menangani perubahan status audio secara berbeda tergantung pada jenis konten apa yang sedang diputar. Misalnya, Anda dapat memutuskan untuk menjeda pemutaran podcast saat audio diturunkan, tetapi melanjutkan pemutaran jika kontennya adalah musik.

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;
        }
    }

}

Untuk informasi selengkapnya tentang menggunakan MediaPlayer, lihat Memutar audio dan video dengan MediaPlayer.