【问题标题】:Windows Phone application crashes when pausing the current song暂停当前​​歌曲时 Windows Phone 应用程序崩溃
【发布时间】:2014-04-12 20:51:51
【问题描述】:

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

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

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




}

}

【问题讨论】:

  • 我在 lumia 设备上进行了测试。正如我提到的,它退出了应用程序。我无法在模拟器上调试它,因为我无法在模拟器上播放音乐。还有其他方法可以调试吗?
  • 请贴出应用崩溃时遇到的异常
  • 在真机而非模拟器上运行时如何查看异常?如果我可以在模拟器上调试它,我很高兴。
  • 你是如何部署应用程序的?
  • 在 Visual Studio 上。它不会在模拟器上崩溃,因为我没有在上面播放任何音乐(似乎无法在模拟器上播放音乐)

标签: windows windows-phone-7 windows-phone-8 xna microphone


【解决方案1】:

它正在崩溃,因为它正在运行 StackOverflow!

您不应该在pause_music() 方法中调用FrameworkDispatcher.Update()! 这只会导致再次调用microphone_BufferReady,然后再调用pause_music 等,然后您的堆栈溢出就会得到处理。

只需删除该行并记住致电microphone.Stop() 即可:)

【讨论】:

  • 非常感谢保罗。我会在您更正后在我的设备上再试一次,并将在此处说明。我添加了 FrameworkDispatcher.Update(),因为之前我使用没有麦克风的简单界面检查了“暂停”和“恢复”系统音乐,但是在没有 FrameworkDispatcher.Update() 的情况下它崩溃了。这里会有问题吗?
  • 不,这应该不是问题。无论如何,我建议您阅读此codeproject.com/Articles/175122/… 并将其 XNAFrameworkDispatcherService 类用于您的 FrameworkDispatcher.Update 调用:) 这样您就不必再担心它了。
  • 我找到了一种在模拟器here上播放音乐的方法。所以我在模拟器中尝试了上面的代码。它没有崩溃。我没有做任何改变。为什么会发生这种情况?
  • 我也对其进行了测试,它对我有用而不会崩溃。我不知道为什么会发生这种情况,但我很确定您应该在那里调用 FrameworkDispatcher.Update()。
  • 当幅度超过限制时,我暂停歌曲 Thread.sleep(10*1000) 并再次恢复歌曲。我在暂停前做micic.stop(),在恢复歌曲后做micic.start()。但是当我从那里删除 FrameworkDispatcher.Update() 时,它会在无缘无故地恢复后再次暂停并无限地发生。但是当有 FrameworkDispatcher.Update() 时,它可以正常工作。这是为什么 ? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多