std::future<bool> send(core::const_frame frame) override { CASPAR_VERIFY(format_desc_.height * format_desc_.width * 4 == frame.image_data(0).size()); graph_->set_value("tick-time", tick_timer_.elapsed() * format_desc_.fps * 0.5); tick_timer_.restart(); caspar::timer frame_timer; { auto audio_buffer = core::audio_32_to_16(frame.audio_data()); airsend::add_audio(air_send_.get(), audio_buffer.data(), static_cast<int>(audio_buffer.size()) / format_desc_.audio_channels); } { connected_ = airsend::add_frame_bgra(air_send_.get(), frame.image_data(0).begin()); } graph_->set_text(print()); graph_->set_value("frame-time", frame_timer.elapsed() * format_desc_.fps * 0.5); return make_ready_future(true); }
draw_frame receive_impl(int nb_samples) override { core::draw_frame frame; if (!buffer_.try_pop(frame)) { graph_->set_tag(diagnostics::tag_severity::WARNING, "late-frame"); } else { frame_ = frame; } graph_->set_value("consume-time", consume_timer_.elapsed() * route_->format_desc.fps * 0.5); consume_timer_.restart(); return frame; }
route_producer(std::shared_ptr<route> route, int buffer) : route_(route) , connection_(route_->signal.connect([this](const core::draw_frame& frame) { if (!buffer_.try_push(frame)) { graph_->set_tag(diagnostics::tag_severity::WARNING, "dropped-frame"); } graph_->set_value("produce-time", produce_timer_.elapsed() * route_->format_desc.fps * 0.5); produce_timer_.restart(); })) { buffer_.set_capacity(buffer > 0 ? buffer : route->format_desc.field_count); graph_->set_color("late-frame", diagnostics::color(0.6f, 0.3f, 0.3f)); graph_->set_color("produce-time", caspar::diagnostics::color(0.0f, 1.0f, 0.0f)); graph_->set_color("consume-time", caspar::diagnostics::color(1.0f, 0.4f, 0.0f, 0.8f)); graph_->set_color("dropped-frame", diagnostics::color(0.3f, 0.6f, 0.3f)); graph_->set_text(print()); diagnostics::register_graph(graph_); CASPAR_LOG(debug) << print() << L" Initialized"; }