summaryrefslogtreecommitdiff
path: root/libs/ardour/ticker.cc
diff options
context:
space:
mode:
authorMichael Fisher <mfisher31@gmail.com>2013-08-01 00:09:42 -0500
committerMichael Fisher <mfisher31@gmail.com>2013-08-02 08:59:32 -0500
commit6ffdeaa9f87fdf7a2f2cfbc28879cbc3307a92ad (patch)
treeb2beb9ccb914b1ec87eb92c13375c76afda5fa51 /libs/ardour/ticker.cc
parent6088446d8fb6dffa336e0bbbd7cbe68b13681942 (diff)
- Send position data from internal position class
- Proper midi beat conversions for all time signatures - Disable responding to Session::PositionChanged in place of Session::Located.
Diffstat (limited to 'libs/ardour/ticker.cc')
-rw-r--r--libs/ardour/ticker.cc83
1 files changed, 37 insertions, 46 deletions
diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc
index d140b9fceb..c252bc6cf7 100644
--- a/libs/ardour/ticker.cc
+++ b/libs/ardour/ticker.cc
@@ -32,7 +32,7 @@
#include "ardour/debug.h"
using namespace ARDOUR;
-
+using namespace PBD;
/** MIDI Clock Position tracking */
class MidiClockTicker::Position : public Timecode::BBT_Time
@@ -57,8 +57,9 @@ public:
}
if (frame != fr) {
+ frame = fr;
- s->bbt_time (fr, *this);
+ s->bbt_time (this->frame, *this);
const TempoMap& tempo = s->tempo_map();
@@ -66,8 +67,6 @@ public:
const double divisor = tempo.meter_at(frame).note_divisor();
const double qnote_scale = divisor * 0.25f;
- frame = fr;
-
/* Midi Beats in terms of Song Position Pointer is equivalent to total
sixteenth notes at 'time' */
@@ -80,8 +79,6 @@ public:
didit = true;
}
- print (std::clog);
-
return didit;
}
@@ -91,7 +88,7 @@ public:
double midi_clocks;
void print (std::ostream& s) {
- s << "MCLK Position: frames: " << frame << " midi beats: " << midi_beats << " speed: " << speed << std::endl;
+ s << "frames: " << frame << " midi beats: " << midi_beats << " speed: " << speed;
}
};
@@ -132,19 +129,18 @@ MidiClockTicker::set_session (Session* s)
void
MidiClockTicker::session_located()
{
+ DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Session Located: %1, speed: %2\n", _session->transport_frame(), _session->transport_speed()));
+
if (0 == _session || ! _pos->sync (_session)) {
return;
}
_last_tick = _pos->frame;
- // WIP - Testing code
- if (0 == _pos->frame) {
- std::clog << "zero frame\n";
- if (1.0f == _pos->speed) {
- std::clog << "normal speed:\n";
-
- }
+ if (_pos->speed == 0.0f && Config->get_send_midi_clock()) {
+ uint32_t where = std::floor (_pos->midi_beats);
+ send_position_event (where, 0);
+ return;
}
}
@@ -174,48 +170,52 @@ MidiClockTicker::transport_state_changed()
return;
}
- float speed = _session->transport_speed();
- framepos_t position = _session->transport_frame();
+ if (! _pos->sync (_session)) {
+ return;
+ }
DEBUG_TRACE (PBD::DEBUG::MidiClock,
- string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n", speed, position, _session->get_play_loop(), position)
+ string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n",
+ _pos->speed, _pos->frame, _session->get_play_loop(), _pos->frame)
);
- if (speed == 1.0f) {
- _last_tick = position;
+ _last_tick = _pos->frame;
- if (!Config->get_send_midi_clock())
- return;
+ if (! Config->get_send_midi_clock()) {
+ return;
+ }
+
+ if (_pos->speed == 1.0f) {
if (_session->get_play_loop()) {
assert(_session->locations()->auto_loop_location());
- if (position == _session->locations()->auto_loop_location()->start()) {
+
+ if (_pos->frame == _session->locations()->auto_loop_location()->start()) {
send_start_event(0);
} else {
send_continue_event(0);
}
- } else if (position == 0) {
+
+ } else if (_pos->frame == 0) {
send_start_event(0);
} else {
send_continue_event(0);
}
- send_midi_clock_event(0);
-
- } else if (speed == 0.0f) {
- if (!Config->get_send_midi_clock())
- return;
+ // send_midi_clock_event (0);
- send_stop_event(0);
- send_position_event (position, 0);
+ } else if (_pos->speed == 0.0f) {
+ send_stop_event (0);
+ send_position_event (std::floor (_pos->midi_beats), 0);
}
- tick (position);
+ // tick (_pos->frame);
}
void
-MidiClockTicker::position_changed (framepos_t position)
+MidiClockTicker::position_changed (framepos_t)
{
+#if 0
const double speed = _session->transport_speed();
DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Transport Position Change: %1, speed: %2\n", position, speed));
@@ -224,6 +224,7 @@ MidiClockTicker::position_changed (framepos_t position)
}
_last_tick = position;
+#endif
}
void
@@ -347,22 +348,12 @@ MidiClockTicker::send_stop_event (pframes_t offset)
}
void
-MidiClockTicker::send_position_event (framepos_t transport_position, pframes_t offset)
+MidiClockTicker::send_position_event (uint32_t midi_beats, pframes_t offset)
{
- if (_midi_port == 0 || _session == 0 || _session->engine().freewheeling()) {
+ if (!_midi_port) {
return;
}
- const TempoMap& tempo = _session->tempo_map();
-
- Timecode::BBT_Time time;
- _session->bbt_time (transport_position, time);
- const double beats_per_bar = tempo.meter_at(transport_position).divisions_per_bar();
-
- /* Midi Beats in terms of Song Position Pointer is equivalent to total
- sixteenth notes at 'time' */
- const uint32_t midi_beats = 4 * (((time.bars - 1) * beats_per_bar) + time.beats - 1);
-
/* can only use 14bits worth */
if (midi_beats > 0x3fff) {
return;
@@ -375,7 +366,7 @@ MidiClockTicker::send_position_event (framepos_t transport_position, pframes_t o
midi_beats & 0x3f80
};
- DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position: %1\n", midi_beats));
-
_midi_port->midimsg (msg, sizeof (msg), offset);
+
+ DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Song Position Sent: %1\n", midi_beats));
}