c# - 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
不再存在。
我的问题是:如何将它们彼此分开,以便任一音量滑块都不会影响其对应物?
编辑
我能够通过更改WaveOutEvent
forDirectSoundOut
然后调用 .Volume 在AudioFileReader
smusicAudioFile
和buttonClickAudioFile
解决方案
推荐阅读
- python - 不管输入是什么,它都不会进入“else if”语句
- vue.js - Vue组件未定义
- facebook - 如何在 Facebook AR Studio 中进行细分
- javascript - 不小心创建了额外的 .git 文件夹,现在无法访问 github 中的 js 文件夹
- pandas - 向数据框添加新列
- rabbitmq - 如何使用 RabbitMQ 处理应用程序崩溃
- javascript - Maps API icon.scaledSize 不起作用
- jquery - 两个不同的点击和两个动作jquery
- android - Glide 4 - ModelLoader 上下文
- c# - 如何添加 json 程序集以使用 mcs 在 ubuntu 终端上编译 C# 代码?