std::shared_ptr<diagnostics::graph> graph_;\r
boost::timer perf_timer_;\r
\r
- tbb::concurrent_bounded_queue<std::shared_ptr<const core::read_frame>> frame_buffer_;\r
+ boost::unique_future<void> active_;\r
\r
std::shared_ptr<CBlueVelvet4> blue_;\r
\r
\r
const bool embedded_audio_;\r
\r
- tbb::atomic<bool> is_running_;\r
executor executor_;\r
public:\r
bluefish_consumer(const core::video_format_desc& format_desc, unsigned int device_index, bool embedded_audio) \r
, embedded_audio_(embedded_audio)\r
, executor_(print(), true)\r
{\r
- is_running_ = true;\r
- frame_buffer_.set_capacity(1);\r
-\r
if(!BlueVelvetFactory4 || (embedded_audio_ && (!encode_hanc_frame || !encode_hanc_frame)))\r
BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Bluefish drivers not found."));\r
\r
\r
for(size_t n = 0; n < reserved_frames_.size(); ++n)\r
reserved_frames_[n] = std::make_shared<blue_dma_buffer>(format_desc_.size, n); \r
+\r
+ active_ = executor_.begin_invoke([]{});\r
\r
CASPAR_LOG(info) << print() << TEXT(" Successfully initialized for ") << format_desc_ << TEXT(".");\r
}\r
\r
~bluefish_consumer()\r
{\r
- is_running_ = false;\r
- frame_buffer_.clear();\r
executor_.clear();\r
executor_.invoke([&]\r
{\r
CASPAR_LOG(error)<< print() << TEXT(" Failed to disable video output."); \r
}\r
\r
- virtual void send(const safe_ptr<const core::read_frame>& frame)\r
+ void send(const safe_ptr<const core::read_frame>& frame)\r
{ \r
static std::vector<short> silence(MAX_HANC_BUFFER_SIZE, 0);\r
\r
- if(!is_running_)\r
- return;\r
-\r
- frame_buffer_.push(frame);\r
- executor_.begin_invoke([this]\r
+ active_.get();\r
+ active_ = executor_.begin_invoke([=]\r
{\r
try\r
{\r
const size_t audio_samples = static_cast<size_t>(48000.0 / format_desc_.fps);\r
const size_t audio_nchannels = 2;\r
-\r
- std::shared_ptr<const core::read_frame> frame;\r
- frame_buffer_.pop(frame);\r
-\r
+ \r
fast_memcpy(reserved_frames_.front()->image_data(), frame->image_data().begin(), frame->image_data().size());\r
\r
if(embedded_audio_)\r
});\r
}\r
\r
- virtual size_t buffer_depth() const{return 1;}\r
-\r
void encode_hanc(BLUE_UINT32* hanc_data, void* audio_data, size_t audio_samples, size_t audio_nchannels)\r
{ \r
auto card_type = blue_->has_video_cardtype();\r
: device_index_(device_index)\r
, embedded_audio_(embedded_audio){}\r
\r
- void initialize(const core::video_format_desc& format_desc)\r
+ virtual void initialize(const core::video_format_desc& format_desc)\r
{\r
consumer_.reset(new bluefish_consumer(format_desc, device_index_, embedded_audio_));\r
}\r
\r
- void send(const safe_ptr<const core::read_frame>& frame)\r
+ virtual void send(const safe_ptr<const core::read_frame>& frame)\r
{\r
consumer_->send(frame);\r
}\r
\r
- std::wstring print() const\r
+ virtual std::wstring print() const\r
{\r
return consumer_->print();\r
}\r