From dd6199acac4890a593e9fa55391b4ade6a0413de Mon Sep 17 00:00:00 2001 From: philippegorley Date: Mon, 3 Dec 2018 20:01:41 -0500 Subject: [PATCH] recorder: make adding streams public Instead of casting the observable object in the attached callback, have the recorder's owner add the streams manually. Change-Id: I5c79e32e470364b0c6a4253f50357a4bafade769 --- src/media/audio/audio_rtp_session.cpp | 8 ++++++-- src/media/localrecorder.cpp | 5 +++++ src/media/media_recorder.cpp | 26 ++++---------------------- src/media/media_recorder.h | 5 ++--- src/media/video/video_rtp_session.cpp | 8 ++++++-- 5 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/media/audio/audio_rtp_session.cpp b/src/media/audio/audio_rtp_session.cpp index 93613fb1a..e7f16077a 100644 --- a/src/media/audio/audio_rtp_session.cpp +++ b/src/media/audio/audio_rtp_session.cpp @@ -196,10 +196,14 @@ AudioRtpSession::setMuted(bool isMuted) void AudioRtpSession::initRecorder(std::shared_ptr& rec) { - if (receiveThread_) + if (receiveThread_) { receiveThread_->attach(rec.get()); - if (auto input = ring::getAudioInput(callID_)) + rec->addStream(receiveThread_->getInfo()); + } + if (auto input = ring::getAudioInput(callID_)) { input->attach(rec.get()); + rec->addStream(input->getInfo()); + } } void diff --git a/src/media/localrecorder.cpp b/src/media/localrecorder.cpp index 2aaebc94f..8eaed6c99 100644 --- a/src/media/localrecorder.cpp +++ b/src/media/localrecorder.cpp @@ -73,6 +73,7 @@ LocalRecorder::startRecording() audioInput_ = ring::getAudioInput(path_); audioInput_->setFormat(AudioFormat::STEREO()); + recorder_->addStream(audioInput_->getInfo()); audioInput_->attach(recorder_.get()); #ifdef RING_VIDEO @@ -80,6 +81,7 @@ LocalRecorder::startRecording() if (!isAudioOnly_) { videoInput_ = std::static_pointer_cast(ring::getVideoCamera()); if (videoInput_) { + recorder_->addStream(videoInput_->getInfo()); videoInput_->attach(recorder_.get()); } else { RING_ERR() << "Unable to record video (no video input)"; @@ -96,6 +98,9 @@ LocalRecorder::stopRecording() { Recordable::stopRecording(); Manager::instance().getRingBufferPool().unBindHalfDuplexOut(path_, RingBufferPool::DEFAULT_ID); + audioInput_->detach(recorder_.get()); + if (videoInput_) + videoInput_->detach(recorder_.get()); audioInput_.reset(); videoInput_.reset(); } diff --git a/src/media/media_recorder.cpp b/src/media/media_recorder.cpp index 82dc9e557..c182b673e 100644 --- a/src/media/media_recorder.cpp +++ b/src/media/media_recorder.cpp @@ -150,17 +150,6 @@ MediaRecorder::update(Observable>* ob, const std::sh recordData(a->pointer(), streams_[name]); } -void MediaRecorder::attached(Observable>* ob) -{ - MediaStream ms; - if (auto receiver = dynamic_cast(ob)) - ms = receiver->getInfo(); - else if (auto input = dynamic_cast(ob)) - ms = input->getInfo(); - if (addStream(ms) >= 0) - hasAudio_ = true; -} - void MediaRecorder::update(Observable>* ob, const std::shared_ptr& v) { std::string name; @@ -171,17 +160,6 @@ void MediaRecorder::update(Observable>* ob, const st recordData(v->pointer(), streams_[name]); } -void MediaRecorder::attached(Observable>* ob) -{ - MediaStream ms; - if (auto receiver = dynamic_cast(ob)) - ms = receiver->getInfo(); - else if (auto input = dynamic_cast(ob)) - ms = input->getInfo(); - if (addStream(ms) >= 0) - hasVideo_ = true; -} - int MediaRecorder::addStream(const MediaStream& ms) { @@ -192,6 +170,10 @@ MediaRecorder::addStream(const MediaStream& ms) if (streams_.insert(std::make_pair(ms.name, ms)).second) { RING_DBG() << "Recorder input #" << streams_.size() << ": " << ms; + if (ms.isVideo) + hasVideo_ = true; + else + hasAudio_ = true; return 0; } else { RING_ERR() << "Could not add stream '" << ms.name << "' to record"; diff --git a/src/media/media_recorder.h b/src/media/media_recorder.h index 4c0b0c0d3..7dd4d1faa 100644 --- a/src/media/media_recorder.h +++ b/src/media/media_recorder.h @@ -70,19 +70,18 @@ public: void stopRecording(); + int addStream(const MediaStream& ms); + /* Observer methods*/ void update(Observable>* ob, const std::shared_ptr& a) override; - void attached(Observable>* ob) override; void update(Observable>* ob, const std::shared_ptr& v) override; - void attached(Observable>* ob) override; private: NON_COPYABLE(MediaRecorder); int recordData(AVFrame* frame, const MediaStream& ms); - int addStream(const MediaStream& ms); int initRecord(); MediaStream setupVideoOutput(); std::string buildVideoFilter(const std::vector& peers, const MediaStream& local) const; diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp index 07818aad6..9cf785605 100644 --- a/src/media/video/video_rtp_session.cpp +++ b/src/media/video/video_rtp_session.cpp @@ -567,10 +567,14 @@ VideoRtpSession::processPacketLoss() void VideoRtpSession::initRecorder(std::shared_ptr& rec) { - if (receiveThread_) + if (receiveThread_) { receiveThread_->attach(rec.get()); - if (auto vidInput = std::static_pointer_cast(videoLocal_)) + rec->addStream(receiveThread_->getInfo()); + } + if (auto vidInput = std::static_pointer_cast(videoLocal_)) { vidInput->attach(rec.get()); + rec->addStream(vidInput->getInfo()); + } } void -- GitLab