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
            }
        }
Esempio n. 3
0
        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;
        }