summaryrefslogtreecommitdiff
path: root/src/audio/manager.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2024-03-31 21:32:41 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2024-03-31 21:32:41 -0400
commitb7906eb918d0df1fa1508a77732113ca94056e4e (patch)
treefa533b611822b25924d4e2947bcf90307c6e5cff /src/audio/manager.cpp
parent1367e162c0581bdea7ec1d2129b18e70d7d43d2b (diff)
parentfda687eaa8b33899648e97798a7fbcaa9edda12b (diff)
downloadabaddon-portaudio-b7906eb918d0df1fa1508a77732113ca94056e4e.tar.gz
abaddon-portaudio-b7906eb918d0df1fa1508a77732113ca94056e4e.zip
Merge branch 'master' into stages
Diffstat (limited to 'src/audio/manager.cpp')
-rw-r--r--src/audio/manager.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp
index eaac3bf..f9ffdd5 100644
--- a/src/audio/manager.cpp
+++ b/src/audio/manager.cpp
@@ -6,6 +6,7 @@
#endif
#include "manager.hpp"
+#include "abaddon.hpp"
#include <array>
#include <glibmm/main.h>
#include <spdlog/sinks/stdout_color_sinks.h>
@@ -25,6 +26,7 @@ const uint8_t *StripRTPExtensionHeader(const uint8_t *buf, int num_bytes, size_t
return buf;
}
+// frameCount is configured to be 480 samples per channel
void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uint32 frameCount) {
AudioManager *mgr = reinterpret_cast<AudioManager *>(pDevice->pUserData);
if (mgr == nullptr) return;
@@ -36,12 +38,14 @@ void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uin
if (const auto vol_it = mgr->m_volume_ssrc.find(ssrc); vol_it != mgr->m_volume_ssrc.end()) {
volume = vol_it->second;
}
- auto &buf = pair.first;
- const size_t n = std::min(static_cast<size_t>(buf.size()), static_cast<size_t>(frameCount * 2ULL));
- for (size_t i = 0; i < n; i++) {
+
+ static std::array<int16_t, 480 * 2> buf;
+
+ if (!pair.first.PopSamples(buf.data(), 480 * 2)) continue;
+
+ for (size_t i = 0; i < 480 * 2; i++) {
pOutputF32[i] += volume * buf[i] / 32768.F;
}
- buf.erase(buf.begin(), buf.begin() + n);
}
}
@@ -201,7 +205,14 @@ void AudioManager::AddSSRC(uint32_t ssrc) {
int error;
if (m_sources.find(ssrc) == m_sources.end()) {
auto *decoder = opus_decoder_create(48000, 2, &error);
- m_sources.insert(std::make_pair(ssrc, std::make_pair(std::deque<int16_t> {}, decoder)));
+ auto &s = Abaddon::Get().GetSettings();
+ m_sources.insert(std::make_pair(ssrc, std::make_pair(
+ JitterBuffer<int16_t>(
+ s.JitterDesiredLatency,
+ s.JitterMaximumLatency,
+ 2,
+ 48000),
+ decoder)));
}
}
@@ -241,7 +252,7 @@ void AudioManager::FeedMeOpus(uint32_t ssrc, const std::vector<uint8_t> &data) {
} else {
UpdateReceiveVolume(ssrc, pcm.data(), decoded);
auto &buf = it->second.first;
- buf.insert(buf.end(), pcm.begin(), pcm.begin() + decoded * 2);
+ buf.PushSamples(pcm.data(), decoded * 2);
}
}
}