diff --git a/src/media/audio/alsa/alsalayer.cpp b/src/media/audio/alsa/alsalayer.cpp
index aa14ab208d6f6373ae0c9f02a51c57b7dfdae604..ebef086b7b1694e4ba03164a9b21938a769ccaa9 100644
--- a/src/media/audio/alsa/alsalayer.cpp
+++ b/src/media/audio/alsa/alsalayer.cpp
@@ -214,7 +214,7 @@ bool AlsaLayer::openDevice(snd_pcm_t **pcm, const std::string &dev, snd_pcm_stre
 }
 
 void
-AlsaLayer::startStream()
+AlsaLayer::startStream(AudioStreamType stream)
 {
     {
         std::lock_guard<std::mutex> lock(mutex_);
diff --git a/src/media/audio/alsa/alsalayer.h b/src/media/audio/alsa/alsalayer.h
index d393cbb047518988fc9a324885598e21a211991d..6837fe0505f5a5996c6354f77b106180653c2707 100644
--- a/src/media/audio/alsa/alsalayer.h
+++ b/src/media/audio/alsa/alsalayer.h
@@ -67,7 +67,7 @@ class AlsaLayer : public AudioLayer {
          * The playback starts accordingly to its threshold
          * ALSA Library API
          */
-        virtual void startStream();
+        virtual void startStream(AudioStreamType stream = AudioStreamType::DEFAULT);
 
         /**
          * Stop the playback and capture streams.
diff --git a/src/media/audio/audiolayer.h b/src/media/audio/audiolayer.h
index 6c6bdfc20f867ff382c35896b6898fc5a2e7aaa4..039ee5e5a72394e963f28a6508fa9acb19a5ab04 100644
--- a/src/media/audio/audiolayer.h
+++ b/src/media/audio/audiolayer.h
@@ -60,6 +60,12 @@ enum class DeviceType {
     RINGTONE       /** To open the ringtone device only */
 };
 
+enum class AudioStreamType {
+    PLAYBACK,      /** To start playback stream only */
+    CAPTURE,       /** To start capture stream only */
+    DEFAULT        /** To start both playback and capture streams */
+};
+
 class AudioLayer {
 
 private:
@@ -91,7 +97,7 @@ public:
      * The playback starts accordingly to its threshold
      * ALSA Library API
      */
-    virtual void startStream() = 0;
+    virtual void startStream(AudioStreamType stream = AudioStreamType::DEFAULT) = 0;
 
     /**
      * Stop the playback and capture streams.
diff --git a/src/media/audio/coreaudio/ios/corelayer.cpp b/src/media/audio/coreaudio/ios/corelayer.cpp
index f1fba6a3f76162e06f9ee8e1e7254cc5232b88b2..c7453e0195c96562c289c369c8bdc7f5472c11e9 100644
--- a/src/media/audio/coreaudio/ios/corelayer.cpp
+++ b/src/media/audio/coreaudio/ios/corelayer.cpp
@@ -87,7 +87,7 @@ CoreLayer::getAudioDeviceName(int index, DeviceType type) const
 }
 
 void
-CoreLayer::initAudioLayerIO()
+CoreLayer::initAudioLayerIO(AudioStreamType stream)
 {
     JAMI_DBG("iOS CoreLayer - initializing audio session");
 
@@ -135,8 +135,14 @@ CoreLayer::initAudioLayerIO()
             break;
     }
 
-    setupOutputBus();
-    setupInputBus();
+    bool setUpOutput = stream == AudioStreamType::DEFAULT || stream == AudioStreamType::PLAYBACK;
+    bool setUpInput = stream == AudioStreamType::DEFAULT || stream == AudioStreamType::CAPTURE;
+    if (setUpOutput) {
+        setupOutputBus();
+    }
+    if (setUpInput) {
+        setupInputBus();
+    }
     bindCallbacks();
 }
 
@@ -308,7 +314,7 @@ CoreLayer::bindCallbacks() {
 }
 
 void
-CoreLayer::startStream()
+CoreLayer::startStream(AudioStreamType stream)
 {
     JAMI_DBG("iOS CoreLayer - Start Stream");
 
@@ -321,7 +327,7 @@ CoreLayer::startStream()
 
     dcblocker_.reset();
 
-    initAudioLayerIO();
+    initAudioLayerIO(stream);
 
     // Run
     auto inputRes = AudioUnitInitialize(ioUnit_);
diff --git a/src/media/audio/coreaudio/ios/corelayer.h b/src/media/audio/coreaudio/ios/corelayer.h
index 76dbd0d5220071a48f1435dc5219686a78a952e3..810efcc9d49c218f5b46dd3db37ea93c115954f5 100644
--- a/src/media/audio/coreaudio/ios/corelayer.h
+++ b/src/media/audio/coreaudio/ios/corelayer.h
@@ -83,7 +83,7 @@ class CoreLayer : public AudioLayer {
         /**
          * Configure the AudioUnit
          */
-        void initAudioLayerIO();
+        void initAudioLayerIO(AudioStreamType stream);
         void setupOutputBus();
         void setupInputBus();
         void bindCallbacks();
@@ -96,7 +96,7 @@ class CoreLayer : public AudioLayer {
          * CoreAudio Library API
          */
 
-        virtual void startStream();
+        virtual void startStream(AudioStreamType stream = AudioStreamType::DEFAULT);
 
         void destroyAudioLayer();
 
diff --git a/src/media/audio/coreaudio/osx/corelayer.cpp b/src/media/audio/coreaudio/osx/corelayer.cpp
index ef069d6ed539adacdad4814eefb142b95d60940b..853a648db740bb85a8dd8526fc1dff08fdfffb6e 100644
--- a/src/media/audio/coreaudio/osx/corelayer.cpp
+++ b/src/media/audio/coreaudio/osx/corelayer.cpp
@@ -230,7 +230,7 @@ CoreLayer::initAudioLayerIO()
 }
 
 void
-CoreLayer::startStream()
+CoreLayer::startStream(AudioStreamType stream)
 {
     JAMI_DBG("START STREAM");
 
diff --git a/src/media/audio/coreaudio/osx/corelayer.h b/src/media/audio/coreaudio/osx/corelayer.h
index 0da3bb322b0bb853e353cafd28208f86e00ef2b1..9d447b2ec52ed8606172153e539fd69561075bcc 100644
--- a/src/media/audio/coreaudio/osx/corelayer.h
+++ b/src/media/audio/coreaudio/osx/corelayer.h
@@ -97,7 +97,7 @@ class CoreLayer : public AudioLayer {
          * CoreAudio Library API
          */
 
-        virtual void startStream();
+        virtual void startStream(AudioStreamType stream = AudioStreamType::DEFAULT);
 
         void destroyAudioLayer();
 
diff --git a/src/media/audio/jack/jacklayer.cpp b/src/media/audio/jack/jacklayer.cpp
index 64c3437e697cf7146b1678ca446584e429c323b3..dc34dd3caeda3b938ea87a592139b4178907d1b8 100644
--- a/src/media/audio/jack/jacklayer.cpp
+++ b/src/media/audio/jack/jacklayer.cpp
@@ -347,7 +347,7 @@ JackLayer::process_playback(jack_nframes_t frames, void *arg)
  * Start the capture and playback.
  */
 void
-JackLayer::startStream()
+JackLayer::startStream(AudioStreamType stream)
 {
     {
         std::lock_guard<std::mutex> lock(mutex_);
diff --git a/src/media/audio/jack/jacklayer.h b/src/media/audio/jack/jacklayer.h
index 6080011600c5d62cadb877961c191a62a709e889..dde32e50e444f4e4c5d4325829da2c299971765f 100644
--- a/src/media/audio/jack/jacklayer.h
+++ b/src/media/audio/jack/jacklayer.h
@@ -75,7 +75,7 @@ private:
     /**
      * Start the capture and playback.
      */
-    void startStream();
+    void startStream(AudioStreamType stream = AudioStreamType::DEFAULT);
 
     /**
      * Stop playback and capture.
diff --git a/src/media/audio/opensl/opensllayer.cpp b/src/media/audio/opensl/opensllayer.cpp
index 50dfd5ee8a534da4ec5a3940e62fe72bf7085f31..79ca4f56f5f37c31c202d5f62b2b76fb15412989 100644
--- a/src/media/audio/opensl/opensllayer.cpp
+++ b/src/media/audio/opensl/opensllayer.cpp
@@ -68,7 +68,7 @@ OpenSLLayer::init()
 }
 
 void
-OpenSLLayer::startStream()
+OpenSLLayer::startStream(AudioStreamType stream)
 {
     std::lock_guard<std::mutex> lock(mutex_);
     if (status_ != Status::Idle)
diff --git a/src/media/audio/opensl/opensllayer.h b/src/media/audio/opensl/opensllayer.h
index 3a030bc705bf3c88f59dcdbc70303faeb489fe42..239537b4f7b56426e1c3542b0bdb20f8879ad896 100644
--- a/src/media/audio/opensl/opensllayer.h
+++ b/src/media/audio/opensl/opensllayer.h
@@ -67,7 +67,7 @@ class OpenSLLayer : public AudioLayer {
          * Start the capture stream and prepare the playback stream.
          * The playback starts accordingly to its threshold
          */
-        virtual void startStream();
+        virtual void startStream(AudioStreamType stream = AudioStreamType::DEFAULT);
 
         /**
          * Stop the playback and capture streams.
diff --git a/src/media/audio/portaudio/portaudiolayer.cpp b/src/media/audio/portaudio/portaudiolayer.cpp
index db20ef3334b1754175b8888953b6ed05b2cd509b..d567dad89ffac0156009923f28510c0d2556be7b 100644
--- a/src/media/audio/portaudio/portaudiolayer.cpp
+++ b/src/media/audio/portaudio/portaudiolayer.cpp
@@ -155,7 +155,7 @@ PortAudioLayer::getIndexRingtone() const
 }
 
 void
-PortAudioLayer::startStream()
+PortAudioLayer::startStream(AudioStreamType stream)
 {
     {
         std::lock_guard<std::mutex> lock(mutex_);
diff --git a/src/media/audio/portaudio/portaudiolayer.h b/src/media/audio/portaudio/portaudiolayer.h
index 80e4cd8acddc7fdec1eddb6be47952d136e9de7b..2d8658caa82f71bd5a87f1ed80d8c6adb6135a27 100644
--- a/src/media/audio/portaudio/portaudiolayer.h
+++ b/src/media/audio/portaudio/portaudiolayer.h
@@ -47,7 +47,7 @@ public:
      * Start the capture stream and prepare the playback stream.
      * The playback starts accordingly to its threshold
      */
-    void startStream() override;
+    void startStream(AudioStreamType stream = AudioStreamType::DEFAULT) override;
 
     /**
      * Stop the playback and capture streams.
diff --git a/src/media/audio/pulseaudio/pulselayer.cpp b/src/media/audio/pulseaudio/pulselayer.cpp
index d54195d4d1b531df5f633416bf015077a2a9a0e1..90dea49b20ac34b20fd3492f03a957999789ee8a 100644
--- a/src/media/audio/pulseaudio/pulselayer.cpp
+++ b/src/media/audio/pulseaudio/pulselayer.cpp
@@ -373,7 +373,7 @@ void PulseLayer::disconnectAudioStream()
     record_.reset();
 }
 
-void PulseLayer::startStream()
+void PulseLayer::startStream(AudioStreamType stream)
 {
     std::unique_lock<std::mutex> lk(readyMtx_);
     readyCv_.wait(lk, [this] {
diff --git a/src/media/audio/pulseaudio/pulselayer.h b/src/media/audio/pulseaudio/pulselayer.h
index 0c3e27a7fde4b5c5019f26ebdac70b200d9318e5..12e5601a18d4a79e7b818836e3fe8ad737ccf7a2 100644
--- a/src/media/audio/pulseaudio/pulselayer.h
+++ b/src/media/audio/pulseaudio/pulselayer.h
@@ -130,7 +130,7 @@ class PulseLayer : public AudioLayer {
 
         std::string getAudioDeviceName(int index, DeviceType type) const;
 
-        virtual void startStream();
+        virtual void startStream(AudioStreamType stream = AudioStreamType::DEFAULT);
         virtual void stopStream();
 
     private: