/// <summary> /// This method allows you to pause the audio being played by this Variation. This is automatically called by MasterAudio.PauseSoundGroup and MasterAudio.PauseBus. /// </summary> public void Pause() { if (!MasterAudio.Instance.resourceClipsPauseDoNotUnload) { switch (audLocation) { case MasterAudio.AudioLocation.ResourceFile: Stop(); return; case MasterAudio.AudioLocation.Clip: if (!AudioUtil.AudioClipWillPreload(VarAudio.clip)) { Stop(); return; } break; } } VarAudio.Pause(); curFadeMode = FadeMode.None; // 12/26/2016 found the below code to actually mess things up. Taking it out unless we find something it's needed for later. //if (VariationUpdater != null) { // VariationUpdater.StopWaitingForFinish(); // necessary so that the clip can be unpaused. //} }
public static IEnumerator PopulateResourceSongToPlaylistControllerAsync(string songResourceName, string playlistName, PlaylistController controller, PlaylistController.AudioPlayType playType) { var asyncRes = Resources.LoadAsync(songResourceName, typeof(AudioClip)); while (!asyncRes.isDone) { yield return(MasterAudio.EndOfFrameDelay); } var resAudioClip = asyncRes.asset as AudioClip; if (resAudioClip == null) { MasterAudio.LogWarning("Resource file '" + songResourceName + "' could not be located from Playlist '" + playlistName + "'."); yield break; } if (!AudioUtil.AudioClipWillPreload(resAudioClip)) { MasterAudio.LogWarning("Audio Clip for Resource file '" + songResourceName + "' from Playlist '" + playlistName + "' has 'Preload Audio Data' turned off, which can cause audio glitches. Resource files should always Preload Audio Data. Please turn it on."); } FinishRecordingPlaylistClip(controller.ControllerName, resAudioClip); controller.FinishLoadingNewSong(resAudioClip, playType); }
/// <summary> /// This method allows you to pause the audio being played by this Variation. This is automatically called by MasterAudio.PauseSoundGroup and MasterAudio.PauseBus. /// </summary> public void Pause() { if (!MasterAudio.Instance.resourceClipsPauseDoNotUnload) { switch (audLocation) { case MasterAudio.AudioLocation.ResourceFile: Stop(); return; case MasterAudio.AudioLocation.Clip: if (!AudioUtil.AudioClipWillPreload(VarAudio.clip)) { Stop(); return; } break; } } _isPaused = true; VarAudio.Pause(); if (VariationUpdater.enabled) { VariationUpdater.Pause(); } curFadeMode = FadeMode.None; curPitchMode = PitchMode.None; }
public static AudioClip PopulateResourceSongToPlaylistController(string controllerName, string songResourceName, string playlistName) { var resAudioClip = Resources.Load(songResourceName) as AudioClip; if (resAudioClip == null) { MasterAudio.LogWarning("Resource file '" + songResourceName + "' could not be located from Playlist '" + playlistName + "'."); return(null); } if (!AudioUtil.AudioClipWillPreload(resAudioClip)) { MasterAudio.LogWarning("Audio Clip for Resource file '" + songResourceName + "' from Playlist '" + playlistName + "' has 'Preload Audio Data' turned off, which can cause audio glitches. Resource files should always Preload Audio Data. Please turn it on."); } FinishRecordingPlaylistClip(controllerName, resAudioClip); return(resAudioClip); }
/// <summary> /// Populates the sources with resource clip. /// </summary> /// <returns><c>true</c>, if sources with resource clip was populated, <c>false</c> otherwise.</returns> /// <param name="clipName">Clip name.</param> /// <param name="variation">Variation.</param> public static bool PopulateSourcesWithResourceClip(string clipName, SoundGroupVariation variation) { if (AudioClipsByName.ContainsKey(clipName)) { //MasterAudio.Log("clip already exists: " + clipName); return(true); // work is done already! } var resAudioClip = Resources.Load(clipName) as AudioClip; if (resAudioClip == null) { MasterAudio.LogError("Resource file '" + clipName + "' could not be located."); return(false); } if (!AudioResourceTargetsByName.ContainsKey(clipName)) { MasterAudio.LogError("No Audio Sources found to add Resource file '" + clipName + "'."); return(false); } var sources = AudioResourceTargetsByName[clipName]; // ReSharper disable once ForCanBeConvertedToForeach for (var i = 0; i < sources.Count; i++) { sources[i].clip = resAudioClip; } if (!AudioUtil.AudioClipWillPreload(resAudioClip)) { MasterAudio.LogWarning("Audio Clip for Resource file '" + clipName + "' of Sound Group '" + variation.ParentGroup.name + "' has 'Preload Audio Data' turned off, which can cause audio glitches. Resource files should always Preload Audio Data. Please turn it on."); } AudioClipsByName.Add(clipName, resAudioClip); return(true); }
/// <summary> /// Populates the sources with resource clip, non-thread blocking. /// </summary> /// <param name="clipName">Clip name.</param> /// <param name="variation">Variation.</param> /// <param name="successAction">Method to execute if successful.</param> /// <param name="failureAction">Method to execute if not successful.</param> public static IEnumerator PopulateSourcesWithResourceClipAsync(string clipName, SoundGroupVariation variation, // ReSharper disable RedundantNameQualifier System.Action successAction, System.Action failureAction) { // ReSharper restore RedundantNameQualifier if (AudioClipsByName.ContainsKey(clipName)) { if (successAction != null) { successAction(); } yield break; } var asyncRes = Resources.LoadAsync(clipName, typeof(AudioClip)); while (!asyncRes.isDone) { yield return(MasterAudio.EndOfFrameDelay); } var resAudioClip = asyncRes.asset as AudioClip; if (resAudioClip == null) { MasterAudio.LogError("Resource file '" + clipName + "' could not be located."); if (failureAction != null) { failureAction(); } yield break; } if (!AudioResourceTargetsByName.ContainsKey(clipName)) { MasterAudio.LogError("No Audio Sources found to add Resource file '" + clipName + "'."); if (failureAction != null) { failureAction(); } yield break; } if (!AudioUtil.AudioClipWillPreload(resAudioClip)) { MasterAudio.LogWarning("Audio Clip for Resource file '" + clipName + "' of Sound Group '" + variation.ParentGroup.name + "' has 'Preload Audio Data' turned off, which can cause audio glitches. Resource files should always Preload Audio Data. Please turn it on."); } var sources = AudioResourceTargetsByName[clipName]; // ReSharper disable once ForCanBeConvertedToForeach for (var i = 0; i < sources.Count; i++) { sources[i].clip = resAudioClip; } if (!AudioClipsByName.ContainsKey(clipName)) { AudioClipsByName.Add(clipName, resAudioClip); } if (successAction != null) { successAction(); } }
private static readonly object _syncRoot = new object(); // to lock below /// <summary> /// Start Coroutine when calling this, passing in success and failure action delegates. /// </summary> /// <param name="addressable"></param> /// <param name="variation"></param> /// <param name="successAction"></param> /// <param name="failureAction"></param> /// <returns></returns> public static IEnumerator PopulateSourceWithAddressableClipAsync(AssetReference addressable, SoundGroupVariation variation, int unusedSecondsLifespan, System.Action successAction, System.Action failureAction) { var isWarmingCall = MasterAudio.IsWarming; // since this may change by the time we load the asset, we store it so we can know. if (!IsAddressableValid(addressable)) { if (failureAction != null) { failureAction(); } if (isWarmingCall) { DTMonoHelper.SetActive(variation.GameObj, false); // should disable itself } yield break; } var addressableId = GetAddressableId(addressable); AsyncOperationHandle <AudioClip> loadHandle; AudioClip addressableClip; var shouldReleaseLoadedAssetNow = false; if (AddressableTasksByAddressibleId.ContainsKey(addressableId)) { loadHandle = AddressableTasksByAddressibleId[addressableId].AssetHandle; addressableClip = loadHandle.Result; } else { loadHandle = addressable.LoadAssetAsync <AudioClip>(); while (!loadHandle.IsDone) { yield return(MasterAudio.EndOfFrameDelay); } addressableClip = loadHandle.Result; if (addressableClip == null || loadHandle.Status != AsyncOperationStatus.Succeeded) { var errorText = ""; if (loadHandle.OperationException != null) { errorText = " Exception: " + loadHandle.OperationException.Message; } MasterAudio.LogError("Addressable file for '" + variation.name + "' could not be located." + errorText); if (failureAction != null) { failureAction(); } if (isWarmingCall) { DTMonoHelper.SetActive(variation.GameObj, false); // should disable itself } yield break; } lock (_syncRoot) { if (!AddressableTasksByAddressibleId.ContainsKey(addressableId)) { AddressableTasksByAddressibleId.Add(addressableId, new AddressableTracker <AudioClip>(loadHandle, unusedSecondsLifespan)); } else { // race condition reached. Another load finished before this one. Throw this away and use the other, to release memory. shouldReleaseLoadedAssetNow = true; addressableClip = AddressableTasksByAddressibleId[addressableId].AssetHandle.Result; } } } if (shouldReleaseLoadedAssetNow) { Addressables.Release(loadHandle); } if (!AudioUtil.AudioClipWillPreload(addressableClip)) { MasterAudio.LogWarning("Audio Clip for Addressable file '" + addressableClip.name + "' of Sound Group '" + variation.ParentGroup.name + "' has 'Preload Audio Data' turned off, which can cause audio glitches. Addressables should always Preload Audio Data. Please turn it on."); } variation.LoadStatus = MasterAudio.VariationLoadStatus.Loaded; var stoppedBeforePlay = variation.IsStopRequested; if (stoppedBeforePlay) { // do nothing, but don't call the delegate or set audio clip for sure! } else { variation.VarAudio.clip = addressableClip; if (successAction != null) { successAction(); } } }
public static IEnumerator PopulateAddressableSongToPlaylistControllerAsync(MusicSetting setting, AssetReference addressable, PlaylistController playlistController, PlaylistController.AudioPlayType playType) { if (!IsAddressableValid(addressable)) { yield break; } var addressableId = GetAddressableId(addressable); AsyncOperationHandle <AudioClip> loadHandle; AudioClip addressableClip; var shouldReleaseLoadedAssetNow = false; if (AddressableTasksByAddressibleId.ContainsKey(addressableId)) { loadHandle = AddressableTasksByAddressibleId[addressableId].AssetHandle; addressableClip = loadHandle.Result; } else { loadHandle = addressable.LoadAssetAsync <AudioClip>(); while (!loadHandle.IsDone) { yield return(MasterAudio.EndOfFrameDelay); } addressableClip = loadHandle.Result; if (addressableClip == null || loadHandle.Status != AsyncOperationStatus.Succeeded) { var errorText = ""; if (loadHandle.OperationException != null) { errorText = " Exception: " + loadHandle.OperationException.Message; } MasterAudio.LogError("Addressable file for PlaylistController '" + playlistController.name + "' could not be located." + errorText); yield break; } lock (_syncRoot) { if (!AddressableTasksByAddressibleId.ContainsKey(addressableId)) { AddressableTasksByAddressibleId.Add(addressableId, new AddressableTracker <AudioClip>(loadHandle, 0)); } else { // race condition reached. Another load finished before this one. Throw this away and use the other, to release memory. shouldReleaseLoadedAssetNow = true; addressableClip = AddressableTasksByAddressibleId[addressableId].AssetHandle.Result; } } } if (shouldReleaseLoadedAssetNow) { Addressables.Release(loadHandle); } if (!AudioUtil.AudioClipWillPreload(addressableClip)) { MasterAudio.LogWarning("Audio Clip for Addressable file '" + addressableClip.name + "' of Playlist Controller '" + playlistController.name + "' has 'Preload Audio Data' turned off, which can cause audio glitches. Addressables should always Preload Audio Data. Please turn it on."); } // Figure out how to detect stop before loaded, if needed var stoppedBeforePlay = false; if (stoppedBeforePlay) { // do nothing, but don't call the delegate or set audio clip for sure! } else { playlistController.FinishLoadingNewSong(setting, addressableClip, playType); } }