从Windows手机应用程序中生成的缓冲区播放声音

时间:2014-11-02 09:35:00

标签: windows windows-phone-8 sdk

我是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”类型的异常,但未在用户代码中处理

1 个答案:

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