diff --git a/erizo/src/erizo/media/ExternalOutput.cpp b/erizo/src/erizo/media/ExternalOutput.cpp index be08e342d..45eb6910c 100644 --- a/erizo/src/erizo/media/ExternalOutput.cpp +++ b/erizo/src/erizo/media/ExternalOutput.cpp @@ -82,6 +82,7 @@ bool ExternalOutput::init() { m.hasVideo = false; m.hasAudio = false; recording_ = true; + closed_ = false; asyncTask([] (std::shared_ptr output) { output->initializePipeline(); }); @@ -105,6 +106,7 @@ void ExternalOutput::syncClose() { if (!recording_) { return; } + recording_ = false; // Stop our thread so we can safely nuke libav stuff and close our // our file. cond_.notify_one(); @@ -129,7 +131,7 @@ void ExternalOutput::syncClose() { } pipeline_initialized_ = false; - recording_ = false; + closed_ = true; ELOG_DEBUG("Closed Successfully"); } @@ -591,3 +593,4 @@ AVDictionary* ExternalOutput::genVideoMetadata() { return dict; } } // namespace erizo + diff --git a/erizo/src/erizo/media/ExternalOutput.h b/erizo/src/erizo/media/ExternalOutput.h index 63768e153..135ecf229 100644 --- a/erizo/src/erizo/media/ExternalOutput.h +++ b/erizo/src/erizo/media/ExternalOutput.h @@ -53,14 +53,14 @@ class ExternalOutput : public MediaSink, public RawDataReceiver, public Feedback void notifyUpdateToHandlers() override; - bool isRecording() { return recording_; } + bool hasClosed() { return closed_; } private: std::shared_ptr worker_; Pipeline::Ptr pipeline_; std::unique_ptr fec_receiver_; RtpPacketQueue audio_queue_, video_queue_; - std::atomic recording_, inited_; + std::atomic recording_, inited_, closed_; boost::mutex mtx_; // a mutex we use to signal our writer thread that data is waiting. boost::thread thread_; boost::condition_variable cond_; @@ -163,3 +163,4 @@ class ExternalOuputWriter : public OutboundHandler { } // namespace erizo #endif // ERIZO_SRC_ERIZO_MEDIA_EXTERNALOUTPUT_H_ + diff --git a/erizoAPI/ExternalOutput.cc b/erizoAPI/ExternalOutput.cc index e6fd36cd1..54387bbc2 100644 --- a/erizoAPI/ExternalOutput.cc +++ b/erizoAPI/ExternalOutput.cc @@ -23,7 +23,7 @@ class AsyncCloser : public Nan::AsyncWorker { ~AsyncCloser() {} void Execute() { external_output_->close(); - while (external_output_->isRecording()) { + while (!external_output_->hasClosed()) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } @@ -166,3 +166,4 @@ NAN_METHOD(ExternalOutput::init) { +