private void MaybeUnloadClip() { VarAudio.Stop(); VarAudio.time = 0f; switch (audLocation) { case MasterAudio.AudioLocation.ResourceFile: AudioResourceOptimizer.UnloadClipIfUnused(_resFileName); break; case MasterAudio.AudioLocation.Clip: AudioUtil.UnloadNonPreloadedAudioData(VarAudio.clip, GameObj); break; #if ADDRESSABLES_ENABLED case MasterAudio.AudioLocation.Addressable: VarAudio.clip = null; // must clear out clip so it can be released below. AudioAddressableOptimizer.RemoveAddressablePlayingClip(audioClipAddressable, VarAudio, _isWarmingPlay); break; #endif } LoadStatus = MasterAudio.VariationLoadStatus.None; }
/*! \cond PRIVATE */ /// <summary> /// Never call this method. Used internally. /// </summary> /// <param name="pitch">Pitch.</param> /// <param name="maxVolume">Max volume.</param> /// <param name="gameObjectName">Game object name.</param> /// <param name="volPercent">Vol percent.</param> /// <param name="targetVol">Target vol.</param> /// <param name="targetPitch">Target pitch.</param> /// <param name="sourceTrans">Source trans.</param> /// <param name="attach">If set to <c>true</c> attach.</param> /// <param name="delayTime">Delay time.</param> /// <param name="timeToSchedulePlay"><b>Optional</b> - used to pass in the DSP time to play the sound. Play now if null.</param> /// <param name="isChaining">If set to <c>true</c> is chaining.</param> /// <param name="isSingleSubscribedPlay">If set to <c>true</c> is single subscribed play.</param> public void Play(float?pitch, float maxVolume, string gameObjectName, float volPercent, float targetVol, float?targetPitch, Transform sourceTrans, bool attach, float delayTime, double?timeToSchedulePlay, bool isChaining, bool isSingleSubscribedPlay) { LoadStatus = MasterAudio.VariationLoadStatus.None; _isStopRequested = false; _isWarmingPlay = MasterAudio.IsWarming; MaybeCleanupFinishedDelegate(); _hasStartedEndLinkedGroups = false; _isPaused = false; SetPlaySoundParams(gameObjectName, volPercent, targetVol, targetPitch, sourceTrans, attach, delayTime, timeToSchedulePlay, isChaining, isSingleSubscribedPlay); SetPriority(); // reset it back to normal priority in case you're playing 2D this time. // compute pitch if (pitch.HasValue) { VarAudio.pitch = pitch.Value; } else if (useRandomPitch) { var randPitch = Random.Range(randomPitchMin, randomPitchMax); switch (randomPitchMode) { case RandomPitchMode.AddToClipPitch: randPitch += OriginalPitch; break; } VarAudio.pitch = randPitch; } else { // non random pitch VarAudio.pitch = OriginalPitch; } // in case it was changed at runtime. SetSpatialBlend(); // set fade mode curFadeMode = FadeMode.None; curPitchMode = PitchMode.None; curDetectEndMode = DetectEndMode.DetectEnd; _maxVol = maxVolume; if (maxCustomLoops == minCustomLoops) { _maxLoops = minCustomLoops; } else { _maxLoops = Random.Range(minCustomLoops, maxCustomLoops + 1); } LoadStatus = MasterAudio.VariationLoadStatus.Loading; switch (audLocation) { case MasterAudio.AudioLocation.Clip: FinishSetupToPlay(); return; case MasterAudio.AudioLocation.ResourceFile: if (_loadResourceFileCoroutine != null) { StopCoroutine(_loadResourceFileCoroutine); } _loadResourceFileCoroutine = StartCoroutine(AudioResourceOptimizer.PopulateSourcesWithResourceClipAsync(ResFileName, this, FinishSetupToPlay, ResourceFailedToLoad)); return; #if ADDRESSABLES_ENABLED case MasterAudio.AudioLocation.Addressable: if (_loadAddressableCoroutine != null) { StopCoroutine(_loadAddressableCoroutine); } _loadAddressableCoroutine = StartCoroutine(AudioAddressableOptimizer.PopulateSourceWithAddressableClipAsync(audioClipAddressable, this, ParentGroup.AddressableUnusedSecondsLifespan, FinishSetupToPlay, ResourceFailedToLoad)); return; #endif } }
private void PlaySoundAndWait() { if (VarAudio.clip == null) // in case the warming sound is an "internet file" { return; } double startTime = AudioSettings.dspTime; if (GrpVariation.PlaySoundParm.TimeToSchedulePlay.HasValue) { startTime = GrpVariation.PlaySoundParm.TimeToSchedulePlay.Value; } var delayTime = 0f; if (GrpVariation.useIntroSilence && GrpVariation.introSilenceMax > 0f) { var rndSilence = Random.Range(GrpVariation.introSilenceMin, GrpVariation.introSilenceMax); delayTime += rndSilence; } delayTime += GrpVariation.PlaySoundParm.DelaySoundTime; if (delayTime > 0f) { startTime += delayTime; } VarAudio.PlayScheduled(startTime); switch (GrpVariation.audLocation) { #if ADDRESSABLES_ENABLED case MasterAudio.AudioLocation.Addressable: AudioAddressableOptimizer.AddAddressablePlayingClip(GrpVariation.audioClipAddressable, VarAudio); break; #endif default: AudioUtil.ClipPlayed(VarAudio.clip, GrpVariation.GameObj); break; } if (GrpVariation.useRandomStartTime) { VarAudio.time = ClipStartPosition; if (!VarAudio.loop) // don't stop it if it's going to loop. { var playableLength = AudioUtil.AdjustAudioClipDurationForPitch(ClipEndPosition - ClipStartPosition, VarAudio); _clipSchedEndTime = startTime + playableLength; VarAudio.SetScheduledEndTime(_clipSchedEndTime.Value); } } GrpVariation.LastTimePlayed = AudioUtil.Time; DuckIfNotSilent(); _isPlayingBackward = GrpVariation.OriginalPitch < 0; _lastFrameClipTime = _isPlayingBackward ? ClipEndPosition + 1 : -1f; _waitMode = WaitForSoundFinishMode.WaitForEnd; }