diff --git a/src/conference.cpp b/src/conference.cpp index e5d519c89d14187faa83bbc55ad574a35ff3bf92..e9549effe73b24e7abeca5b6cc56da90e5f9c8b0 100644 --- a/src/conference.cpp +++ b/src/conference.cpp @@ -150,10 +150,19 @@ bool Conference::toggleRecording() return startRecording; } -std::string Conference::getConfID() const { +const std::string& +Conference::getConfID() const { return id_; } +void +Conference::switchInput(const std::string& input) +{ +#ifdef ENABLE_VIDEO + getVideoMixer()->switchInput(input); +#endif +} + #ifdef ENABLE_VIDEO std::shared_ptr<video::VideoMixer> Conference::getVideoMixer() { diff --git a/src/conference.h b/src/conference.h index f4344bb7f479295fb30cf4229d9c2018aa561fe8..caebbf7fe56585a981e663e14f897fd1a8288c6a 100644 --- a/src/conference.h +++ b/src/conference.h @@ -58,7 +58,7 @@ class Conference : public Recordable { /** * Return the conference id */ - std::string getConfID() const; + const std::string& getConfID() const; /** * Return the current conference state @@ -104,7 +104,9 @@ class Conference : public Recordable { /** * Start/stop recording toggle */ - virtual bool toggleRecording(); + bool toggleRecording() override; + + void switchInput(const std::string& input); #ifdef ENABLE_VIDEO std::shared_ptr<video::VideoMixer> getVideoMixer(); diff --git a/src/manager.cpp b/src/manager.cpp index 5ec1faa85ac3265c0f100f01b36f947842b38948..2ed1d8b6dd548150b0126a4ddc42f6d96f43b050 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -2236,13 +2236,14 @@ Manager::getCurrentAudioDevicesIndex() bool Manager::switchInput(const std::string& call_id, const std::string& res) { - auto call = getCallFromCallID(call_id); - if (!call) { - JAMI_ERR("Call %s is NULL", call_id.c_str()); - return false; + if (auto conf = getConferenceFromID(call_id)) { + conf->switchInput(res); + return true; + } else if (auto call = getCallFromCallID(call_id)) { + call->switchInput(res); + return true; } - call->switchInput(res); - return true; + return false; } int diff --git a/src/media/video/video_mixer.cpp b/src/media/video/video_mixer.cpp index 687fa477c3c88f47b6f5ed5bfd69ded928a070ec..b283c847ab1ae7607ab799a2fc8cd45d1c370101 100644 --- a/src/media/video/video_mixer.cpp +++ b/src/media/video/video_mixer.cpp @@ -88,6 +88,15 @@ VideoMixer::~VideoMixer() loop_.join(); } +void +VideoMixer::switchInput(const std::string& input) +{ + if (auto local = videoLocal_) { + if (auto localInput = std::dynamic_pointer_cast<VideoInput>(local)) + localInput->switchInput(input); + } +} + void VideoMixer::attached(Observable<std::shared_ptr<MediaFrame>>* ob) { diff --git a/src/media/video/video_mixer.h b/src/media/video/video_mixer.h index db32f777f69be2fa42cc922424ac32a92f721cdd..3fd3c8a807ec50ba8d402210d81e2f21cea06238 100644 --- a/src/media/video/video_mixer.h +++ b/src/media/video/video_mixer.h @@ -54,6 +54,8 @@ public: void attached(Observable<std::shared_ptr<MediaFrame>>* ob) override; void detached(Observable<std::shared_ptr<MediaFrame>>* ob) override; + void switchInput(const std::string& input); + private: NON_COPYABLE(VideoMixer);