Browse Source

some style updates

replaced the speaking when joining with an actual client_connect event
pull/101/head
Dan 7 years ago
parent
commit
2989a2cec6
  1. 2
      disco/gateway/packets.py
  2. 14
      disco/voice/client.py
  3. 2
      disco/voice/packets.py
  4. 29
      disco/voice/udp.py

2
disco/gateway/packets.py

@ -16,5 +16,5 @@ OPCode = Enum(
INVALID_SESSION=9, INVALID_SESSION=9,
HELLO=10, HELLO=10,
HEARTBEAT_ACK=11, HEARTBEAT_ACK=11,
GUILD_SYNC=12 GUILD_SYNC=12,
) )

14
disco/voice/client.py

@ -33,6 +33,7 @@ VoiceState = Enum(
VOICE_CONNECTED=8, VOICE_CONNECTED=8,
) )
class VoiceSpeaking(namedtuple('VoiceSpeaking', ['user_id', 'speaking', 'soundshare'])): class VoiceSpeaking(namedtuple('VoiceSpeaking', ['user_id', 'speaking', 'soundshare'])):
""" """
Voice Speaking Event Voice Speaking Event
@ -46,6 +47,7 @@ class VoiceSpeaking(namedtuple('VoiceSpeaking', ['user_id', 'speaking', 'soundsh
if they are using soundshare if they are using soundshare
""" """
class VoiceException(Exception): class VoiceException(Exception):
def __init__(self, msg, client): def __init__(self, msg, client):
self.voice_client = client self.voice_client = client
@ -164,7 +166,7 @@ class VoiceClient(LoggingClass):
def on_voice_hello(self, data): def on_voice_hello(self, data):
self.log.info('[%s] Recieved Voice HELLO payload, starting heartbeater', self) self.log.info('[%s] Recieved Voice HELLO payload, starting heartbeater', self)
self._heartbeat_task = gevent.spawn(self._heartbeat, data['heartbeat_interval'] * 0.75) self._heartbeat_task = gevent.spawn(self._heartbeat, data['heartbeat_interval'])
self.set_state(VoiceState.AUTHENTICATED) self.set_state(VoiceState.AUTHENTICATED)
def on_voice_ready(self, data): def on_voice_ready(self, data):
@ -214,6 +216,11 @@ class VoiceClient(LoggingClass):
}, },
'codecs': codecs 'codecs': codecs
}) })
self.send(VoiceOPCode.CLIENT_CONNECT, {
'audio_ssrc': self.ssrc,
'video_ssrc': 0,
'rtx_ssrc': 0
})
def on_voice_resumed(self, data): def on_voice_resumed(self, data):
self.log.info('[%s] Recieved resumed', self) self.log.info('[%s] Recieved resumed', self)
@ -230,11 +237,6 @@ class VoiceClient(LoggingClass):
# Create a secret box for encryption/decryption # Create a secret box for encryption/decryption
self.udp.setup_encryption(bytes(bytearray(sdp['secret_key']))) self.udp.setup_encryption(bytes(bytearray(sdp['secret_key'])))
# Toggle speaking state so clients learn of our SSRC
self.set_speaking(True)
self.set_speaking(False)
gevent.sleep(0.25)
self.set_state(VoiceState.CONNECTED) self.set_state(VoiceState.CONNECTED)
def on_voice_server_update(self, data): def on_voice_server_update(self, data):

2
disco/voice/packets.py

@ -13,5 +13,5 @@ VoiceOPCode = Enum(
RESUMED=9, RESUMED=9,
CLIENT_CONNECT=12, CLIENT_CONNECT=12,
CLIENT_DISCONNECT=13, CLIENT_DISCONNECT=13,
CODECS=14 CODECS=14,
) )

29
disco/voice/udp.py

