summaryrefslogtreecommitdiff
path: root/src/discord/voiceclient.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/discord/voiceclient.cpp')
-rw-r--r--src/discord/voiceclient.cpp35
1 files changed, 24 insertions, 11 deletions
diff --git a/src/discord/voiceclient.cpp b/src/discord/voiceclient.cpp
index b899638..6d45241 100644
--- a/src/discord/voiceclient.cpp
+++ b/src/discord/voiceclient.cpp
@@ -168,25 +168,34 @@ DiscordVoiceClient::DiscordVoiceClient() {
m_udp_dispatch_mutex.unlock();
OnUDPData(data);
});
+
+ Glib::signal_idle().connect_once([this]() {
+ // cant put in ctor or deadlock in singleton initialization
+ auto &aud = Abaddon::Get().GetAudio();
+ aud.SetOpusBuffer(m_opus_buffer.data());
+ aud.signal_opus_packet().connect([this](int payload_size) {
+ if (m_connected)
+ m_udp.SendEncrypted(m_opus_buffer.data(), payload_size);
+ });
+ });
}
DiscordVoiceClient::~DiscordVoiceClient() {
- m_ws.Stop();
- m_udp.Stop();
- m_heartbeat_waiter.kill();
- if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join();
+ Stop();
}
void DiscordVoiceClient::Start() {
m_ws.StartConnection("wss://" + m_endpoint + "/?v=7");
+}
- // cant put in ctor or deadlock in singleton initialization
- auto &aud = Abaddon::Get().GetAudio();
- aud.SetOpusBuffer(m_opus_buffer.data());
- aud.signal_opus_packet().connect([this](int payload_size) {
- if (m_connected)
- m_udp.SendEncrypted(m_opus_buffer.data(), payload_size);
- });
+void DiscordVoiceClient::Stop() {
+ if (m_connected) {
+ m_ws.Stop();
+ m_udp.Stop();
+ m_heartbeat_waiter.kill();
+ if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join();
+ m_connected = false;
+ }
}
void DiscordVoiceClient::SetSessionID(std::string_view session_id) {
@@ -209,6 +218,10 @@ void DiscordVoiceClient::SetUserID(Snowflake id) {
m_user_id = id;
}
+bool DiscordVoiceClient::IsConnected() const noexcept {
+ return m_connected;
+}
+
void DiscordVoiceClient::OnGatewayMessage(const std::string &str) {
VoiceGatewayMessage msg = nlohmann::json::parse(str);
puts(msg.Data.dump(4).c_str());