]> git.sesse.net Git - casparcg/commitdiff
2.1.0: -frame_consumer: Asynchronous destruction.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 5 Feb 2012 17:28:48 +0000 (17:28 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 5 Feb 2012 17:28:48 +0000 (17:28 +0000)
       -frame_producer: Refactored asynchronous destruction.

git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@2262 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

12 files changed:
core/consumer/cadence_guard.cpp [deleted file]
core/consumer/cadence_guard.h [deleted file]
core/consumer/frame_consumer.cpp
core/consumer/output.cpp
core/core.vcxproj
core/core.vcxproj.filters
core/producer/frame_producer.cpp
modules/bluefish/consumer/bluefish_consumer.cpp
modules/decklink/consumer/decklink_consumer.cpp
modules/ffmpeg/consumer/ffmpeg_consumer.cpp
modules/oal/consumer/oal_consumer.cpp
modules/screen/consumer/screen_consumer.cpp

diff --git a/core/consumer/cadence_guard.cpp b/core/consumer/cadence_guard.cpp
deleted file mode 100644 (file)
index 774b927..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#include "../stdafx.h"\r
-\r
-#include "cadence_guard.h"\r
-\r
-#include "frame_consumer.h"\r
-\r
-#include <common/env.h>\r
-#include <common/spl/memory.h>\r
-#include <common/except.h>\r
-\r
-#include <core/video_format.h>\r
-#include <core/frame/data_frame.h>\r
-\r
-namespace caspar { namespace core {\r
-\r
-// This class is used to guarantee that audio cadence is correct. This is important for NTSC audio.\r
-class cadence_guard : public frame_consumer\r
-{\r
-       spl::shared_ptr<frame_consumer>         consumer_;\r
-       std::vector<int>                                audio_cadence_;\r
-       boost::circular_buffer<int>     sync_buffer_;\r
-public:\r
-       cadence_guard(const spl::shared_ptr<frame_consumer>& consumer)\r
-               : consumer_(consumer)\r
-       {\r
-       }\r
-       \r
-       virtual void initialize(const video_format_desc& format_desc, int channel_index) override\r
-       {\r
-               audio_cadence_  = format_desc.audio_cadence;\r
-               sync_buffer_    = boost::circular_buffer<int>(format_desc.audio_cadence.size());\r
-               consumer_->initialize(format_desc, channel_index);\r
-       }\r
-\r
-       virtual bool send(const spl::shared_ptr<const data_frame>& frame) override\r
-       {               \r
-               if(audio_cadence_.size() == 1)\r
-                       return consumer_->send(frame);\r
-\r
-               bool result = true;\r
-               \r
-               if(boost::range::equal(sync_buffer_, audio_cadence_) && audio_cadence_.front() == static_cast<int>(frame->audio_data().size())) \r
-               {       \r
-                       // Audio sent so far is in sync, now we can send the next chunk.\r
-                       result = consumer_->send(frame);\r
-                       boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
-               }\r
-               else\r
-                       CASPAR_LOG(trace) << print() << L" Syncing audio.";\r
-\r
-               sync_buffer_.push_back(static_cast<int>(frame->audio_data().size()));\r
-               \r
-               return result;\r
-       }\r
-\r
-       virtual std::wstring print() const override\r
-       {\r
-               return consumer_->print();\r
-       }\r
-\r
-       virtual boost::property_tree::wptree info() const override\r
-       {\r
-               return consumer_->info();\r
-       }\r
-\r
-       virtual bool has_synchronization_clock() const override\r
-       {\r
-               return consumer_->has_synchronization_clock();\r
-       }\r
-\r
-       virtual int buffer_depth() const override\r
-       {\r
-               return consumer_->buffer_depth();\r
-       }\r
-\r
-       virtual int index() const override\r
-       {\r
-               return consumer_->index();\r
-       }\r
-};\r
-\r
-spl::shared_ptr<frame_consumer> create_consumer_cadence_guard(const spl::shared_ptr<frame_consumer>& consumer)\r
-{\r
-       return spl::make_shared<cadence_guard>(std::move(consumer));\r
-}\r
-\r
-}}
\ No newline at end of file
diff --git a/core/consumer/cadence_guard.h b/core/consumer/cadence_guard.h
deleted file mode 100644 (file)
index 4354b37..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#pragma once\r
-\r
-#include <common/spl/memory.h>\r
-\r
-namespace caspar { namespace core {\r
-       \r
-spl::shared_ptr<struct frame_consumer> create_consumer_cadence_guard(const spl::shared_ptr<struct frame_consumer>& consumer);\r
-\r
-}}
\ No newline at end of file
index 7a4ae939a256ea6350f4d5dad640c8fdbf7e48c4..c27ff0a5ede38d5d1a30ab07042de6a0e5184bf3 100644 (file)
 \r
 #include "frame_consumer.h"\r
 \r
+#include <common/except.h>\r
+\r
+#include <core/video_format.h>\r
+#include <core/frame/data_frame.h>\r
+\r
+#include <common/concurrency/async.h>\r
+\r
 namespace caspar { namespace core {\r
                \r
 std::vector<const consumer_factory_t> g_factories;\r
@@ -32,6 +39,126 @@ void register_consumer_factory(const consumer_factory_t& factory)
        g_factories.push_back(factory);\r
 }\r
 \r
+class destroy_consumer_proxy : public frame_consumer\r
+{      \r
+       std::unique_ptr<std::shared_ptr<frame_consumer>> consumer_;\r
+public:\r
+       destroy_consumer_proxy(spl::shared_ptr<frame_consumer>&& consumer) \r
+               : consumer_(new std::shared_ptr<frame_consumer>(std::move(consumer)))\r
+       {\r
+       }\r
+\r
+       ~destroy_consumer_proxy()\r
+       {               \r
+               static tbb::atomic<int> counter = tbb::atomic<int>();\r
+                       \r
+               ++counter;\r
+               CASPAR_VERIFY(counter < 32);\r
+               \r
+               auto consumer = consumer_.release();\r
+               async([=]\r
+               {\r
+                       std::unique_ptr<std::shared_ptr<frame_consumer>> pointer_guard(consumer);\r
+\r
+                       auto str = (*consumer)->print();\r
+                       try\r
+                       {\r
+                               if(!consumer->unique())\r
+                                       CASPAR_LOG(trace) << str << L" Not destroyed on asynchronous destruction thread: " << consumer->use_count();\r
+                               else\r
+                                       CASPAR_LOG(trace) << str << L" Destroying on asynchronous destruction thread.";\r
+                       }\r
+                       catch(...){}\r
+\r
+                       pointer_guard.reset();\r
+\r
+                       --counter;\r
+               }); \r
+       }\r
+       \r
+       virtual bool send(const spl::shared_ptr<const struct data_frame>& frame)                                        { return (*consumer_)->send(frame);}\r
+       virtual void initialize(const struct video_format_desc& format_desc, int channel_index)         { return (*consumer_)->initialize(format_desc, channel_index);}\r
+       virtual std::wstring print() const                                                                                                                      { return (*consumer_)->print();}\r
+       virtual boost::property_tree::wptree info() const                                                                                       { return (*consumer_)->info();}\r
+       virtual bool has_synchronization_clock() const                                                                                          { return (*consumer_)->has_synchronization_clock();}\r
+       virtual int buffer_depth() const                                                                                                                        { return (*consumer_)->buffer_depth();}\r
+       virtual int index() const                                                                                                                                       { return (*consumer_)->index();}\r
+};\r
+\r
+class print_consumer_proxy : public frame_consumer\r
+{      \r
+       std::shared_ptr<frame_consumer> consumer_;\r
+public:\r
+       print_consumer_proxy(spl::shared_ptr<frame_consumer>&& consumer) \r
+               : consumer_(std::move(consumer))\r
+       {\r
+               CASPAR_LOG(info) << consumer_->print() << L" Initialized.";\r
+       }\r
+\r
+       ~print_consumer_proxy()\r
+       {               \r
+               auto str = consumer_->print();\r
+               CASPAR_LOG(trace) << str << L" Uninitializing.";\r
+               consumer_.reset();\r
+               CASPAR_LOG(info) << str << L" Uninitialized.";\r
+       }\r
+       \r
+       virtual bool send(const spl::shared_ptr<const struct data_frame>& frame)                                        { return consumer_->send(frame);}\r
+       virtual void initialize(const struct video_format_desc& format_desc, int channel_index)         { return consumer_->initialize(format_desc, channel_index);}\r
+       virtual std::wstring print() const                                                                                                                      { return consumer_->print();}\r
+       virtual boost::property_tree::wptree info() const                                                                                       { return consumer_->info();}\r
+       virtual bool has_synchronization_clock() const                                                                                          { return consumer_->has_synchronization_clock();}\r
+       virtual int buffer_depth() const                                                                                                                        { return consumer_->buffer_depth();}\r
+       virtual int index() const                                                                                                                                       { return consumer_->index();}\r
+};\r
+\r
+// This class is used to guarantee that audio cadence is correct. This is important for NTSC audio.\r
+class cadence_guard : public frame_consumer\r
+{\r
+       spl::shared_ptr<frame_consumer>         consumer_;\r
+       std::vector<int>                                audio_cadence_;\r
+       boost::circular_buffer<int>     sync_buffer_;\r
+public:\r
+       cadence_guard(const spl::shared_ptr<frame_consumer>& consumer)\r
+               : consumer_(consumer)\r
+       {\r
+       }\r
+       \r
+       virtual void initialize(const video_format_desc& format_desc, int channel_index) override\r
+       {\r
+               audio_cadence_  = format_desc.audio_cadence;\r
+               sync_buffer_    = boost::circular_buffer<int>(format_desc.audio_cadence.size());\r
+               consumer_->initialize(format_desc, channel_index);\r
+       }\r
+\r
+       virtual bool send(const spl::shared_ptr<const data_frame>& frame) override\r
+       {               \r
+               if(audio_cadence_.size() == 1)\r
+                       return consumer_->send(frame);\r
+\r
+               bool result = true;\r
+               \r
+               if(boost::range::equal(sync_buffer_, audio_cadence_) && audio_cadence_.front() == static_cast<int>(frame->audio_data().size())) \r
+               {       \r
+                       // Audio sent so far is in sync, now we can send the next chunk.\r
+                       result = consumer_->send(frame);\r
+                       boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
+               }\r
+               else\r
+                       CASPAR_LOG(trace) << print() << L" Syncing audio.";\r
+\r
+               sync_buffer_.push_back(static_cast<int>(frame->audio_data().size()));\r
+               \r
+               return result;\r
+       }\r
+\r
+       virtual std::wstring print() const override                                     {return consumer_->print(); }\r
+       virtual boost::property_tree::wptree info() const override      {return consumer_->info();      }\r
+       virtual bool has_synchronization_clock() const override         {return consumer_->has_synchronization_clock();}\r
+       virtual int buffer_depth() const override                                       {return consumer_->buffer_depth();}\r
+       virtual int index() const override                                                      {return consumer_->index();}\r
+};\r
+\r
 spl::shared_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)\r
 {\r
        if(params.empty())\r
@@ -54,7 +181,10 @@ spl::shared_ptr<core::frame_consumer> create_consumer(const std::vector<std::wst
        if(consumer == frame_consumer::empty())\r
                BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No match found for supplied commands. Check syntax."));\r
 \r
-       return consumer;\r
+       return spl::make_shared<destroy_consumer_proxy>(\r
+                       spl::make_shared<print_consumer_proxy>(\r
+                        spl::make_shared<cadence_guard>(\r
+                         std::move(consumer))));\r
 }\r
 \r
 const spl::shared_ptr<frame_consumer>& frame_consumer::empty()\r
index ec67d7c85db561e6bc08234eec6cdeb2cd9942af..6f72f6082601afe742fec08d14bca8e101f870f7 100644 (file)
 \r
 #include "frame_consumer.h"\r
 \r
-#include "cadence_guard.h"\r
-\r
 #include "../video_format.h"\r
 #include "../frame/data_frame.h"\r
 \r
+#include <common/concurrency/async.h>\r
 #include <common/concurrency/executor.h>\r
 #include <common/diagnostics/graph.h>\r
 #include <common/prec_timer.h>\r
@@ -51,13 +50,12 @@ namespace caspar { namespace core {
        \r
 struct output::impl\r
 {              \r
-       const int                                                                                       channel_index_;\r
-       video_format_desc                                                                       format_desc_;\r
+       const int                                                                                                       channel_index_;\r
+       video_format_desc                                                                                       format_desc_;\r
        std::map<int, spl::shared_ptr<frame_consumer>>                          consumers_;     \r
-       prec_timer                                                                                      sync_timer_;\r
+       prec_timer                                                                                                      sync_timer_;\r
        boost::circular_buffer<spl::shared_ptr<const data_frame>>       frames_;\r
-\r
-       executor                                                                                        executor_;              \r
+       executor                                                                                                        executor_;              \r
 public:\r
        impl(const video_format_desc& format_desc, int channel_index) \r
                : channel_index_(channel_index)\r
@@ -70,10 +68,9 @@ public:
        {               \r
                remove(index);\r
 \r
-               consumer = create_consumer_cadence_guard(consumer);\r
                consumer->initialize(format_desc_, channel_index_);\r
 \r
-               executor_.invoke([&]\r
+               executor_.begin_invoke([=]\r
                {\r
                        consumers_.insert(std::make_pair(index, consumer));\r
                        CASPAR_LOG(info) << print() << L" " << consumer->print() << L" Added.";\r
@@ -87,25 +84,12 @@ public:
 \r
        void remove(int index)\r
        {               \r
-               auto consumer = executor_.invoke([&]() -> std::shared_ptr<frame_consumer>\r
+               executor_.begin_invoke([=]\r
                {\r
-                       auto consumer = frame_consumer::empty();\r
                        auto it = consumers_.find(index);\r
                        if(it != consumers_.end())\r
-                       {\r
-                               consumer = it->second;\r
-                               consumers_.erase(it);\r
-                       }\r
-                       return consumer;\r
+                               consumers_.erase(it);                                   \r
                }, task_priority::high_priority);\r
-\r
-               // Destroy consumer on calling thread:\r
-               if(consumer)\r
-               {\r
-                       auto str = consumer->print();\r
-                       consumer.reset();\r
-                       CASPAR_LOG(info) << print() << L" " << str << L" Removed.";\r
-               }\r
        }\r
 \r
        void remove(const spl::shared_ptr<frame_consumer>& consumer)\r
index 20e6483e6b036e729444677753479f68e2bf86bf..27a634e50f5783cb6f7d79d9c3273d29364529a4 100644 (file)
     </Lib>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
-    <ClInclude Include="consumer\cadence_guard.h" />\r
     <ClInclude Include="frame\draw_frame.h" />\r
     <ClInclude Include="frame\data_frame.h" />\r
     <ClInclude Include="frame\frame_factory.h" />\r
     <ClInclude Include="StdAfx.h" />\r
   </ItemGroup>\r
   <ItemGroup>\r
-    <ClCompile Include="consumer\cadence_guard.cpp">\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
-      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
-    </ClCompile>\r
     <ClCompile Include="frame\data_frame.cpp">\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
index 65ab681dea81e002c17331f38d3020cd098106db..a0eef50ead516526976485ad088604132470e23a 100644 (file)
@@ -97,9 +97,6 @@
     <ClInclude Include="frame\draw_frame.h">\r
       <Filter>source\frame</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="consumer\cadence_guard.h">\r
-      <Filter>source\consumer</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="frame\write_frame.h">\r
       <Filter>source\frame</Filter>\r
     </ClInclude>\r
     <ClCompile Include="frame\data_frame.cpp">\r
       <Filter>source\frame</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="consumer\cadence_guard.cpp">\r
-      <Filter>source\consumer</Filter>\r
-    </ClCompile>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
index 7f3d0d26d0a522e93c7329682fba5612d48a6613..b33e9b1eca5261783f945897e666b16288cf7dae 100644 (file)
@@ -101,41 +101,29 @@ public:
        ~destroy_producer_proxy()\r
        {               \r
                static tbb::atomic<int> counter = tbb::atomic<int>();\r
-\r
-               try\r
-               {                               \r
-                       auto producer = producer_.release();\r
-                       ++counter;\r
-                       CASPAR_VERIFY(counter < 32);\r
-\r
-                       async([=]\r
-                       {\r
-                               std::unique_ptr<std::shared_ptr<frame_producer>> producer2(producer);\r
-\r
-                               auto str = (*producer2)->print();\r
-                               try\r
-                               {\r
-                                       if(!producer->unique())\r
-                                               CASPAR_LOG(trace) << str << L" Not destroyed on asynchronous destruction thread: " << producer->use_count();\r
-                                       else\r
-                                               CASPAR_LOG(trace) << str << L" Destroying on asynchronous destruction thread.";\r
-                               }\r
-                               catch(...){}\r
-                                                               \r
-                               producer2.reset();\r
-\r
-                               --counter;\r
-                       }); \r
-               }\r
-               catch(...)\r
+               \r
+               ++counter;\r
+               CASPAR_VERIFY(counter < 32);\r
+               \r
+               auto producer = producer_.release();\r
+               async([=]\r
                {\r
-                       CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       std::unique_ptr<std::shared_ptr<frame_producer>> pointer_guard(producer);\r
+\r
+                       auto str = (*producer)->print();\r
                        try\r
                        {\r
-                               producer_.reset();\r
+                               if(!producer->unique())\r
+                                       CASPAR_LOG(trace) << str << L" Not destroyed on asynchronous destruction thread: " << producer->use_count();\r
+                               else\r
+                                       CASPAR_LOG(trace) << str << L" Destroying on asynchronous destruction thread.";\r
                        }\r
                        catch(...){}\r
-               }\r
+\r
+                       pointer_guard.reset();\r
+\r
+                       --counter;\r
+               }); \r
        }\r
 \r
        virtual spl::shared_ptr<draw_frame>                                                             receive(int hints) override                                                                                             {return (*producer_)->receive(hints);}\r
@@ -201,7 +189,9 @@ spl::shared_ptr<core::frame_producer> do_create_producer(const spl::shared_ptr<f
        if(producer == frame_producer::empty())\r
                return producer;\r
                \r
-       return spl::make_shared<destroy_producer_proxy>(spl::make_shared<print_producer_proxy>(std::move(producer)));\r
+       return spl::make_shared<destroy_producer_proxy>(\r
+                       spl::make_shared<print_producer_proxy>(\r
+                        std::move(producer)));\r
 }\r
 \r
 spl::shared_ptr<core::frame_producer> create_producer(const spl::shared_ptr<frame_factory>& my_frame_factory, const std::vector<std::wstring>& params)\r
index aa192a2071f3023ae56b826cb2bdd1e1a22121a4..85ac6d12f6b0dbb806d482099fb9f4b67221bad3 100644 (file)
@@ -309,23 +309,12 @@ public:
        {\r
        }\r
        \r
-       ~bluefish_consumer_proxy()\r
-       {\r
-               if(consumer_)\r
-               {\r
-                       auto str = print();\r
-                       consumer_.reset();\r
-                       CASPAR_LOG(info) << str << L" Successfully Uninitialized.";     \r
-               }\r
-       }\r
-\r
        // frame_consumer\r
        \r
        virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override\r
        {\r
                consumer_.reset(new bluefish_consumer(format_desc, device_index_, embedded_audio_, key_only_, channel_index));\r
-               audio_cadence_ = format_desc.audio_cadence;\r
-               CASPAR_LOG(info) << print() << L" Successfully Initialized.";   \r
+               audio_cadence_ = format_desc.audio_cadence;     \r
        }\r
        \r
        virtual bool send(const spl::shared_ptr<const core::data_frame>& frame) override\r
index 0c7e32e0a3d511dcf8020d45ee4148a43f29b9e4..a8296a832d0b5aea1cc25df33c6addbfca138adb 100644 (file)
@@ -502,12 +502,6 @@ public:
        {\r
                executor_.invoke([=]\r
                {\r
-                       if(consumer_)\r
-                       {\r
-                               auto str = print();\r
-                               consumer_.reset();\r
-                               CASPAR_LOG(info) << str << L" Successfully Uninitialized.";     \r
-                       }\r
                        ::CoUninitialize();\r
                });\r
        }\r
@@ -519,9 +513,7 @@ public:
                executor_.invoke([=]\r
                {\r
                        consumer_.reset(new decklink_consumer(config_, format_desc, channel_index));            \r
-                       audio_cadence_ = format_desc.audio_cadence;             \r
-\r
-                       CASPAR_LOG(info) << print() << L" Successfully Initialized.";   \r
+                       audio_cadence_ = format_desc.audio_cadence;                     \r
                });\r
        }\r
        \r
index 3aa64e29fe70e6d5230ebb267a440e453c445f72..4569723fe64292465a23779c80375a44a483d840 100644 (file)
@@ -130,8 +130,6 @@ public:
                        THROW_ON_ERROR2(avio_open(&oc_->pb, u8(filename_).c_str(), URL_WRONLY), "[ffmpeg_consumer]");\r
                                \r
                THROW_ON_ERROR2(av_write_header(oc_.get()), "[ffmpeg_consumer]");\r
-\r
-               CASPAR_LOG(info) << print() << L" Successfully Initialized.";   \r
        }\r
 \r
        ~ffmpeg_consumer()\r
@@ -151,8 +149,6 @@ public:
                          \r
                if (!(oc_->oformat->flags & AVFMT_NOFILE)) \r
                        LOG_ON_ERROR2(avio_close(oc_->pb), "[ffmpeg_consumer]"); // Close the output ffmpeg.\r
-\r
-               CASPAR_LOG(info) << print() << L" Successfully Uninitialized."; \r
        }\r
                        \r
        std::wstring print() const\r
index c1bff2b36e78d5eaebfb7a923793abfe8f0ae69e..b9fedb755e4fd4806c953b35c3db42be3b5aab19 100644 (file)
@@ -78,8 +78,6 @@ public:
                Stop();\r
                input_.try_push(std::make_shared<audio_buffer_16>());\r
                input_.try_push(std::make_shared<audio_buffer_16>());\r
-\r
-               CASPAR_LOG(info) << print() << L" Successfully Uninitialized."; \r
        }\r
 \r
        // frame consumer\r
@@ -95,7 +93,6 @@ public:
                        sf::SoundStream::Initialize(2, 48000);\r
                        Play();         \r
                }\r
-               CASPAR_LOG(info) << print() << " Sucessfully Initialized.";\r
        }\r
        \r
        virtual bool send(const spl::shared_ptr<const core::data_frame>& frame) override\r
index 1e7f78147a550cc9ca53e6dbf364b716677ae72f..af434adc6cd735a22bf5a567e361ba89cc3135f8 100644 (file)
@@ -467,23 +467,12 @@ public:
        screen_consumer_proxy(const configuration& config)\r
                : config_(config){}\r
        \r
-       ~screen_consumer_proxy()\r
-       {\r
-               if(consumer_)\r
-               {\r
-                       auto str = print();\r
-                       consumer_.reset();\r
-                       CASPAR_LOG(info) << str << L" Successfully Uninitialized.";     \r
-               }\r
-       }\r
-\r
        // frame_consumer\r
 \r
        virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override\r
        {\r
                consumer_.reset();\r
                consumer_.reset(new screen_consumer(config_, format_desc, channel_index));\r
-               CASPAR_LOG(info) << print() << L" Successfully Initialized.";   \r
        }\r
        \r
        virtual bool send(const spl::shared_ptr<const core::data_frame>& frame) override\r