Windows Phone应用程序在暂停当前歌曲时崩溃

Windows Phone应用程序在暂停当前歌曲时崩溃,windows,windows-phone-7,windows-phone-8,xna,microphone,Windows,Windows Phone 7,Windows Phone 8,Xna,Microphone,我的目标是当麦克风的振幅超过某个值时暂停当前播放的歌曲。 但当振幅增加该值时,应用程序会突然退出。 为什么会这样? 如何解决这个问题 [我所做的是用音乐演奏一首歌, 打开此应用程序并按下按钮,发出超过该值的声音。 然后应用程序突然退出] using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Con

我的目标是当麦克风的振幅超过某个值时暂停当前播放的歌曲。
但当振幅增加该值时,应用程序会突然退出。
为什么会这样?
如何解决这个问题

[我所做的是用音乐演奏一首歌,
打开此应用程序并按下按钮,发出超过该值的声音。
然后应用程序突然退出]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using U.Resources;
using Microsoft.Xna.Framework.Audio;
using System.Windows.Threading;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Media;

namespace U
{
    public partial class MainPage : PhoneApplicationPage
    {
    //global variables
    Microphone microphone = Microphone.Default;
    byte[] buffer;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
        // Timer to simulate the XNA Game Studio game loop (Microphone is from XNA Game Studio)
        DispatcherTimer dt = new DispatcherTimer();
        dt.Interval = TimeSpan.FromMilliseconds(33);
        dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
        dt.Start();

        microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);

    }

    private void buttonStart_Click(object sender, RoutedEventArgs e)
    {
        microphone.BufferDuration = TimeSpan.FromMilliseconds(100);
        buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
        microphone.Start();
    }

    void microphone_BufferReady(object sender, EventArgs e)
    {
        microphone.GetData(buffer);
        for (int i = 0; i < buffer.Length; i += 2)
        {
            //The value of sample is the amplitude of the signal
            short sample = BitConverter.ToInt16(new byte[2] { buffer[i], buffer[i + 1] }, 0);
            //getting the absolut value
            if (sample < 0) sample *= (-1);

            //showing the output
             if(sample>1000) pause_music();
        }

    }

    void pause_music() 
    {
        if (MediaPlayer.State == MediaState.Playing)
        {
            FrameworkDispatcher.Update();
            MediaPlayer.Pause();
        }
    }




}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
Net系统;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Navigation;
使用Microsoft.Phone.Controls;
使用Microsoft.Phone.Shell;
利用美国资源;
使用Microsoft.Xna.Framework.Audio;
使用System.Windows.Threading;
使用Microsoft.Xna.Framework;
使用Microsoft.Xna.Framework.Media;
名称空间U
{
公共部分类主页:PhoneApplicationPage
{
//全局变量
麦克风麦克风=麦克风。默认值;
字节[]缓冲区;
//建造师
公共主页()
{
初始化组件();
//模拟XNA Game Studio游戏循环的计时器(麦克风来自XNA Game Studio)
Dispatchermer dt=新Dispatchermer();
dt.Interval=时间跨度(毫秒)(33);
dt.Tick+=委托{try{FrameworkDispatcher.Update();}catch{};
dt.Start();
micromic.BufferReady+=新的事件处理程序(micromic_BufferReady);
}
私有无效按钮开始单击(对象发送者,路由目标)
{
Mirror.BufferDuration=TimeSpan.From毫秒(100);
buffer=新字节[microsic.GetSampleSizeInBytes(microsic.BufferDuration)];
麦克风。开始();
}
无效麦克风\u缓冲就绪(对象发送器,事件参数e)
{
麦克风。获取数据(缓冲区);
对于(int i=0;i1000)暂停音乐();
}
}
音乐
{
if(MediaPlayer.State==MediaPlayer.Playing)
{
FrameworkDispatcher.Update();
MediaPlayer.Pause();
}
}
}

}它正在崩溃,因为它将溢出

您不应该从
pause\u music()
方法中调用
FrameworkDispatcher.Update()
! 这只会导致另一个调用
麦克风\u BufferReady
,然后
暂停\u music
等,堆栈溢出被服务


只要拆下那根线,记得调用麦克风.Stop(),它就会工作:)

我在lumia设备上测试了它。正如我提到的,它退出应用程序。我无法在emulator上调试它,因为我无法在emulator上播放音乐。是否有其他方法来调试它?发布应用程序崩溃时出现的异常,请注意,当它在真实设备而不是模拟器上运行时,我如何才能看到异常?如果我能在emulator上调试它,我会很高兴。你是如何在Visual Studio上部署该应用程序的。它不会在模拟器上崩溃,因为我没有在它上播放任何音乐(似乎不可能在模拟器上播放音乐)。非常感谢Paolo。我会在我的设备上再试一次,正如你所纠正的,并在这里说明。我添加了FrameworkDispatcher.Update(),因为之前我在没有麦克风的简单界面上选中了“暂停”和“恢复”系统音乐,但没有FrameworkDispatcher.Update()它就崩溃了。这会是个问题吗?不,不应该是个问题。无论如何,我建议您阅读本文,并为您的FrameworkDispatcher使用其XNAFrameworkDispatcherService类。更新调用:)这样您就再也不用担心了。我找到了一种在模拟器上播放音乐的方法。所以我在模拟器中尝试了上面的代码。它没有崩溃。我没有做任何改变。为什么会发生这种情况?我也测试过它,它对我有效,不会崩溃。我不知道为什么会发生这种情况,但我很确定您不应该在那里调用FrameworkDispatcher.Update()。当振幅超过限制时,我暂停歌曲线程。睡眠(10*1000)并再次恢复歌曲。我在暂停前执行micro.stop(),在恢复歌曲后执行micro.start()。但是,当我从那里删除FrameworkDispatcher.Update()时,它会在毫无理由地恢复之后再次暂停,并无限期地发生。但是如果有FrameworkDispatcher.Update()的话,它就可以正常工作了。这是为什么?:)