diff --git a/src/media/audio/alsa/alsalayer.cpp b/src/media/audio/alsa/alsalayer.cpp
index e0069c659b7e6320164707e17bef6bc84b367bc9..f6ce71423f724157ef42479b3a2d84092d25b9f5 100644
--- a/src/media/audio/alsa/alsalayer.cpp
+++ b/src/media/audio/alsa/alsalayer.cpp
@@ -27,8 +27,8 @@
 #include "client/ring_signal.h"
 #include "audio/ringbufferpool.h"
 #include "audio/ringbuffer.h"
-#include "audio/resampler.h"
 #include "audio/audioloop.h"
+#include "libav_utils.h"
 
 #include <thread>
 #include <atomic>
@@ -697,7 +697,8 @@ void AlsaLayer::capture()
     const int framesPerBufferAlsa = 2048;
     toGetFrames = std::min(framesPerBufferAlsa, toGetFrames);
     if (auto r = read(toGetFrames)) {
-        //captureBuff_.applyGain(isCaptureMuted_ ? 0.0 : captureGain_);
+        if (isCaptureMuted_)
+            libav_utils::fillWithSilence(r->pointer());
         //dcblocker_.process(captureBuff_);
         mainRingBuffer_->put(std::move(r));
     } else
diff --git a/src/media/audio/coreaudio/ios/corelayer.cpp b/src/media/audio/coreaudio/ios/corelayer.cpp
index f0b1e0ace59c50bcbcc5249aa5a18a90fe787966..42a2e0ae936b325b8f07098864c99130af2517ba 100644
--- a/src/media/audio/coreaudio/ios/corelayer.cpp
+++ b/src/media/audio/coreaudio/ios/corelayer.cpp
@@ -22,9 +22,9 @@
 #include "corelayer.h"
 #include "manager.h"
 #include "noncopyable.h"
-#include "audio/resampler.h"
 #include "audio/ringbufferpool.h"
 #include "audio/ringbuffer.h"
+#include "libav_utils.h"
 
 #include <cmath>
 #include <vector>
@@ -426,9 +426,13 @@ CoreLayer::read(AudioUnitRenderActionFlags* ioActionFlags,
     auto format = audioInputFormat_;
     format.sampleFormat = AV_SAMPLE_FMT_FLTP;
     auto inBuff = std::make_unique<AudioFrame>(audioInputFormat_, inNumberFrames);
-    auto& in = *inBuff->pointer();
-    for (unsigned i = 0; i < inChannelsPerFrame_; ++i)
-        std::copy_n((Float32*)captureBuff_->mBuffers[i].mData, inNumberFrames, (Float32*)in.extended_data[i]);
+    if (isCaptureMuted_) {
+        libav_utils::fillWithSilence(inBuff->pointer());
+    } else {
+        auto& in = *inBuff->pointer();
+        for (unsigned i = 0; i < inChannelsPerFrame_; ++i)
+            std::copy_n((Float32*)captureBuff_->mBuffers[i].mData, inNumberFrames, (Float32*)in.extended_data[i]);
+    }
     mainRingBuffer_->put(std::move(inBuff));
 }
 
diff --git a/src/media/audio/pulseaudio/pulselayer.cpp b/src/media/audio/pulseaudio/pulselayer.cpp
index f248818a523a7250d44af07e72a6862d28da3882..cfeba36b8d83df9f443a58b8c239cb492cd5f799 100644
--- a/src/media/audio/pulseaudio/pulselayer.cpp
+++ b/src/media/audio/pulseaudio/pulselayer.cpp
@@ -24,10 +24,10 @@
 #include "compiler_intrinsics.h"
 #include "audiostream.h"
 #include "pulselayer.h"
-#include "audio/resampler.h"
 #include "audio/dcblocker.h"
 #include "audio/ringbufferpool.h"
 #include "audio/ringbuffer.h"
+#include "libav_utils.h"
 #include "logger.h"
 #include "manager.h"
 
@@ -80,10 +80,6 @@ PulseLayer::PulseLayer(AudioPreference &pref)
     , preference_(pref)
     , mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID))
 {
-    setCaptureGain(pref.getVolumemic());
-    setPlaybackGain(pref.getVolumespkr());
-    muteCapture(pref.getCaptureMuted());
-
     if (!mainloop_)
         throw std::runtime_error("Couldn't create pulseaudio mainloop");
 
@@ -465,7 +461,10 @@ void PulseLayer::readFromMic()
     const size_t samples = bytes / sample_size;
 
     auto out = std::make_unique<AudioFrame>(record_->format(), samples);
-    std::memcpy(out->pointer()->data[0], data, bytes);
+    if (isCaptureMuted_)
+        libav_utils::fillWithSilence(out->pointer());
+    else
+        std::memcpy(out->pointer()->data[0], data, bytes);
 
     if (pa_stream_drop(record_->stream()) < 0)
         RING_ERR("Capture stream drop failed: %s" , pa_strerror(pa_context_errno(context_)));