打从生成的缓冲声音在Windows手机应用程序(Playing a sound from a gen

2019-10-21 05:31发布

我在新的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();

但它的崩溃,错误“System.InvalidOperationException”类型的第一次机会异常出现在Microsoft.Xna.Framework.ni.dll“System.InvalidOperationException”类型的异常出现在Microsoft.Xna.Framework.ni.dll但没有在用户代码中处理

Answer 1:

你需要调用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();
    }


文章来源: Playing a sound from a generated buffer in a Windows phone app