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.