#include "ardour/session.h"
#include "ardour/tempo.h"
-#define DEBUG_TICKER 0
-
namespace ARDOUR
{
void MidiClockTicker::update_midi_clock_port()
{
- _jack_port = (MIDI::JACK_MidiPort*) _session->midi_clock_port();
+ _midi_port = _session->midi_clock_port();
}
void MidiClockTicker::transport_state_changed()
{
+ if (_session->exporting()) {
+ /* no midi clock during export, for now */
+ return;
+ }
+
float speed = _session->transport_speed();
nframes_t position = _session->transport_frame();
-#if DEBUG_TICKER
+#ifdef DEBUG_MIDI_CLOCK
cerr << "Transport state change, speed:" << speed << "position:" << position<< " play loop " << _session->get_play_loop() << endl;
#endif
if (speed == 1.0f) {
void MidiClockTicker::position_changed(nframes_t position)
{
-#if DEBUG_TICKER
+#ifdef DEBUG_MIDI_CLOCK
cerr << "Position changed:" << position << endl;
#endif
_last_tick = position;
void MidiClockTicker::transport_looped()
{
- nframes_t position = _session->transport_frame();
-
Location* loop_location = _session->locations()->auto_loop_location();
assert(loop_location);
-#if DEBUG_TICKER
- cerr << "Transport looped, position:" << position
+#ifdef DEBUG_MIDI_CLOCK
+ cerr << "Transport looped, position:" << _session->transport_frame()
<< " loop start " << loop_location->start( )
<< " loop end " << loop_location->end( )
<< " play loop " << _session->get_play_loop()
_last_tick = loop_location->start() - elapsed_since_last_tick;
}
-void MidiClockTicker::tick(const nframes_t& transport_frames, const BBT_Time& transport_bbt, const SMPTE::Time& transport_smpt)
-{
+void MidiClockTicker::tick(const nframes_t& transport_frames, const BBT_Time& /*transport_bbt*/, const SMPTE::Time& /*transport_smpt*/)
+{
+#ifdef WITH_JACK_MIDI
if (!Config->get_send_midi_clock() || _session == 0 || _session->transport_speed() != 1.0f)
return;
+ MIDI::JACK_MidiPort* jack_port = dynamic_cast<MIDI::JACK_MidiPort*>(_midi_port);
+ assert(jack_port);
+
while (true) {
double next_tick = _last_tick + one_ppqn_in_frames(transport_frames);
nframes_t next_tick_offset = nframes_t(next_tick) - transport_frames;
-#if DEBUG_TICKER
+#ifdef DEBUG_MIDI_CLOCK
cerr << "Transport:" << transport_frames
<< ":Last tick time:" << _last_tick << ":"
<< ":Next tick time:" << next_tick << ":"
<< "Offset:" << next_tick_offset << ":"
- << "cycle length:" << _jack_port->nframes_this_cycle()
+ << "cycle length:" << jack_port->nframes_this_cycle()
<< endl;
#endif
- if (next_tick_offset >= _jack_port->nframes_this_cycle())
+ if (next_tick_offset >= jack_port->nframes_this_cycle())
return;
send_midi_clock_event(next_tick_offset);
_last_tick = next_tick;
}
+#endif // WITH_JACK_MIDI
}
double MidiClockTicker::one_ppqn_in_frames(nframes_t transport_position)
void MidiClockTicker::send_midi_clock_event(nframes_t offset)
{
- assert(_jack_port->is_process_thread());
-#if DEBUG_TICKER
+#ifdef WITH_JACK_MIDI
+ assert (MIDI::JACK_MidiPort::is_process_thread());
+#endif // WITH_JACK_MIDI
+#ifdef DEBUG_MIDI_CLOCK
cerr << "Tick with offset " << offset << endl;
-#endif
+#endif // DEBUG_MIDI_CLOCK
static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_CLOCK };
- _jack_port->write(_midi_clock_tick, 1, offset);
+ _midi_port->write(_midi_clock_tick, 1, offset);
}
void MidiClockTicker::send_start_event(nframes_t offset)
{
static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_START };
- _jack_port->write(_midi_clock_tick, 1, offset);
+ _midi_port->write(_midi_clock_tick, 1, offset);
}
void MidiClockTicker::send_continue_event(nframes_t offset)
{
static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_CONTINUE };
- _jack_port->write(_midi_clock_tick, 1, offset);
+ _midi_port->write(_midi_clock_tick, 1, offset);
}
void MidiClockTicker::send_stop_event(nframes_t offset)
{
static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_STOP };
- _jack_port->write(_midi_clock_tick, 1, offset);
+ _midi_port->write(_midi_clock_tick, 1, offset);
}
}