// play a track w/crossfade
 public void PlayMusicTrack(AudioTrackEnum trackId, bool loop = false)
 {
     if (Parameters.Tracks.Count > 0)
     {
         if (currentMusicPlayerId >= 0)
         {
             AudioSource actualPlayer = musicPlayers[currentMusicPlayerId].actualPlayer;
             if (actualPlayer.isPlaying)
             {
                 //Debug.Log("Stopping track " + currentTrack.ToString());
                 // stop the currently playing track
                 StartCoroutine(FadeMusicTrack(currentMusicPlayerId, false));
             }
         }
         //Debug.Log("Playing track " + trackId.ToString());
         if (MusicTracks.ContainsKey(trackId))
         {
             currentMusicPlayerId = (currentMusicPlayerId + 1) % musicPlayers.Length;
             currentTrack         = trackId;
             StartCoroutine(FadeMusicTrack(currentMusicPlayerId, true, loop));
         }
         else
         {
             GlobalManager.MInstantMessage.DeliverMessage(InstantMessageType.MusicTrackPlayed, this, trackId);
         }
     }
     else
     {
         GlobalManager.MInstantMessage.DeliverMessage(InstantMessageType.MusicTrackPlayed, this, trackId);
     }
 }
 void OnMusicTrackPlayed(object sender, InstantMessageArgs args)
 {
     if (musicMode == BackGroundMusicMode.All)
     {
         AudioTrackEnum trackId = (AudioTrackEnum)args.arg;
         if (trackId == currentTrack && currentTrack != AudioTrackEnum.Unknown)
         {
             PlayNextTrack();
         }
     }
 }
 protected override void AwakeInit()
 {
     currentTrack = AudioTrackEnum.Unknown;
     registrator.Add(
         new MessageRegistrationTuple {
         type = InstantMessageType.PlayMusicTrack, handler = OnPlayMusicTrack
     },
         new MessageRegistrationTuple {
         type = InstantMessageType.BackgroundMusic, handler = OnBackgroundMusic
     },
         new MessageRegistrationTuple {
         type = InstantMessageType.MusicTrackPlayed, handler = OnMusicTrackPlayed
     }
         );
 }
        public override void MakeInitial()
        {
            // public instance flag; it is false on start
            Initialized = Status.None;
            Parameters  = GetComponentInChildren <AudioManagerParams>();
            if (Parameters != null)
            {
                // set up music players
                musicPlayers = new MusicPlayer[Parameters.MaxAudioPlayers];
                for (int i = 0; i < musicPlayers.Length; i++)
                {
                    musicPlayers[i] = new MusicPlayer
                    {
                        actualPlayer = gameObject.AddComponent <AudioSource>(),
                        trackId      = AudioTrackEnum.Unknown,
                        subclip      = -1,
                        order        = -1
                    };
                    musicPlayers[i].actualPlayer.playOnAwake = false;
                    musicPlayers[i].actualPlayer.volume      = 0;
                }
                currentTrack         = AudioTrackEnum.Unknown;
                currentMusicPlayerId = -1;

                // set up SFX players
                sfxPlayers = new SFXPlayer[Parameters.MaxSFXPlayers];
                for (int i = 0; i < sfxPlayers.Length; i++)
                {
                    sfxPlayers[i] = new SFXPlayer
                    {
                        actualPlayer = gameObject.AddComponent <AudioSource>(),
                        clipId       = SFXEnum.Unknown
                    };
                    sfxPlayers[i].actualPlayer.playOnAwake = false;
                    sfxPlayers[i].actualPlayer.volume      = 0;
                }

                base.MakeInitial();
            }
            else
            {
                Debug.LogError("No AudioManagerParams component found in children!");
            }
        }
        void PlayNextTrack()
        {
            if (playList.Count > 0)
            {
                switch (musicMode)
                {
                case BackGroundMusicMode.Off:
                    currentTrack = AudioTrackEnum.Unknown;
                    GlobalManager.MAudio.PlayMusicTrack(currentTrack, false);       // just stop playing
                    break;

                case BackGroundMusicMode.One:
                    if (currentTrack == AudioTrackEnum.Unknown)
                    {
                        currentTrack = playList[Random.Range(0, playList.Count)];
                    }
                    //GlobalManager.MAudio.PlayMusicTrack(currentTrack, false);   // play the same track over and over again
                    GlobalManager.MAudio.PlayMusicTrack(currentTrack, true);        // play the same track over and over again
                    break;

                case BackGroundMusicMode.All:
                    // shuffle the original playlist but make sure each track is only played once
                    if (allPlayList == null)
                    {
                        allPlayList = new List <AudioTrackEnum>();
                    }
                    if (allPlayList.Count == 0)
                    {
                        foreach (AudioTrackEnum track in playList)
                        {
                            allPlayList.Add(track);
                        }
                    }
                    int trackIndex = Random.Range(0, allPlayList.Count);
                    currentTrack = allPlayList[trackIndex];
                    // remove the currently playing entry from the playlist
                    allPlayList.RemoveAt(trackIndex);
                    GlobalManager.MAudio.PlayMusicTrack(currentTrack, false);       // play a random track from the playlist
                    break;
                }
            }
        }