我无法想出这个。如果我单击一个文本框,它会设置一个计时器,每分钟启动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();
}
}
答案 0 :(得分:0)
你确定这里没有其他问题吗?节拍可能会重叠,以便在频繁出现时产生更响亮的印象吗?
我在快速XNA项目中重新创建了上面的确切代码,但没有遇到响度问题。我显然不是 - 使用相同的音频样本。
答案 1 :(得分:0)
您可能想尝试将Stream读取移动到某处的初始化。在app加载时将声音效果内容存储到SoundEffect变量中,然后在MetronomeTick中调用此变量上的Play()。
根据您的需要,另一种方法是仅存储SoundEffectInstance变量,然后在加载时加载它,如下所示:
using (System.IO.Stream strWAV = TitleContainer.OpenStream("wav/Beat.wav"))
{
SoundEffect effect = SoundEffect.FromStream(strWAV);
soundInstance = effect.CreateInstance();
}
要播放它,只需在SoundEffectInstance对象上调用Play()。
当然,因为你只保留一个实例,所以这些声音中的两个永远不会重叠(不确定你想要什么)。无论哪种方式,如果这个问题仍然存在,那么值得尝试。