2011-09-08 76 views
0

我无法弄清楚这一点。如果我点击一个文本框,它会设置一个定时器,每分钟激发x次。计时器似乎工作正常,但每分钟循环越低,声音影响的音量越低。我不能理解XNA框架是如何工作的。WP7 SoundEffect音量减少

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

我终于购买了开发者许可证,并将softawre部署到了手机上。在物理设备上时没有问题。在这一点上,似乎只有模拟器有这个问题。 – Jeremy

回答

0

你确定这里没有其他问题吗?这些节拍可能会重叠,从而产生更频繁出现的更响亮的印象?

我在一个快速的XNA项目中重新创建了上面的确切代码,并没有遇到响度问题。我当时并不明显 - 使用相同的音频样本。

+0

我不认为有重叠现象发生,因为它们必须是完美的重叠 - 而且我在40到200之间的所有方面都会进行不同的测试,所以如果有重叠,他们大多会在大多数情况下不规则。该项目不会在其他地方使用xna或者播放任何其他声音。我处于全面亏损状态。 – Jeremy

+0

我终于购买了一个开发人员帐户并部署到我的手机中。真正的手机没有问题。我认为这是模拟器的问题。 – Jeremy

0

您可能想尝试将该流读出移动到初始化位置。在应用程序加载时间内将音效内容存储到SoundEffect变量中,然后在MetronomeTick中对此变量调用Play()。

根据您想要的,另一种是只存储SoundEffectInstance变量,然后加载过程中,加载它,像这样:

using (System.IO.Stream strWAV = TitleContainer.OpenStream("wav/Beat.wav")) 
{ 
    SoundEffect effect = SoundEffect.FromStream(strWAV); 
    soundInstance = effect.CreateInstance(); 
} 

要在SoundEffectInstance玩的话,只需要调用播放()目的。

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