コード例 #1
0
 // Token: 0x06003719 RID: 14105 RVA: 0x0011A360 File Offset: 0x00118760
 private void Update()
 {
     if (!this.audioSource)
     {
         return;
     }
     if (!this.isPlaying && this.audioSource.isPlaying)
     {
         if (!OSPManager.IsInitialized())
         {
             return;
         }
         this.Acquire();
         this.SetRelativeSoundPos(true);
         lock (this)
         {
             this.isPlaying = true;
         }
         this.drain = false;
     }
     if (this.isPlaying)
     {
         if (!this.audioSource.isPlaying)
         {
             lock (this)
             {
                 this.isPlaying = false;
             }
             this.Release();
             return;
         }
         if (this.Bypass || OSPManager.GetBypass())
         {
             this.audioSource.spatialBlend = this.panLevel;
             this.audioSource.spread       = this.spread;
         }
         else
         {
             float spatialBlend = 1f;
             if (OSPManager.GetUseInverseSquareAttenuation() || this.useInverseSquare)
             {
                 spatialBlend = 0f;
             }
             this.audioSource.spatialBlend = spatialBlend;
             this.audioSource.spread       = 180f;
         }
         if (this.context != -1)
         {
             OSPManager.SetDisableReflectionsOnSound(this.context, this.disableReflections);
         }
         if (this.audioSource.time == 0f && this.audioSource.loop)
         {
             this.SetRelativeSoundPos(false);
         }
         else if (this.audioSource.time >= this.audioSource.clip.length && !this.audioSource.loop)
         {
             this.drainTime = OSPManager.GetDrainTime(this.context);
             this.drain     = true;
         }
         else
         {
             this.SetRelativeSoundPos(false);
         }
         if (this.drain)
         {
             this.drainTime -= Time.deltaTime;
             if (this.drainTime < 0f)
             {
                 this.drain = false;
                 lock (this)
                 {
                     this.isPlaying = false;
                 }
                 this.Stop();
             }
         }
     }
 }
コード例 #2
0
    /// <summary>
    /// Update this instance.
    /// </summary>
    void Update()
    {
        if (!audioSource)
        {
            return;
        }

        // If user called Play on the acutal AudioSource, account for this
        // NOTE: There may be a potential issue with calling AudioSource.Stop on a
        // looping sound, since the Update may not catch this. We might need to catch
        // this edge case at some point; a one-shot sound will stop automatically and
        // return spatialization resources.
        if ((isPlaying == false) && (audioSource.isPlaying))
        {
            // This is a copy of OSPAudioSource Play function, minus
            // calling Play on audio source since it's already been called

            // Bail if manager has not even started
            if (OSPManager.IsInitialized() == false)
            {
                return;
            }

            // We will grab a context at this point, and set the right values
            // to allow for spatialization to take effect
            Aquire();

            // We will set the relative position of this sound now before we start playing
            SetRelativeSoundPos(true);

            // We are ready to play the sound
            // Commented out, kept for readability
            // audioSource.Play();

            lock (this) isPlaying = true;
        }

        // If sound is playing on it's own and dies off, we need to
        // Reset
        if (isPlaying == true)
        {
            // If we stopped the sound using AudioSource, Release resources
            if (audioSource.isPlaying == false)
            {
                lock (this) isPlaying = false;
                Release();
                return;
            }

            // We will go back and forth between spatial processing
            // and native 2D panning
            if ((Bypass == true) || (OSPManager.GetBypass() == true))
            {
#if (!UNITY5)
                audioSource.spatialBlend = panLevel;
#else
                audioSource.spatialBlend = panLevel;
#endif
                audioSource.spread = spread;
            }
            else
            {
                // We want to remove FMod curve attenuation if we are doing our
                // own internal calc
                float pl = sSetPanLevel;
                if (OSPManager.GetUseInverseSquareAttenuation() == true)
                {
                    pl = sSetPanLevelInvSq;
                }
#if (!UNITY5)
                audioSource.spatialBlend = pl;
#else
                audioSource.spatialBlend = pl;
#endif
                audioSource.spread = sSetSpread;
            }

            // Update FrequencyHints and local reflection enable/disable
            if (context != sNoContext)
            {
                OSPManager.SetFrequencyHint(context, frequencyHint);
                OSPManager.SetDisableReflectionsOnSound(context, disableReflections);
            }

            // return the context when the sound has finished playing
            if ((audioSource.time >= audioSource.clip.length) && (audioSource.loop == false))
            {
                // One last pass to allow for the tail portion of the sound
                // to finish
                drainTime = OSPManager.GetDrainTime(context);
                drain     = true;
            }
            else
            {
                // We must set all positional properties here, not in
                // OnAudioFilterRead. We might consider a better approach
                // to interpolate the current location for better localization,
                // should the resolution of setting it here sound jittery due
                // to thread frequency mismatch.
                SetRelativeSoundPos(false);

#if DEBUG_AudioSource
                // Time main thread and audio thread
                if (debugOn)
                {
                    // Get audio frequency
                    if (audioFrames == 0)
                    {
                        float ct = 1.0f / (GetTime(false) - dTimeMainLoop);
                        Debug.LogWarning(System.String.Format("U: {0:F0}", ct));
                        ct = 100.0f / (GetTime(true) - PrevAudioTime);
                        Debug.LogWarning(System.String.Format("A: {0:F0}", ct));
                        audioFrames   = 100;
                        PrevAudioTime = (float)GetTime(true);
                    }

                    dTimeMainLoop = (float)GetTime(false);
                }
#endif
            }

            if (drain == true)
            {
                // Keep playing until we safely drain out the early reflections
                drainTime -= Time.deltaTime;
                if (drainTime < 0.0f)
                {
                    drain = false;

                    lock (this) isPlaying = false;
                    // Stop will both stop audio from playing (keeping OnAudioFilterRead from
                    // running with a held audio source) as well as release the spatialization
                    // resources via Release()
                    Stop();
                }
            }
        }
    }