diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2024-07-05 03:48:06 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2024-07-05 03:48:06 -0400 |
commit | e6191d95341d164eacaf91739c8aa7020dd5c9b6 (patch) | |
tree | 4317a4dde8eca28cb85f1fa1a5f65b53aed47b27 /src/discord | |
parent | ebce49925cfb0c93a0a4fc3c302f0efbf24e1409 (diff) | |
download | abaddon-portaudio-e6191d95341d164eacaf91739c8aa7020dd5c9b6.tar.gz abaddon-portaudio-e6191d95341d164eacaf91739c8aa7020dd5c9b6.zip |
update rtp extension stripping
Diffstat (limited to 'src/discord')
-rw-r--r-- | src/discord/voiceclient.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/discord/voiceclient.cpp b/src/discord/voiceclient.cpp index 212b878..e3e83f1 100644 --- a/src/discord/voiceclient.cpp +++ b/src/discord/voiceclient.cpp @@ -462,6 +462,19 @@ void DiscordVoiceClient::SetState(State state) { m_signal_state_update.emit(state); } +size_t GetPayloadOffset(const uint8_t *buf, size_t num_bytes) { + const bool has_extension_header = (buf[0] & 0b00010000) != 0; + const int csrc_count = buf[0] & 0b00001111; + + size_t offset = 12 + csrc_count * 4; + + if (has_extension_header && num_bytes > 4) { + offset += 4 + 4 * ((buf[offset + 2] << 8) | buf[offset + 3]); + } + + return offset; +} + void DiscordVoiceClient::OnUDPData(std::vector<uint8_t> data) { uint8_t *payload = data.data() + 12; uint32_t ssrc = (data[8] << 24) | @@ -473,7 +486,9 @@ void DiscordVoiceClient::OnUDPData(std::vector<uint8_t> data) { if (crypto_secretbox_open_easy(payload, payload, data.size() - 12, nonce.data(), m_secret_key.data())) { // spdlog::get("voice")->trace("UDP payload decryption failure"); } else { - Abaddon::Get().GetAudio().FeedMeOpus(ssrc, { payload, payload + data.size() - 12 - crypto_box_MACBYTES }); + size_t opus_offset = GetPayloadOffset(data.data(), data.size()); + payload = data.data() + opus_offset; + Abaddon::Get().GetAudio().FeedMeOpus(ssrc, { payload, payload + data.size() - opus_offset - crypto_box_MACBYTES }); } } |