make voice disconnect/reconnect work

This commit is contained in:
ouwou
2022-09-06 03:29:13 -04:00
parent 654e225093
commit 90437de2c0
10 changed files with 93 additions and 16 deletions

View File

@@ -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());