/// <summary>
        /// Play the specified sound and follow a given target Transform while playing.
        /// Returns a reference to the SoundyController that is playing the sound.
        /// Returns null if no sound is found.
        /// </summary>
        /// <param name="databaseName"> The sound category </param>
        /// <param name="soundName"> Sound Name of the sound </param>
        /// <param name="followTarget"> The target transform that the sound will follow while playing </param>
        public static SoundyController Play(string databaseName, string soundName, Transform followTarget)
        {
            if (!s_initialized)
            {
                s_instance = Instance;
            }
            if (Database == null)
            {
                return(null);
            }
            if (soundName.Equals(NO_SOUND))
            {
                return(null);
            }
            SoundGroupData soundGroupData = Database.GetAudioData(databaseName, soundName);

            if (soundGroupData == null)
            {
                return(null);
            }
            if (Instance.DebugComponent)
            {
                DDebug.Log("Play '" + databaseName + "' / '" + soundName + "' SoundGroupData and follow the '" + followTarget.name + "' GameObject", Instance);
            }
            return(soundGroupData.Play(followTarget, Database.GetSoundDatabase(databaseName).OutputAudioMixerGroup));
        }
        /// <summary> Sorts the entire database by sound name </summary>
        /// <param name="performUndo"> Record changes? </param>
        /// <param name="saveAssets"> Write all unsaved asset changes to disk? </param>
        public void Sort(bool performUndo, bool saveAssets = false)
        {
            if (performUndo)
            {
                UndoRecord(UILabels.SortDatabase);
            }
            Database = Database.OrderBy(data => data.SoundName).ToList();

            //remove the 'No Sound' entry wherever it is
            SoundGroupData noSoundSoundGroupData = null;

            foreach (SoundGroupData audioData in Database)
            {
                if (!audioData.SoundName.Equals(SoundyManager.NO_SOUND))
                {
                    continue;
                }
                noSoundSoundGroupData = audioData;
                Database.Remove(audioData);
                break;
            }

            if (noSoundSoundGroupData != null)
            {
                Database.Insert(0, noSoundSoundGroupData);                                //insert back the 'No Sound' entry at the top
            }
            UpdateSoundNames(false);
            SetDirty(saveAssets);
        }
        /// <summary>
        /// Play the specified sound at the given position.
        /// Returns a reference to the SoundyController that is playing the sound.
        /// Returns null if no sound is found.
        /// </summary>
        /// <param name="databaseName"> The sound category </param>
        /// <param name="soundName"> Sound Name of the sound </param>
        /// <param name="position"> The position from where this sound will play from </param>
        public static SoundyController Play(string databaseName, string soundName, Vector3 position)
        {
            if (!s_initialized)
            {
                s_instance = Instance;
            }
            if (Database == null)
            {
                return(null);
            }
            if (soundName.Equals(NO_SOUND))
            {
                return(null);
            }
            SoundGroupData soundGroupData = Database.GetAudioData(databaseName, soundName);

            if (soundGroupData == null)
            {
                return(null);
            }
            if (Instance.DebugComponent)
            {
                DDebug.Log("Play '" + databaseName + "' / '" + soundName + "' SoundGroupData at " + position + " position", Instance);
            }
            return(soundGroupData.Play(position, Database.GetSoundDatabase(databaseName).OutputAudioMixerGroup));
        }
 /// <summary> Adds a new entry, a SoundGroupData, to the database. Returns TRUE if the operation was successful </summary>
 /// <param name="data"> SoundGroupData to add to the database </param>
 /// <param name="saveAssets"> Write all unsaved asset changes to disk? </param>
 public bool Add(SoundGroupData data, bool saveAssets)
 {
     if (data == null)
     {
         return(false);
     }
     data.DatabaseName = DatabaseName;
     AddObjectToAsset(data);
     SetDirty(saveAssets);
     return(true);
 }
        /// <summary> Iterates through the database to look for the data. If found, removes the entry and returns TRUE </summary>
        /// <param name="data"> SoundGroupData to search for </param>
        /// <param name="showDialog"> Should a display dialog be shown before executing the action </param>
        /// <param name="saveAssets"> Write all unsaved asset changes to disk? </param>
        public bool Remove(SoundGroupData data, bool showDialog = false, bool saveAssets = false)
        {
            if (data == null)
            {
                return(false);
            }
            if (!Contains(data))
            {
                return(false);
            }
#if UNITY_EDITOR
            if (showDialog)
            {
                if (!EditorUtility.DisplayDialog(UILabels.RemovedEntry + " '" + data.SoundName + "'",
                                                 UILabels.AreYouSureYouWantToRemoveTheEntry +
                                                 "\n\n" +
                                                 UILabels.OperationCannotBeUndone,
                                                 UILabels.Yes,
                                                 UILabels.No))
                {
                    return(false);
                }
            }
#endif

            for (int i = Database.Count - 1; i >= 0; i--)
            {
                if (Database[i] == data)
                {
                    if (data != null)
                    {
                        DestroyImmediate(data, true);
                    }
                    Database.RemoveAt(i);
                    break;
                }
            }

            UpdateSoundNames(false);
            SetDirty(saveAssets);

            return(true);
        }
        /// <summary> Removes any entries that have no AudioClip referenced </summary>
        /// <param name="performUndo"> Record changes? </param>
        /// <param name="saveAssets"> Write all unsaved asset changes to disk? </param>
        public void RemoveEntriesWithNoAudioClipsReferenced(bool performUndo, bool saveAssets = false)
        {
            if (performUndo)
            {
                UndoRecord(UILabels.RemovedEntry);
            }

            for (int i = Database.Count - 1; i >= 0; i--)
            {
                SoundGroupData data = Database[i];

                if (data.SoundName.Equals(SoundyManager.NO_SOUND))
                {
                    continue;
                }

                if (data.Sounds == null)
                {
                    Database.RemoveAt(i);
                    continue;
                }

                for (int j = data.Sounds.Count - 1; j >= 0; j--)
                {
                    if (data.Sounds[j] == null)
                    {
                        data.Sounds.RemoveAt(j);
                    }
                }

                if (data.Sounds.Count == 0)
                {
                    Database.RemoveAt(i);
                }
            }

            SetDirty(saveAssets);
        }
        /// <summary>
        /// Play the specified sound with the given category, name and type.
        /// Returns a reference to the SoundyController that is playing the sound.
        /// Returns null if no sound is found.
        /// </summary>
        /// <param name="databaseName"> The sound category </param>
        /// <param name="soundName"> Sound Name of the sound </param>
        public static SoundyController Play(string databaseName, string soundName)
        {
            if (!s_initialized)
            {
                s_instance = Instance;
            }
            if (Database == null)
            {
                return(null);
            }
            if (soundName.Equals(NO_SOUND))
            {
                return(null);
            }
            if (string.IsNullOrEmpty(databaseName) || string.IsNullOrEmpty(databaseName.Trim()))
            {
                return(null);
            }
            if (string.IsNullOrEmpty(soundName) || string.IsNullOrEmpty(soundName.Trim()))
            {
                return(null);
            }

            SoundDatabase soundDatabase = Database.GetSoundDatabase(databaseName);

            if (soundDatabase == null)
            {
                return(null);
            }
            SoundGroupData soundGroupData = soundDatabase.GetData(soundName);

            if (soundGroupData == null)
            {
                return(null);
            }
            return(soundGroupData.Play(Pooler.transform, soundDatabase.OutputAudioMixerGroup));
        }
 /// <summary> Returns TRUE if the SoundGroupData has been found in the database </summary>
 /// <param name="soundGroupData"> SoundGroupData to search for </param>
 public bool Contains(SoundGroupData soundGroupData)
 {
     return(soundGroupData != null && Database.Contains(soundGroupData));
 }