public void MountAudio(IAudio audio)
        {
            if (isDisposed)
            {
                throw new ObjectDisposedException(GetType().Name);
            }

            // Unmount audio.
            if (audio == null)
            {
                this.audio  = null;
                source.clip = null;
                return;
            }

            // Check if compatible type with this controller.
            if (!(audio is UnityAudio newAudio))
            {
                throw new ArgumentException($"Specified audio is not a type of ({nameof(UnityAudio)}). Given type: {audio.GetType().Name}");
            }

            // Mount the audio.
            this.audio  = newAudio;
            source.clip = newAudio.Clip;
            InvokeMounted(audio);
        }
        protected virtual void DisposeInternal()
        {
            source.clip = null;
            UnityEngine.Object.Destroy(source);
            source = null;

            audio = null;

            enabled = false;
        }