/* * Use atomic compare-and-swap to update val to * val + inc (*in log-space*). Update occurs in a loop in case other * threads update in the meantime. */ inline void incLoopLog(tbb::atomic<double>& val, double inc) { double oldMass = val.load(); double returnedMass = oldMass; double newMass{salmon::math::LOG_0}; do { oldMass = returnedMass; newMass = salmon::math::logAdd(oldMass, inc); returnedMass = val.compare_and_swap(newMass, oldMass); } while (returnedMass != oldMass); }
/* * Use atomic compare-and-swap to update val to * val + inc. Update occurs in a loop in case other * threads update in the meantime. */ inline void incLoop(tbb::atomic<double>& val, double inc) { double oldMass = val.load(); double returnedMass = oldMass; double newMass{oldMass + inc}; do { oldMass = returnedMass; newMass = oldMass + inc; returnedMass = val.compare_and_swap(newMass, oldMass); } while (returnedMass != oldMass); }
virtual boost::unique_future<bool> send(const safe_ptr<read_frame>& frame) override { bool pushed = frame_buffer_.try_push(frame); if (pushed && !first_frame_reported_) { first_frame_promise_.set_value(); first_frame_reported_ = true; } return caspar::wrap_as_future(is_running_.load()); }
virtual boost::unique_future<bool> send(const safe_ptr<core::read_frame>& frame) override { auto buffer = std::make_shared<audio_buffer_16>( core::audio_32_to_16(core::get_rearranged_and_mixed(frame->multichannel_view(), channel_layout_, channel_layout_.num_channels))); if (!input_.try_push(std::make_pair(frame, buffer))) graph_->set_tag("dropped-frame"); if (Status() != Playing && !started_) { sf::SoundStream::Initialize(2, format_desc_.audio_sample_rate); Play(); started_ = true; } return wrap_as_future(is_running_.load()); }