WP7 SoundEffect音量减小

时间:2011-09-08 04:23:59

标签: windows-phone-7 xna

我无法想出这个。如果我单击一个文本框,它会设置一个计时器,每分钟启动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();
    }
}

2 个答案:

答案 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()。

当然,因为你只保留一个实例,所以这些声音中的两个永远不会重叠(不确定你想要什么)。无论哪种方式,如果这个问题仍然存在,那么值得尝试。