【问题标题】:Playing sounds in C# WinPhone 8.1 App - Sometimes causes exception在 C# WinPhone 8.1 App 中播放声音 - 有时会导致异常
【发布时间】:2014-09-01 21:51:05
【问题描述】:

我一直在编写一个小应用程序,它使用 C# 在 WinPhone 8.1 上模拟鼓组。该应用程序运行但频繁触发声音时会导致异常: "在 KiDrums.exe 中发生了 'System.Exception' 类型的异常,但未在用户代码中处理

附加信息:灾难性故障(HRESULT 异常:0x8000FFFF (E_UNEXPECTED))"

我相信这是因为我尝试在同一声音或另一个声音仍在播放时触发声音造成的。很难说,因为我无法确定模式。 贝娄是我用过的一些代码。我有一个背景图片,在上面有几个省略号在触摸时会触发声音。

XAML:

<Grid>
    <Image x:Name="KiDrums" HorizontalAlignment="Left" Height="620" Margin="10,10,-2,0" VerticalAlignment="Top" Width="392" Source="Assets/KiDrums.jpg" IsDoubleTapEnabled="False" ScrollViewer.VerticalScrollBarVisibility="Disabled" IsHitTestVisible="False" IsTapEnabled="False" ManipulationMode="None"/>
    <Ellipse x:Name="RedDrum" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="196" Margin="142,10,0,0" Stroke="Black" VerticalAlignment="Top" Width="248" Opacity="0" Tapped="RedDrum_Tapped" Holding="RedDrum_Holding" DoubleTapped="RedDrum_DoubleTapped"/>
    <MediaElement x:Name="Snare" Source="Assets/Snare.wav" AutoPlay="False" Visibility="Collapsed"/>
    <MediaElement x:Name="SnareRollLong" Source="Assets/SnareRollLong.wav" AutoPlay="False" Visibility="Collapsed"/>
    <MediaElement x:Name="SnareXtraRoll" Source="Assets/SnareXtraRoll.wav" AutoPlay="False" Visibility="Collapsed"/>

CS:

 private void RedDrum_Tapped(object sender, TappedRoutedEventArgs e)
    {
        // Single Snare Hit : Snare.wav
        Snare.Play();
    }

    private void RedDrum_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
    {
        // Snare Roll : SnareRollLong.wav
        SnareRollLong.Play();
    }

    private void RedDrum_Holding(object sender, HoldingRoutedEventArgs e)
    {
        // Snare Extra Long Roll : SnareXtraRoll.wav
        SnareXtraRoll.Play();
    }

有谁知道我是否应该使用任何额外的代码来确保它顺利播放? 我是否正确地假设问题在于声音的播放? 感谢您提供的任何帮助。

【问题讨论】:

  • 由于某种原因,上面没有包含 XAML 部分...

标签: c# audio windows-phone-8.1


【解决方案1】:

如果你只想播放“效果”,那么你应该使用 XNA Framework SoundEffect 类并调用 Play() 方法来播放,或者你可以创建一个 SoundEffectInstance 来停止和暂停它。像这样:

public class SoundEffectHelper : IDisposable
{
    public TimeSpan Duration { get; private set; }
    private SoundEffectInstance soundEffect;

    public SoundEffectHelper(string path)
    {
        using (Stream stream = TitleContainer.OpenStream(path))
        {
            SoundEffect effect = SoundEffect.FromStream(stream);
            this.Duration = effect.Duration;
            this.soundEffect = effect.CreateInstance();
            FrameworkDispatcher.Update();
        }
    }

        public void Play()
    {
        this.soundEffect.Play();
    }

    public void Stop()
    {
        this.soundEffect.Stop(true);
    }

    public void Pause()
    {
        this.soundEffect.Pause();
    }

    public void Resume()
    {
        this.soundEffect.Resume();
    }

    public void Dispose()
    {
        this.soundEffect.Dispose();
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多