\r
void add(safe_ptr<frame_consumer>&& consumer)\r
{ \r
- executor_.invoke([&]\r
- {\r
- consumers_.erase(consumer->index());\r
- }, high_priority);\r
+ remove(consumer->index());\r
\r
consumer = create_consumer_cadence_guard(std::move(consumer));\r
consumer->initialize(format_desc_, channel_index_);\r
executor_.invoke([&]\r
{\r
consumers_.insert(std::make_pair(consumer->index(), consumer));\r
-\r
CASPAR_LOG(info) << print() << L" " << consumer->print() << L" Added.";\r
}, high_priority);\r
}\r
\r
void remove(int index)\r
- {\r
+ { \r
+ // Destroy consumer on calling thread:\r
+ std::shared_ptr<frame_consumer> old_consumer;\r
+\r
executor_.invoke([&]\r
{\r
auto it = consumers_.find(index);\r
if(it != consumers_.end())\r
{\r
- CASPAR_LOG(info) << print() << L" " << it->second->print() << L" Removed.";\r
+ old_consumer = it->second;\r
consumers_.erase(it);\r
}\r
}, high_priority);\r
+\r
+ if(old_consumer)\r
+ {\r
+ auto str = old_consumer->print();\r
+ old_consumer.reset();\r
+ CASPAR_LOG(info) << print() << L" " << str << L" Removed.";\r
+ }\r
}\r
\r
void set_video_format_desc(const video_format_desc& format_desc)\r
int channel_index_;\r
\r
tbb::concurrent_bounded_queue<std::shared_ptr<audio_buffer_16>> input_;\r
- boost::circular_buffer<audio_buffer_16> container_;\r
+ boost::circular_buffer<audio_buffer_16> container_;\r
tbb::atomic<bool> is_running_;\r
core::audio_buffer temp;\r
\r
{\r
graph_->add_guide("tick-time", 0.5);\r
graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f)); \r
- graph_->set_text(print());\r
diagnostics::register_graph(graph_);\r
\r
is_running_ = true;\r
{\r
format_desc_ = format_desc; \r
channel_index_ = channel_index;\r
+ graph_->set_text(print());\r
+\r
if(Status() != Playing)\r
{\r
sf::SoundStream::Initialize(2, 48000);\r