我是windows phone sdk的新手。 我找不到从Windows手机应用程序中生成的缓冲区播放声音的示例。 请帮忙。
我找到了这个例子:
byte] buffer = new byte[44100 * 2 * 5];
float t = 0;
for (int i = 0; i < 44100 * 2 * 5; i += 2)
{
short val = (short)(Math.Sin(t * 2 * Math.PI * 440) * short.MaxValue);
buffer[i] = (byte)(val & 0xFF);
buffer[i + 1] = (byte)(val >> 8);
t += 1 / 44100.0f;
}
sf = new SoundEffect(buffer, 44100, AudioChannels.Mono);
// Play.
sf.Play();
但是因为错误而崩溃了 Microsoft.Xna.Framework.ni.dll中出现'System.InvalidOperationException'类型的第一次机会异常 Microsoft.Xna.Framework.ni.dll中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理
答案 0 :(得分:0)
您需要致电FrameworkDispatcher.Update
。
(见例外: 尚未调用FrameworkDispatcher.Update。定期的FrameworkDispatcher.Update调用是必要的,以便消除和忘记声音效果和框架事件以正常运行。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=193853。)
在构造函数中设置一个计时器:
var dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromMilliseconds(33);
dt.Tick += new EventHandler(Tick);
dt.Start();
Tick事件处理程序:
void Tick(object sender, EventArgs e)
{
try
{
FrameworkDispatcher.Update();
}
catch (Exception ex)
{
if (Debugger.IsAttached)
{
Debugger.Break();
}
}
}
应该使用您应用中的播放按钮。我还在您的代码中添加了一行:var soundInstance = sf.CreateInstance();
private void appBarPlayButton_Click(object sender, EventArgs e)
{
byte[] buffer = new byte[44100 * 2 * 5];
float t = 0;
for (int i = 0; i < 44100 * 2 * 5; i += 2)
{
short val = (short)(Math.Sin(t * 2 * Math.PI * 440) * short.MaxValue);
buffer[i] = (byte)(val & 0xFF);
buffer[i + 1] = (byte)(val >> 8);
t += 1 / 44100.0f;
}
var sf = new SoundEffect(buffer, 44100, AudioChannels.Mono);
var soundInstance = sf.CreateInstance();
// Play.
sf.Play();
}