public override bool Equals(object obj)
        {
            if (!(obj is AudioSourceProperties))
            {
                return(false);
            }

            AudioSourceProperties other = (AudioSourceProperties)obj;

            return
                (other.bypassEffects == bypassEffects &&
                 other.bypassListenerEffects == bypassListenerEffects &&
                 other.bypassReverbZones == bypassReverbZones &&
                 other.clip == clip &&
                 other.dopplerLevel == dopplerLevel &&
                 other.enabled == enabled &&
                 other.ignoreListenerPause == ignoreListenerPause &&
                 other.ignoreListenerVolume == ignoreListenerVolume &&
                 other.loop == loop &&
                 other.maxDistance == maxDistance &&
                 other.minDistance == minDistance &&
                 other.mute == mute &&
                 other.outputAudioMixerGroup == outputAudioMixerGroup &&
                 other.panStereo == panStereo &&
                 other.pitch == pitch &&
                 other.priority == priority &&
                 other.reverbZoneMix == reverbZoneMix &&
                 other.rolloffMode == rolloffMode &&
                 other.spatialBlend == spatialBlend &&
                 other.spatialize == spatialize &&
                 other.spatializePostEffects == spatializePostEffects &&
                 other.spread == spread &&
                 other.velocityUpdateMode == velocityUpdateMode);
        }
        protected override ChangeType CalculateDeltaChanges()
        {
            ChangeType changeType = ChangeType.None;
            bool       isPlaying  = audioSource.isPlaying;

            if (isPlaying != this.previousIsPlaying)
            {
                previousIsPlaying = isPlaying;
                if (isPlaying)
                {
                    changeType = ChangeType.PlayStarted;
                }
                else
                {
                    changeType = ChangeType.PlayStopped;
                }
            }

            if (isPlaying)
            {
                AudioSourceProperties currentProperties = new AudioSourceProperties(this.audioSource);
                if (previousProperties != currentProperties)
                {
                    changeType        |= ChangeType.Properties;
                    previousProperties = currentProperties;
                }

                float newVolume = audioSource.volume;
                if (this.previousVolume != newVolume)
                {
                    changeType         |= ChangeType.Volume;
                    this.previousVolume = newVolume;
                }
            }

            return(changeType);
        }