mirror of
https://github.com/diamondburned/arikawa.git
synced 2024-11-28 01:33:10 +00:00
.. | ||
testdata | ||
udp | ||
voicegateway | ||
integration_test.go | ||
packet.go | ||
README.md | ||
session.go | ||
voice.go |
Voice
Terminology
- Discord Gateway - The standard Discord Gateway users connect to and receive update events from
- Discord Voice Gateway - The Discord Voice gateway that allows voice connections to be configured
- Voice Server - What the Discord Voice Gateway allows connection to for sending of Opus voice packets over UDP
- Voice Packet - Opus encoded UDP packet that contains audio
- Application - Could be a custom Discord Client or Bot (nothing that is within this package)
- Library - Code within this package
Connection Flow
- The application would get a new
*Voice
instance by callingNewVoice()
- When the application wants to connect to a voice channel they would call
JoinChannel()
on the stored*Voice
instance
- The library sends a Voice State Update to the Discord Gateway
- The library waits until it receives a Voice Server Update from the Discord Gateway
- Once a Voice Server Update event is received, a new connection is opened to the Discord Voice Gateway
- When the connection is opened an Identify Event or Resume Event is sent to the Discord Voice Gateway depending on if the library is reconnecting
- The Discord Voice Gateway should respond with a Hello Event
which will be used to create a new
*gateway.Pacemaker
and start sending heartbeats to the Discord Voice Gateway
- The Discord Voice Gateway should also respond with a Ready Event once the connection is opened, providing the required information to connect to a Voice Server
- Using the information provided in the Ready Event, a new UDP connection is opened to the Voice Server and IP Discovery occurs
- After IP Discovery returns the Application's external ip and port it connected to the Voice Server with, the library sends a Select Protocol Event to the Discord Voice Gateway
- The library waits until it receives a Session Description Event from the Discord Voice Gateway
- Once the Session Description Event is received, Speaking Events and Voice Packets can begin to be sent to the Discord Voice Gateway and Voice Server respectively
Usage
- The application would get a new
*Voice
instance by callingNewVoice()
and keep it stored for when it needs to open voice connections - When the application wants to connect to a voice channel they would call
JoinChannel()
on the stored*Voice
instance JoinChannel()
will block as it follows the Connection Flow, returning anerror
if one occurs and a*Connection
if it was successful- The application should now call
*Connection#Speaking()
with the wanted voice flag (Microphone
,Soundshare
,Priority
) - The application can now send Voice Packets to the
*Connection#OpusSend
channel which will be sent to the Voice Server - When the application wants to stop sending Voice Packets they should call
*Connection#StopSpeaking()
, any required voice cleanup (closing streams, etc), then*Connection#Disconnect()