Bagikan melalui


Mendeteksi dan merespons perubahan tingkat audio oleh sistem

Pelajari cara mendeteksi dan merespons perubahan tingkat audio oleh sistem. Dimulai dengan Windows 10 versi 1803, aplikasi Anda dapat mendeteksi kapan sistem menurunkan atau membisukan tingkat audio untuk tangkapan dan render audio aplikasi Anda. Misalnya, sistem dapat membisukan aliran aplikasi Anda ketika sedang berjalan di latar belakang.

Untuk mempelajari tentang merekam audio menggunakan kelas MediaCapture, lihat Pengambilan foto, video, dan audio dasar dengan MediaCapture. Untuk informasi tentang pemutaran audio menggunakan MediaPlayer, lihat Memutar audio dan video dengan MediaPlayer.

Kelas AudioStateMonitor memungkinkan Anda untuk mendaftar untuk menerima peristiwa ketika sistem memodifikasi volume pengambilan audio atau aliran render. Dapatkan instans AudioStateMonitor untuk memantau aliran pengambilan audio dengan memanggil CreateForCaptureMonitoring. Dapatkan instans untuk memantau aliran render audio dengan memanggil CreateForRenderMonitoring. Daftarkan handler untuk peristiwa SoundLevelChanged dari setiap monitor untuk diberi tahu saat audio dalam kategori aliran terkait diubah oleh sistem.

AudioStateMonitor captureAudioStateMonitor;
AudioStateMonitor renderAudioStateMonitor;
captureAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoring();
captureAudioStateMonitor.SoundLevelChanged += CaptureAudioStateMonitor_SoundLevelChanged;

renderAudioStateMonitor = AudioStateMonitor.CreateForRenderMonitoring();
renderAudioStateMonitor.SoundLevelChanged += RenderAudioStateMonitor_SoundLevelChanged;

Dalam penangan SoundLevelChanged untuk stream tangkap, Anda dapat memeriksa properti SoundLevel dari pengirim AudioStateMonitor untuk menentukan tingkat suara baru. Perhatikan bahwa stream tangkapan tidak boleh diturunkan volumenya oleh sistem. Ini hanya boleh dibisukan atau dialihkan kembali ke volume penuh. Jika aliran audio dibisukan, Anda dapat menghentikan pengambilan yang sedang berlangsung. Jika aliran audio dipulihkan ke volume penuh, Anda dapat mulai mengambil lagi.

bool isCapturingAudio = false;
bool capturingStoppedForAudioState = false;

private void CaptureAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    switch (sender.SoundLevel)
    {
        case SoundLevel.Full:
            if (capturingStoppedForAudioState)
            {
                MyStartAudioCapture();
                capturingStoppedForAudioState = false;
            }
            break;
        case SoundLevel.Muted:
            if (isCapturingAudio)
            {
                MyStopAudioCapture();
                capturingStoppedForAudioState = true;
            }
            break;
        case SoundLevel.Low:
            // This should never happen for capture
            Debug.WriteLine("Unexpected audio state.");
            break;
    }
}

Contoh kode berikut mengilustrasikan implementasi handler SoundLevelChanged untuk penyajian audio. Bergantung pada skenario aplikasi dan jenis konten yang Anda putar, Anda mungkin ingin menjeda pemutaran audio ketika tingkat suara dikurangi.

bool contentIsPodcast; 
private void RenderAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    if ((sender.SoundLevel == SoundLevel.Full) ||
        (sender.SoundLevel == SoundLevel.Low && !contentIsPodcast))
    {
        m_mediaPlayer.Play();
    }
    else if ((sender.SoundLevel == SoundLevel.Muted) ||
         (sender.SoundLevel == SoundLevel.Low && contentIsPodcast))
    {
        // Pause playback if we�re muted or if we�re playing a podcast and are ducked
        m_mediaPlayer.Pause();
    }
}

Pengambilan foto, video, dan audio Dasar dengan MediaCapture