我的目标是当麦克风的振幅超过某个值时暂停当前播放的歌曲。
但是当振幅增加该值时,应用程序突然退出。
这是为什么?
如何解决这个问题?
[我所做的是在音乐中播放一首歌,
打开此应用程序并按下按钮并发出超过该值的声音。
然后应用突然退出]
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/