15 template <
class SequencerClock >
19 explicit clock(
const SequencerClock& sequencer_clock )
20 : sequencer_clock_( sequencer_clock )
24 explicit clock( SequencerClock&& sequencer_clock )
25 : sequencer_clock_(
std::move( sequencer_clock ) )
31 std::lock_guard lock{clock_mutex_};
33 sequencer_clock_.start();
38 std::lock_guard lock{clock_mutex_};
40 sequencer_clock_.stop();
45 std::lock_guard lock{clock_mutex_};
47 sequencer_clock_.reset();
52 std::lock_guard lock{clock_mutex_};
55 sequencer_clock_.stop();
65 std::lock_guard lock( clock_mutex_ );
66 offset_ = now_as_beat_duration();
67 sequencer_clock_.reset();
68 sequencer_clock_.start();
74 return sequencer_clock_.is_running();
77 template <
class Sender >
78 void run(
const Sender& sender )
80 update_clock_base( 0.0_beats, sender );
83 std::lock_guard lock{clock_mutex_};
84 update_clock_base( now_as_beat_duration(), sender );
96 ( sequencer_clock_.now() -
typename SequencerClock::time_point{} ) * tempo_;
99 template <
class Sender >
100 void update_clock_base(
beat_duration dt,
const Sender& sender )
103 clock_base_.
update( t, sender );
106 std::mutex clock_mutex_;
107 SequencerClock sequencer_clock_;
111 bool shut_down_{
false};
119 return clock{sequencer_clock_type{underlying_clock_type{}}};
122 template <
class M
idiClock,
class Sender >
125 std::promise< void > controller_ready_promise;
126 const auto controller_ready = controller_ready_promise.get_future();
128 std::async( std::launch::async, [sender, &midi_clock, &controller_ready_promise] {
129 controller_ready_promise.set_value();
130 midi_clock.run( sender );
135 controller_ready.wait();
Definition: clock_base.hpp:8
void stop()
Definition: clock.hpp:36
constexpr void start() noexcept
Definition: clock_base.hpp:63
Definition: beat_duration.hpp:106
constexpr beat_duration tick() const noexcept
Definition: clock_base.hpp:78
Definition: beat_duration.hpp:13
constexpr int pulses_per_quarter_note() const noexcept
Definition: clock.hpp:58
std::chrono::duration< double, std::milli > milliseconds
Definition: units.hpp:7
Definition: beats_per_minute.hpp:8
Definition: sequencer_clock.hpp:12
Definition: chrono_adapter.hpp:9
bool is_running() const noexcept
Definition: clock.hpp:72
constexpr int pulses_per_quarter_note() const noexcept
Definition: clock_base.hpp:73
void reset() noexcept
Definition: clock_base.hpp:56
void start()
Definition: clock.hpp:29
void update(beat_time_point t, Sender sender)
Definition: clock_base.hpp:24
void reset()
Definition: clock.hpp:43
constexpr void stop() noexcept
Definition: clock_base.hpp:68
Definition: beat_time_point.hpp:8
void shut_down()
Definition: clock.hpp:50
void run(const Sender &sender)
Definition: clock.hpp:78
clock(SequencerClock &&sequencer_clock)
Definition: clock.hpp:24
auto start_clock_in_thread(MidiClock &midi_clock, const Sender &sender)
Definition: clock.hpp:123
void set_tempo(beats_per_minute tempo)
Definition: clock.hpp:63
auto make_clock()
Definition: clock.hpp:114
clock(const SequencerClock &sequencer_clock)
Definition: clock.hpp:19