From 1f4070e52f94470eea3b86a089e3fe6e7fdca2fc Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Wed, 31 Aug 2022 20:42:14 -0400 Subject: basic buffering (i think) --- src/audio/manager.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'src/audio/manager.cpp') diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp index 30896ec..e686a82 100644 --- a/src/audio/manager.cpp +++ b/src/audio/manager.cpp @@ -9,6 +9,8 @@ #include #include +#define BUFFER_SAMPLES 4800 + const uint8_t *StripRTPExtensionHeader(const uint8_t *buf, int num_bytes, size_t &outlen) { if (buf[0] == 0xbe && buf[1] == 0xde && num_bytes > 4) { uint64_t offset = 4 + 4 * ((buf[2] << 8) | buf[3]); @@ -27,10 +29,8 @@ void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uin const auto buffered_frames = std::min(static_cast(mgr->m_dumb.size() / 2), frameCount); auto *pOutputCast = static_cast(pOutput); - for (ma_uint32 i = 0; i < buffered_frames * 2; i++) { - pOutputCast[i] = mgr->m_dumb.front(); - mgr->m_dumb.pop(); - } + std::copy(mgr->m_dumb.begin(), mgr->m_dumb.begin() + buffered_frames * 2, pOutputCast); + mgr->m_dumb.erase(mgr->m_dumb.begin(), mgr->m_dumb.begin() + buffered_frames * 2); } AudioManager::AudioManager() { @@ -60,7 +60,6 @@ AudioManager::AudioManager() { m_opus_decoder = opus_decoder_create(48000, 2, &err); m_active = true; - // m_thread = std::thread(&AudioManager::testthread, this); } AudioManager::~AudioManager() { @@ -71,22 +70,21 @@ AudioManager::~AudioManager() { void AudioManager::FeedMeOpus(const std::vector &data) { size_t payload_size = 0; const auto *opus_encoded = StripRTPExtensionHeader(data.data(), static_cast(data.size()), payload_size); - static std::array pcm; + static std::array pcm; int decoded = opus_decode(m_opus_decoder, opus_encoded, static_cast(payload_size), pcm.data(), 120 * 48, 0); if (decoded <= 0) { printf("failed decode: %d\n", decoded); } else { - m_dumb_mutex.lock(); - for (size_t i = 0; i < decoded * 2; i++) { - m_dumb.push(pcm[i]); + m_buffer.insert(m_buffer.end(), pcm.begin(), pcm.begin() + decoded * 2); + if (m_buffer.size() >= BUFFER_SAMPLES * 2) { + m_dumb_mutex.lock(); + m_dumb.insert(m_dumb.end(), m_buffer.begin(), m_buffer.begin() + BUFFER_SAMPLES * 2); + m_dumb_mutex.unlock(); + m_buffer.erase(m_buffer.begin(), m_buffer.begin() + BUFFER_SAMPLES * 2); } - m_dumb_mutex.unlock(); } } -void AudioManager::testthread() { -} - bool AudioManager::OK() const { return m_ok; } -- cgit v1.2.3