From 7149cbbb23d3a0b686e6739ed5701325976a81a6 Mon Sep 17 00:00:00 2001
From: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
Date: Thu, 9 Jan 2020 11:52:41 -0500
Subject: [PATCH] audio: start capture or playback stream.

Change-Id: If67bb0d338daca8d96a0398d0f9f0cbecb3293c9
---
 src/media/audio/alsa/alsalayer.cpp           |  2 +-
 src/media/audio/alsa/alsalayer.h             |  2 +-
 src/media/audio/audiolayer.h                 |  8 +++++++-
 src/media/audio/coreaudio/ios/corelayer.cpp  | 16 +++++++++++-----
 src/media/audio/coreaudio/ios/corelayer.h    |  4 ++--
 src/media/audio/coreaudio/osx/corelayer.cpp  |  2 +-
 src/media/audio/coreaudio/osx/corelayer.h    |  2 +-
 src/media/audio/jack/jacklayer.cpp           |  2 +-
 src/media/audio/jack/jacklayer.h             |  2 +-
 src/media/audio/opensl/opensllayer.cpp       |  2 +-
 src/media/audio/opensl/opensllayer.h         |  2 +-
 src/media/audio/portaudio/portaudiolayer.cpp |  2 +-
 src/media/audio/portaudio/portaudiolayer.h   |  2 +-
 src/media/audio/pulseaudio/pulselayer.cpp    |  2 +-
 src/media/audio/pulseaudio/pulselayer.h      |  2 +-
 15 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/src/media/audio/alsa/alsalayer.cpp b/src/media/audio/alsa/alsalayer.cpp
index aa14ab208d..ebef086b7b 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 d393cbb047..6837fe0505 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 6c6bdfc20f..039ee5e5a7 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 f1fba6a3f7..c7453e0195 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 76dbd0d522..810efcc9d4 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 ef069d6ed5..853a648db7 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 0da3bb322b..9d447b2ec5 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 64c3437e69..dc34dd3cae 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 6080011600..dde32e50e4 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 50dfd5ee8a..79ca4f56f5 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 3a030bc705..239537b4f7 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 db20ef3334..d567dad89f 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 80e4cd8acd..2d8658caa8 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 d54195d4d1..90dea49b20 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 0c3e27a7fd..12e5601a18 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:
-- 
GitLab