Play a music just after another without delay

I’m don’t really proud of it, but I found a working solution using a custom progress variable:

SoundEffect intro;
SoundEffect loop;
SoundEffectInstance introInstance;
SoundEffectInstance loopInstance;

enum MusicState { None, Intro, Loop };
MusicState currentState;

private void LoadContent()
{
  intro = content.Load<SoundEffect>("Audio/BGM/intro");
  loop = content.Load<SoundEffect>("Audio/BGM/loop");

  introInstance = intro.CreateInstance();
  loopInstance = loop.CreateInstance();
  currentState = MusicState.None;
}

private void PlayMusic()
{
  intro.Play();
  introProgress = TimeSpan.Zero;
  currentState = MusicState.Intro;
}

// Called every frame
private void Update(GameTime gameTime)
{
  if (currentState == MusicState.Intro)
  {
    introProgress += gameTime.ElapsedGameTime;

    if (introProgress.TotalMilliseconds >= intro.Duration.TotalMilliseconds * 0.97f)
    {
        loop.Play();
        currentState = MusicState.Loop;
    }
  }
}

I don’t know if waiting 97% of the total duration is enough for all musics, but it works as expected for my case.

1 Like