internal DiscordVoiceClient(DiscordClient pclient, DiscordVoiceChannel pchannel, DiscordVoiceCallback callback)
        {
            parent        = pclient;
            channel       = pchannel;
            startcallback = callback;
            users         = new Dictionary <DiscordUser, uint>();

            try
            {
                if (channel.ID != null)
                {
                    if (channel.bitrate > 0)
                    {
                        encoder = new OpusEncoder(48000, 1, 20, (channel.bitrate / 1000), OpusApplication.MusicOrMixed);
                    }

                    else
                    {
                        encoder = new OpusEncoder(48000, 1, 20, null, OpusApplication.MusicOrMixed);
                    }

                    encoder.SetForwardErrorCorrection(true);
                    decoder = new OpusDecoder(48000, 1, 20);
                }
            }

            catch (Exception e)
            {
                Debug.LogError(e.Message);
                Debug.LogError(e.StackTrace);
                Debug.LogError(e.Source);
            }
        }
        /// <summary> Stops this voiceclient. </summary>
        public void Stop(DiscordVoiceCallback callback)
        {
            PayloadArgs <VoiceDisconnectArgs> args = new PayloadArgs <VoiceDisconnectArgs>()
            {
                op = 4,
                d  = new VoiceDisconnectArgs()
                {
                    guild_id   = channel.serverID,
                    channel_id = null,
                    self_mute  = false,
                    self_deaf  = false
                }
            };

            parent.socket.Send(JsonUtility.ToJson(args));
            parent.unityInvoker.Enqueue(() => callback(parent, this, new DiscordError()));
            socket.CloseAsync();
            parent.voiceClients.Remove(channel.serverID);
        }