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

标签 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.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();
        }
    }




}

最佳答案

它正在崩溃,因为它会进入 StackOverflow!

您不应该从 pause_music() 方法中调用 FrameworkDispatcher.Update()! 这只会导致对 microphone_BufferReady 的另一个调用,然后对 pause_music 等等的调用,并且您的堆栈溢出得到处理。

只需删除该行并记住调用 microphone.Stop() 它将起作用:)

关于暂停当前​​歌曲时 Windows Phone 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035992/

相关文章:

c++ - C++ 中的简单计算器

windows - 如何在Windows XP Embedded(未安装Sc.exe)上创建服务?

wcf - WCF 上的一项服务、多个端点、多个绑定(bind)。为什么我无法到达我的端点?

silverlight - Windows Phone Mango 图表

c# - 没有选定项目的列表选择器

node.js - 术语 'gulp' 未被识别为 cmdlet 错误的名称

windows - 在批处理文件中,如何将一串值分配给变量列表?

c# - Windows Phone 7 上的双向通信

c# - Windows Phone 后退按钮

c# - 推送通知在 Windows Phone 8 中不起作用