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