Track CloneToFadeOutTrack(Track track, int fadeDelay)
{
Track fadeTrack;
// Debug.WriteLine("cloneToFadeOutTrack(soundId:{0}, fade:{1}) - begin of func", track.TrackId, fadeDelay);
if (track.ToBeRemoved)
{
// Console.Error.WriteLine("cloneToFadeOutTrack: Tried to clone a track to be removed, please bug report");
return(null);
}
Debug.Assert(track.TrackId < MaxDigitalTracks);
fadeTrack = _track[track.TrackId + MaxDigitalTracks];
if (fadeTrack.Used)
{
// Debug.WriteLine("cloneToFadeOutTrack: No free fade track, force flush fade soundId:{0}", fadeTrack.SoundId);
FlushTrack(fadeTrack);
_mixer.StopHandle(fadeTrack.MixChanHandle);
}
// Clone the settings of the given track
fadeTrack = track.Clone();
_track[track.TrackId + MaxDigitalTracks] = fadeTrack;
fadeTrack.TrackId = track.TrackId + MaxDigitalTracks;
// Clone the sound.
// leaving bug number for now #1635361
var soundDesc = _sound.CloneSound(track.SoundDesc);
if (soundDesc == null)
{
// it fail load open old song after switch to diffrent CDs
// so gave up
// Console.Error.WriteLine("Game not supported while playing on 2 diffrent CDs");
}
track.SoundDesc = soundDesc;
// Set the volume fading parameters to indicate a fade out
fadeTrack.VolFadeDelay = fadeDelay;
fadeTrack.VolFadeDest = 0;
fadeTrack.VolFadeStep = (fadeTrack.VolFadeDest - fadeTrack.vol) * 60 * (1000 / _callbackFps) / (1000 * fadeDelay);
fadeTrack.VolFadeUsed = true;
// Create an appendable output buffer
fadeTrack.Stream = new QueuingAudioStream(_sound.GetFreq(fadeTrack.SoundDesc), track.MixerFlags.HasFlag(AudioFlags.Stereo));
fadeTrack.MixChanHandle = _mixer.PlayStream(track.GetSoundType(), fadeTrack.Stream, -1, fadeTrack.Volume, fadeTrack.Pan,
true, false, track.MixerFlags.HasFlag(AudioFlags.Stereo));
fadeTrack.Used = true;
// Debug.WriteLine("CloneToFadeOutTrack() - end of func, soundId {0}, fade soundId {1}", track.SoundId, fadeTrack.SoundId);
return(fadeTrack);
}