C#音乐/声音同步

时间:2012-09-24 23:01:29

标签: c# audio xna synchronization

我正在XNA中创建一个游戏,它可以在很多音乐循环上工作,但我似乎无法同步这些声音。

我总是错过几毫秒你能帮帮我吗?

这是我第一次尝试同步声音。请注意,我需要处理数十种声音...

这个同步问题可能与缓存声音有关吗?
是否有外部库让它更容易?

    public SoundEffectInstance loop1, loop2;
    public int auxControl = 0;
    public bool auxB = false, auxA = false;

    public void LoadContent()
    {
        SoundEffect temp1 = Game.Content.Load<SoundEffect>("sounds/Synctest_1");

        loop1 = temp1.CreateInstance();
        loop1.IsLooped = true; 

        loop2 = temp1.CreateInstance();
        loop2.IsLooped = true;
    }

    public override void Update(GameTime gameTime)
    {
        // start first sound
        if (auxA == false)
            loop1.Play(); auxA = true;

        // start counting until 2 seconds
        if (auxA)
            auxControl += gameTime.ElapsedGameTime.Milliseconds;

        // if 2 seconds have passed after first sound start second sound
        if (auxControl >= 2000 && auxB == false)
        {
            loop2.Play();
            auxB = true;
        }

        base.Update(gameTime);
    }

谢谢

2 个答案:

答案 0 :(得分:1)

对C#一无所知,但如果API不支持,通常很难以毫秒精度同步这些类型的东西。解决方案是自己混合它们并仅使用API​​进行回放,这样你就可以完全控制它们的发声时间以及它们的组合方式。

在C#中可能有一个更简单的解决方案,但您可以使用http://www.PortAudio.com或许多其他接口构建类似的东西。您可能想在Google上搜索类似Game audio API的内容。

答案 1 :(得分:0)

目前我已经决定实现这一目标的最佳方法是在更新中使用条件,最好是主更新,这样验证就会以更快的方式完成。

这仍然会带来一个问题,因为你可能听到声音之间有一个小小的“嘟嘟”,但几乎没有注意到。

伪代码就是这样的

Update(GameTime gameTime)
{

    if (last sound ended)
    {
        play next;
        decide on the next sound; // implement cache here if needed
    }

}