@ -22,6 +22,7 @@ MAX_SEQUENCE = 65535
RTP_HEADER_ONE_BYTE = (0xBE, 0xDE) RTP_HEADER_ONE_BYTE = (0xBE, 0xDE)
class RTPHeader(namedtuple('RTPHeader', ['version', 'padding', 'extension', 'csrc_count', 'marker', 'payload_type', 'sequence', 'timestamp', 'ssrc'])): class RTPHeader(namedtuple('RTPHeader', ['version', 'padding', 'extension', 'csrc_count', 'marker', 'payload_type', 'sequence', 'timestamp', 'ssrc'])):
""" """
RTP Packet's Header information RTP Packet's Header information
@ -46,7 +47,8 @@ class RTPHeader(namedtuple('RTPHeader', ['version', 'padding', 'extension', 'csr
RTP packet's SSRC, the person talking RTP packet's SSRC, the person talking
""" """
class VoiceData(namedtuple('VoiceData', ['data', 'user_id', 'rtp', 'codec', 'channel'])):
class VoiceData(namedtuple('VoiceData', ['data', 'user_id', 'payload_type', 'channel', 'rtp'])):
""" """
Voice Data received from the UDP socket Voice Data received from the UDP socket
Attributes Attributes
@ -55,12 +57,14 @@ class VoiceData(namedtuple('VoiceData', ['data', 'user_id', 'rtp', 'codec', 'cha
the decrypted data the decrypted data
user_id: snowflake user_id: snowflake
the id of the user who sent this data the id of the user who sent this data
payload_type : string
the payload's type, currently only 'opus' supported
channel : object??
rtp : RTPHeader rtp : RTPHeader
the rtp packet's header data the rtp packet's header data
codec : string
the codec this packet is using
""" """
class UDPVoiceClient(LoggingClass): class UDPVoiceClient(LoggingClass):
def __init__(self, vc): def __init__(self, vc):
super(UDPVoiceClient, self).__init__() super(UDPVoiceClient, self).__init__()
@ -84,7 +88,7 @@ class UDPVoiceClient(LoggingClass):
# Buffer used for encoding/sending frames # Buffer used for encoding/sending frames
self._buffer = bytearray(24) self._buffer = bytearray(24)
self._buffer[0] = 2 << 6 # Only RTP Version set in the first byte of the header, 0x80 self._buffer[0] = 2 << 6 # Only RTP Version set in the first byte of the header, 0x80
self._buffer[1] = PayloadTypes.OPUS.value self._buffer[1] = PayloadTypes.OPUS.value
def increment_timestamp(self, by): def increment_timestamp(self, by):
@ -175,7 +179,7 @@ class UDPVoiceClient(LoggingClass):
try: try:
data = self._secret_box.decrypt(bytes(data[12:]), bytes(nonce)) data = self._secret_box.decrypt(bytes(data[12:]), bytes(nonce))
except: except Exception:
continue continue
# RFC3550 Section 5.1 (Padding) # RFC3550 Section 5.1 (Padding)
@ -185,7 +189,7 @@ class UDPVoiceClient(LoggingClass):
if rtp.extension: if rtp.extension:
# RFC5285 Section 4.2: One-Byte Header # RFC5285 Section 4.2: One-Byte Header
rtp_extension_header = struct.unpack_from('>BB', data[:2]) rtp_extension_header = struct.unpack_from('>BB', data)
if rtp_extension_header == RTP_HEADER_ONE_BYTE: if rtp_extension_header == RTP_HEADER_ONE_BYTE:
data = data[2:] data = data[2:]
@ -211,17 +215,24 @@ class UDPVoiceClient(LoggingClass):
offset += 1 offset += 1
if len(fields): if len(fields):
data = b''.join(fields + [data[offset:]]) fields.append(data[offset:])
data = b''.join(fields)
else: else:
data = data[offset:] data = data[offset:]
# RFC3550 Section 5.3: Profile-Specific Modifications to the RTP Header # RFC3550 Section 5.3: Profile-Specific Modifications to the RTP Header
# clients send it sometimes, definitely on fresh connects to a server, dunno what to do here # clients send it sometimes, definitely on fresh connects to a server, dunno what to do here
if rtp.marker: if rtp.marker:
continue continue
user_id = self.vc.audio_ssrcs.get(rtp.ssrc, None) user_id = self.vc.audio_ssrcs.get(rtp.ssrc, None)
payload = VoiceData(data=data, user_id=user_id, rtp=rtp, codec=payload_type.name, channel=self.vc.channel) payload = VoiceData(
data=data,
payload_type=payload_type.name,
user_id=user_id,
channel=self.vc.channel,
rtp=rtp
)
self.vc.client.gw.events.emit('VoiceData', payload) self.vc.client.gw.events.emit('VoiceData', payload)

Loading…
Cancel
Save