protected override void UnloadData()
        {
            base.UnloadData();

            if (m_recording)
            {
                StopRecording();
            }

            MyNetworkReader.ClearHandler(MyMultiplayer.VoiceChatChannel);

            foreach (var pair in m_voices)
            {
                m_voices[pair.Key].StopSound(true, true);
                m_voices[pair.Key].Cleanup();
            }

            m_compressedVoiceBuffer   = null;
            m_uncompressedVoiceBuffer = null;
            m_voiceChatLogic          = null;
            m_VoIP = null;
            Static = null;
            m_receivedVoiceData = null;
            m_voices            = null;
            m_keys = null;

            Sync.Players.PlayerRemoved        -= Players_PlayerRemoved;
            MyAudio.Static.VoiceChatEnabled   -= Static_VoiceChatEnabled;
            MyHud.VoiceChat.VisibilityChanged -= VoiceChat_VisibilityChanged;
        }
        public override void LoadData()
        {
            base.LoadData();

            Static                    = this;
            m_VoIP                    = new VoIP();
            m_voiceChatLogic          = Activator.CreateInstance(MyPerGameSettings.VoiceChatLogic) as IMyVoiceChatLogic;
            m_recording               = false;
            m_compressedVoiceBuffer   = new byte[COMPRESSED_SIZE];
            m_uncompressedVoiceBuffer = new byte[UNCOMPRESSED_SIZE];
            m_voices                  = new Dictionary <ulong, MyEntity3DSoundEmitter>();
            m_receivedVoiceData       = new Dictionary <ulong, ReceivedData>();
            m_keys                    = new List <ulong>();

            Sync.Players.PlayerRemoved += Players_PlayerRemoved;

            m_enabled = MyAudio.Static.EnableVoiceChat;
            MyAudio.Static.VoiceChatEnabled   += Static_VoiceChatEnabled;
            MyHud.VoiceChat.VisibilityChanged += VoiceChat_VisibilityChanged;
        }
        public override void LoadData()
        {
            base.LoadData();

            Static = this;
            m_VoIP = new VoIP();
            m_voiceChatLogic = Activator.CreateInstance(MyPerGameSettings.VoiceChatLogic) as IMyVoiceChatLogic;
            m_recording = false;
            m_compressedVoiceBuffer = new byte[COMPRESSED_SIZE];
            m_uncompressedVoiceBuffer = new byte[UNCOMPRESSED_SIZE];
            m_voices = new Dictionary<ulong, MyEntity3DSoundEmitter>();
            m_receivedVoiceData = new Dictionary<ulong, ReceivedData>();
            m_keys = new List<ulong>();

            Sync.Players.PlayerRemoved += Players_PlayerRemoved;

            m_enabled = MyAudio.Static.EnableVoiceChat;
            MyAudio.Static.VoiceChatEnabled += Static_VoiceChatEnabled;
            MyHud.VoiceChat.VisibilityChanged += VoiceChat_VisibilityChanged;

            MyNetworkReader.SetHandler(MyMultiplayer.VoiceChatChannel, VoiceMessageReceived);
        }
        protected override void UnloadData()
        {
            base.UnloadData();

            if (m_recording)
                StopRecording();

            MyNetworkReader.ClearHandler(MyMultiplayer.VoiceChatChannel);

            foreach (var pair in m_voices)
            {
                m_voices[pair.Key].StopSound(true, true);
                m_voices[pair.Key].Cleanup();
            }

            m_compressedVoiceBuffer = null;
            m_uncompressedVoiceBuffer = null;
            m_voiceChatLogic = null;
            m_VoIP = null;
            Static = null;
            m_receivedVoiceData = null;
            m_voices = null;
            m_keys = null;

            Sync.Players.PlayerRemoved -= Players_PlayerRemoved;
            MyAudio.Static.VoiceChatEnabled -= Static_VoiceChatEnabled;
            MyHud.VoiceChat.VisibilityChanged -= VoiceChat_VisibilityChanged;
        }