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: