summaryrefslogtreecommitdiff
path: root/src/discord
diff options
context:
space:
mode:
Diffstat (limited to 'src/discord')
-rw-r--r--src/discord/discord.cpp4
-rw-r--r--src/discord/discord.hpp2
-rw-r--r--src/discord/voiceclient.cpp25
-rw-r--r--src/discord/voiceclient.hpp4
4 files changed, 35 insertions, 0 deletions
diff --git a/src/discord/discord.cpp b/src/discord/discord.cpp
index 2c7358b..45e8919 100644
--- a/src/discord/discord.cpp
+++ b/src/discord/discord.cpp
@@ -1226,6 +1226,10 @@ std::optional<Snowflake> DiscordClient::GetVoiceState(Snowflake user_id) const {
return std::nullopt;
}
+DiscordVoiceClient &DiscordClient::GetVoiceClient() {
+ return m_voice;
+}
+
void DiscordClient::SetVoiceMuted(bool is_mute) {
m_mute_requested = is_mute;
SendVoiceStateUpdate();
diff --git a/src/discord/discord.hpp b/src/discord/discord.hpp
index fa399cc..10b1d30 100644
--- a/src/discord/discord.hpp
+++ b/src/discord/discord.hpp
@@ -191,6 +191,8 @@ public:
[[nodiscard]] std::optional<uint32_t> GetSSRCOfUser(Snowflake id) const;
[[nodiscard]] std::optional<Snowflake> GetVoiceState(Snowflake user_id) const;
+ DiscordVoiceClient &GetVoiceClient();
+
void SetVoiceMuted(bool is_mute);
void SetVoiceDeafened(bool is_deaf);
#endif
diff --git a/src/discord/voiceclient.cpp b/src/discord/voiceclient.cpp
index ed83e3c..3d246b1 100644
--- a/src/discord/voiceclient.cpp
+++ b/src/discord/voiceclient.cpp
@@ -167,6 +167,7 @@ DiscordVoiceClient::~DiscordVoiceClient() {
void DiscordVoiceClient::Start() {
SetState(State::ConnectingToWebsocket);
+ m_ssrc_map.clear();
m_heartbeat_waiter.revive();
m_keepalive_waiter.revive();
m_ws.StartConnection("wss://" + m_endpoint + "/?v=7");
@@ -188,6 +189,8 @@ void DiscordVoiceClient::Stop() {
m_keepalive_waiter.kill();
if (m_keepalive_thread.joinable()) m_keepalive_thread.join();
+ m_ssrc_map.clear();
+
m_signal_disconnected.emit();
}
@@ -211,6 +214,20 @@ void DiscordVoiceClient::SetUserID(Snowflake id) {
m_user_id = id;
}
+void DiscordVoiceClient::SetUserVolume(Snowflake id, float volume) {
+ m_user_volumes[id] = volume;
+ if (const auto ssrc = GetSSRCOfUser(id); ssrc.has_value()) {
+ Abaddon::Get().GetAudio().SetVolumeSSRC(*ssrc, volume);
+ }
+}
+
+[[nodiscard]] float DiscordVoiceClient::GetUserVolume(Snowflake id) const {
+ if (const auto it = m_user_volumes.find(id); it != m_user_volumes.end()) {
+ return it->second;
+ }
+ return 1.0f;
+}
+
std::optional<uint32_t> DiscordVoiceClient::GetSSRCOfUser(Snowflake id) const {
if (const auto it = m_ssrc_map.find(id); it != m_ssrc_map.end()) {
return it->second;
@@ -315,6 +332,14 @@ void DiscordVoiceClient::HandleGatewaySessionDescription(const VoiceGatewayMessa
void DiscordVoiceClient::HandleGatewaySpeaking(const VoiceGatewayMessage &m) {
VoiceSpeakingData d = m.Data;
+
+ // set volume if already set but ssrc just found
+ if (const auto iter = m_user_volumes.find(d.UserID); iter != m_user_volumes.end()) {
+ if (m_ssrc_map.find(d.UserID) == m_ssrc_map.end()) {
+ Abaddon::Get().GetAudio().SetVolumeSSRC(d.SSRC, iter->second);
+ }
+ }
+
m_ssrc_map[d.UserID] = d.SSRC;
m_signal_speaking.emit(d);
}
diff --git a/src/discord/voiceclient.hpp b/src/discord/voiceclient.hpp
index 916d070..7bf4295 100644
--- a/src/discord/voiceclient.hpp
+++ b/src/discord/voiceclient.hpp
@@ -195,6 +195,9 @@ public:
void SetServerID(Snowflake id);
void SetUserID(Snowflake id);
+ // todo serialize
+ void SetUserVolume(Snowflake id, float volume);
+ [[nodiscard]] float GetUserVolume(Snowflake id) const;
[[nodiscard]] std::optional<uint32_t> GetSSRCOfUser(Snowflake id) const;
// Is a websocket and udp connection fully established
@@ -241,6 +244,7 @@ private:
Snowflake m_user_id;
std::unordered_map<Snowflake, uint32_t> m_ssrc_map;
+ std::unordered_map<Snowflake, float> m_user_volumes;
std::array<uint8_t, 32> m_secret_key;