diff --git a/src/media/audio/audio_input.cpp b/src/media/audio/audio_input.cpp index e4d18ef68952122af13ce9cab8a26cc3ee79585e..4f90c452c56e80ab14b8a1372ea067bb02e4902f 100644 --- a/src/media/audio/audio_input.cpp +++ b/src/media/audio/audio_input.cpp @@ -31,7 +31,6 @@ #include "smartools.h" #include <future> -#include <chrono> #include <memory> namespace jami { @@ -51,6 +50,7 @@ AudioInput::AudioInput(const std::string& id) : [] {}) { JAMI_DBG() << "Creating audio input with id: " << id; + wakeUp_ = std::chrono::high_resolution_clock::now() + MS_PER_PACKET; loop_.start(); } @@ -120,8 +120,13 @@ AudioInput::readFromDevice() return; } - if (not mainBuffer.waitForDataAvailable(id_, MS_PER_PACKET)) - return; + // Note: read for device is called in an audio thread and we don't + // want to have a loop which takes 100% of the CPU. + // Here, we basically want to mix available data without any glitch + // and even if one buffer doesn't have audio data (call in hold, + // connections issues, etc). So mix every MS_PER_PACKET + std::this_thread::sleep_until(wakeUp_); + wakeUp_ += MS_PER_PACKET; auto samples = mainBuffer.getData(id_); if (not samples) diff --git a/src/media/audio/audio_input.h b/src/media/audio/audio_input.h index 5533d7ad706400dc04e2e27193eadff915ecb314..7204a5fd90d3a77c2e5aa80dea9accb65fb0177c 100644 --- a/src/media/audio/audio_input.h +++ b/src/media/audio/audio_input.h @@ -24,6 +24,7 @@ #include <atomic> #include <future> #include <mutex> +#include <chrono> #include "audio/audiobuffer.h" #include "media_device.h" @@ -99,6 +100,8 @@ private: ThreadLoop loop_; void process(); + + std::chrono::time_point<std::chrono::high_resolution_clock> wakeUp_; }; } // namespace jami