我搞不懂这件事。如果我点击一个文本框,它会设置一个计时器,每分钟触发x次。计时器似乎工作得很好,但每分钟的循环次数越低,声音影响播放的音量就越小。我一定不理解XNA框架是如何工作的。
private System.Threading.Timer tmrMetronome_m;
private void tbTempo_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
TextBlock tb = (TextBlock)sender;
int iBeatsPerMinute = int.Parse(tb.Text);
int iMS = 1000 * 60 / iBeatsPerMinute;
if (this.tmrMetronome_m != null)
{
this.tmrMetronome_m.Change(new TimeSpan(0), new TimeSpan(0, 0, 0, 0, iMS));
}
else
{
this.tmrMetronome_m = new System.Threading.Timer(MetronomeTick, null, new TimeSpan(0), new TimeSpan(0, 0, 0, 0, iMS));
}
}
private void MetronomeTick(object state)
{
using (System.IO.Stream strWAV = TitleContainer.OpenStream("wav/Beat.wav"))
{
SoundEffect effect = SoundEffect.FromStream(strWAV);
FrameworkDispatcher.Update();
effect.Play();
}
}发布于 2011-09-09 07:28:29
您确定这里没有其他问题吗?当节拍出现的频率更高时,会不会是重叠的节拍造成了响亮的印象呢?
我在一个快速的XNA项目中重新创建了几乎与上面完全相同的代码,并且没有遇到响度问题。很明显,我没有使用相同的音频样本。
发布于 2011-09-10 20:04:33
您可能希望尝试将该Stream读数移出到初始化的某个位置。在应用程序加载期间将音效内容存储到SoundEffect变量中,然后在MetronomeTick期间对此变量调用Play()。
根据您的需要,另一种方法是只存储一个SoundEffectInstance变量,然后在加载时加载它,如下所示:
using (System.IO.Stream strWAV = TitleContainer.OpenStream("wav/Beat.wav"))
{
SoundEffect effect = SoundEffect.FromStream(strWAV);
soundInstance = effect.CreateInstance();
}要播放它,只需在SoundEffectInstance对象上调用Play()。
当然,因为您只保留一个实例,所以其中两个声音永远不会重叠(不确定您想要什么)。无论哪种方式,如果这个问题仍然存在,都值得一试。
https://stackoverflow.com/questions/7343092
复制相似问题