summaryrefslogtreecommitdiff
path: root/src/discord/voiceclient.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2023-01-16 22:52:39 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2023-01-16 22:52:39 -0500
commitea04035f0db8fa990dd7ca8dd1a64f56bceb82e2 (patch)
tree751a4f4e2cd33c19006d92547de4fcccc2a618ee /src/discord/voiceclient.cpp
parent5e85d16cd61a9f28bd046d4c7921be8f6cc2b2fc (diff)
downloadabaddon-portaudio-ea04035f0db8fa990dd7ca8dd1a64f56bceb82e2.tar.gz
abaddon-portaudio-ea04035f0db8fa990dd7ca8dd1a64f56bceb82e2.zip
persist voice settings, handle volume w/ no ssrc
Diffstat (limited to 'src/discord/voiceclient.cpp')
-rw-r--r--src/discord/voiceclient.cpp25
1 files changed, 25 insertions, 0 deletions
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);
}