首页 > 解决方案 > NAudio 改变两个不同 WaveOutEvents 的音量而不影响另一个

问题描述

我正在为学校使用 WPF 制作游戏。我有声音效果(目前只包括按钮点击声音)和音乐。我希望能够在不影响另一个的情况下分别控制音量。

我目前的代码是:

using System.Windows;
using NAudio.Wave;

namespace StarWarsTD {
    public partial class MainWindow : Window {
        private WaveOutEvent musicOutputDevice;
        private AudioFileReader musicAudioFile;
        private WaveOutEvent buttonClickOutputDevice;
        private AudioFileReader buttonClickAudioFile;

        public MainWindow() {
            InitializeComponent();

            // Initialize music
            musicOutputDevice = new WaveOutEvent();
            musicOutputDevice.PlaybackStopped += OnMusicStopped;
            musicAudioFile = new AudioFileReader("assets/audio/main_music.mp3");
            musicOutputDevice.Init(musicAudioFile);
            musicOutputDevice.Play();

            // Initialize button click
            buttonClickOutputDevice = new WaveOutEvent();
            buttonClickAudioFile = new AudioFileReader("assets/audio/click.wav");
            buttonClickOutputDevice.Init(buttonClickAudioFile);
        }

        public void PlayClickSound() {
            buttonClickOutputDevice.Play();
            buttonClickAudioFile.Position = 0;
        }

        private void PlayGameButtonClick(object sender, RoutedEventArgs e) {
            PlayClickSound();
            // Other logic ...
        }

        private void EffectsSliderChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
            if (buttonClickOutputDevice != null) {
                buttonClickOutputDevice.Volume = (float)e.NewValue;
            }
        }

        private void MusicSliderChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
            if (musicOutputDevice != null) {
                // If music slider is 0, we pause the music
                if (e.NewValue == 0) {
                    musicOutputDevice.Pause();
                } else {
                    if (musicOutputDevice.PlaybackState is PlaybackState.Paused) {
                        musicOutputDevice.Play();
                    }
                    musicOutputDevice.Volume = (float)e.NewValue;
                }
            }
        }
    }
}

<Slider Minimum="0" Maximum="1" ValueChanged="EffectsSliderChanged" />
<Slider Minimum="0" Maximum="1" ValueChanged="MusicSliderChanged" />

这段代码的问题是,如果我更改其中任何一个的滑块,它将影响整个应用程序的音量:

在此处输入图像描述

会改变不同文件的数量,但它使用的文件WavePlayer不再存在。

我的问题是:如何将它们彼此分开,以便任一音量滑块都不会影响其对应物?

编辑

我能够通过更改WaveOutEventforDirectSoundOut然后调用 .Volume 在AudioFileReadersmusicAudioFilebuttonClickAudioFile

标签: c#wpfnaudio

解决方案


推荐阅读