diff --git a/src/media/audio/audio_rtp_session.cpp b/src/media/audio/audio_rtp_session.cpp
index c4c0c0678ea96a19162230bf0cbeae7b5ed1ff31..5499df79ccbf5894f21d751a68ad9748daa54d99 100644
--- a/src/media/audio/audio_rtp_session.cpp
+++ b/src/media/audio/audio_rtp_session.cpp
@@ -69,6 +69,8 @@ AudioRtpSession::startSender()
         if (sender_) {
             if (socketPair_)
                 socketPair_->interrupt();
+            if (audioInput_)
+                audioInput_->detach(sender_.get());
             sender_.reset();
         }
         return;
@@ -76,6 +78,8 @@ AudioRtpSession::startSender()
 
     if (sender_)
         JAMI_WARN("Restarting audio sender");
+    if (audioInput_)
+        audioInput_->detach(sender_.get());
 
     // sender sets up input correctly, we just keep a reference in case startSender is called
     audioInput_ = jami::getAudioInput(callID_);
@@ -102,12 +106,18 @@ AudioRtpSession::startSender()
         sender_.reset();
         socketPair_->stopSendOp(false);
         sender_.reset(new AudioSender(
-            callID_, getRemoteRtpUri(), send_, *socketPair_, initSeqVal_, muteState_, mtu_));
+            callID_, getRemoteRtpUri(), send_, *socketPair_, initSeqVal_, mtu_));
     } catch (const MediaEncoderException& e) {
         JAMI_ERR("%s", e.what());
         send_.enabled = false;
     }
 
+    // NOTE do after sender/encoder are ready
+    auto codec = std::static_pointer_cast<AccountAudioCodecInfo>(send_.codec);
+    audioInput_->setFormat(codec->audioformat);
+    if (audioInput_)
+        audioInput_->attach(sender_.get());
+
     if (not rtcpCheckerThread_.isRunning())
         rtcpCheckerThread_.start();
 }
@@ -184,6 +194,9 @@ AudioRtpSession::stop()
 {
     std::lock_guard<std::recursive_mutex> lock(mutex_);
 
+    if (audioInput_)
+        audioInput_->detach(sender_.get());
+
     if (socketPair_)
         socketPair_->interrupt();
 
@@ -199,10 +212,7 @@ void
 AudioRtpSession::setMuted(bool isMuted)
 {
     std::lock_guard<std::recursive_mutex> lock(mutex_);
-    if (sender_) {
-        muteState_ = isMuted;
-        sender_->setMuted(isMuted);
-    }
+    muteState_ = isMuted;
 }
 
 bool
diff --git a/src/media/audio/audio_sender.cpp b/src/media/audio/audio_sender.cpp
index 1c4213bb67e4bd9d420558efd2184cb0f327c904..9692f8f5207518bfa1928fc2604361ed4f91c61e 100644
--- a/src/media/audio/audio_sender.cpp
+++ b/src/media/audio/audio_sender.cpp
@@ -19,7 +19,6 @@
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
  */
 
-#include "audio_input.h"
 #include "audio_sender.h"
 #include "client/videomanager.h"
 #include "libav_deps.h"
@@ -39,13 +38,11 @@ AudioSender::AudioSender(const std::string& id,
                          const MediaDescription& args,
                          SocketPair& socketPair,
                          const uint16_t seqVal,
-                         bool muteState,
                          const uint16_t mtu)
     : id_(id)
     , dest_(dest)
     , args_(args)
     , seqVal_(seqVal)
-    , muteState_(muteState)
     , mtu_(mtu)
 {
     setup(socketPair);
@@ -53,8 +50,6 @@ AudioSender::AudioSender(const std::string& id,
 
 AudioSender::~AudioSender()
 {
-    audioInput_->detach(this);
-    audioInput_.reset();
     audioEncoder_.reset();
     muxContext_.reset();
     micData_.clear();
@@ -89,12 +84,6 @@ AudioSender::setup(SocketPair& socketPair)
     audioEncoder_->print_sdp();
 #endif
 
-    // NOTE do after encoder is ready to encode
-    auto codec = std::static_pointer_cast<AccountAudioCodecInfo>(args_.codec);
-    audioInput_ = jami::getAudioInput(id_);
-    audioInput_->setFormat(codec->audioformat);
-    audioInput_->setMuted(muteState_);
-    audioInput_->attach(this);
     return true;
 }
 
@@ -109,13 +98,6 @@ AudioSender::update(Observable<std::shared_ptr<jami::MediaFrame>>* /*obs*/,
         JAMI_ERR("encoding failed");
 }
 
-void
-AudioSender::setMuted(bool isMuted)
-{
-    muteState_ = isMuted;
-    audioInput_->setMuted(isMuted);
-}
-
 uint16_t
 AudioSender::getLastSeqValue()
 {
diff --git a/src/media/audio/audio_sender.h b/src/media/audio/audio_sender.h
index c06bc67356a2d79b03027baadf3af384d3792c6b..e1d9e84d02a689c9678ee09a980818e10ac6c039 100644
--- a/src/media/audio/audio_sender.h
+++ b/src/media/audio/audio_sender.h
@@ -42,11 +42,9 @@ public:
                 const MediaDescription& args,
                 SocketPair& socketPair,
                 const uint16_t seqVal,
-                bool muteState,
                 const uint16_t mtu);
     ~AudioSender();
 
-    void setMuted(bool isMuted);
     uint16_t getLastSeqValue();
     int setPacketLoss(uint64_t pl);
 
@@ -64,14 +62,12 @@ private:
     std::unique_ptr<MediaEncoder> audioEncoder_;
     std::unique_ptr<MediaIOHandle> muxContext_;
     std::unique_ptr<Resampler> resampler_;
-    std::shared_ptr<AudioInput> audioInput_;
 
     uint64_t sent_samples = 0;
 
     AudioBuffer micData_;
     AudioBuffer resampledData_;
     const uint16_t seqVal_;
-    bool muteState_ = false;
     uint16_t mtu_;
 };