summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_clock_slave.cc
diff options
context:
space:
mode:
authorHans Baier <hansfbaier@googlemail.com>2008-10-30 06:07:00 +0000
committerHans Baier <hansfbaier@googlemail.com>2008-10-30 06:07:00 +0000
commit4c90724d2d94f834ddc3c9b39c60dd7553493753 (patch)
tree5a78efe0eb13e225d5599c311f01cf56c87da0a8 /libs/ardour/midi_clock_slave.cc
parent08470b7ed70c1f1c83f2378323aeb5cef5b88e46 (diff)
* got MIDI clock working really smoothly (29 frames until sync, ardour transport jitter 1 frame)
* removed debugging output git-svn-id: svn://localhost/ardour2/branches/3.0@4032 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/midi_clock_slave.cc')
-rw-r--r--libs/ardour/midi_clock_slave.cc41
1 files changed, 24 insertions, 17 deletions
diff --git a/libs/ardour/midi_clock_slave.cc b/libs/ardour/midi_clock_slave.cc
index c534c34a99..51641fb1c9 100644
--- a/libs/ardour/midi_clock_slave.cc
+++ b/libs/ardour/midi_clock_slave.cc
@@ -113,7 +113,7 @@ MIDIClock_Slave::update_midi_clock (Parser& parser, nframes_t timestamp)
average_midi_clock_frame_duration /= accumulator_size;
-#if 1
+#if 0
JACK_MidiPort *jack_port = dynamic_cast<JACK_MidiPort *>(port);
pthread_t process_thread_id = 0;
if(jack_port) {
@@ -123,16 +123,15 @@ MIDIClock_Slave::update_midi_clock (Parser& parser, nframes_t timestamp)
std::cerr
<< " got MIDI Clock message at time " << now
<< " session time: " << session.engine().frame_time()
+ << " transport position: " << session.transport_frame()
<< " real delta: " << current_midi_clock_frame_duration
<< " reference: " << one_ppqn_in_frames
<< " average: " << average_midi_clock_frame_duration
<< std::endl;
#endif
-
-
current.guard1++;
- current.position += current_midi_clock_frame_duration * (one_ppqn_in_frames / average_midi_clock_frame_duration);
+ current.position += one_ppqn_in_frames;
current.timestamp = now;
current.guard2++;
@@ -144,8 +143,8 @@ MIDIClock_Slave::start (Parser& parser, nframes_t timestamp)
{
nframes_t now = timestamp;
- cerr << "MIDIClock_Slave got start message at time " << now
- << " session time: " << session.engine().frame_time() << endl;
+
+ //cerr << "MIDIClock_Slave got start message at time " << now << " session time: " << session.engine().frame_time() << endl;
if(!locked()) {
cerr << "Did not start because not locked!" << endl;
@@ -167,7 +166,7 @@ MIDIClock_Slave::start (Parser& parser, nframes_t timestamp)
void
MIDIClock_Slave::stop (Parser& parser, nframes_t timestamp)
{
- std::cerr << "MIDIClock_Slave got stop message" << endl;
+ //std::cerr << "MIDIClock_Slave got stop message" << endl;
current_midi_clock_frame_duration = 0;
@@ -212,23 +211,27 @@ MIDIClock_Slave::ok() const
bool
MIDIClock_Slave::speed_and_position (float& speed, nframes_t& pos)
{
+ float previous_speed;
+
+ nframes_t now = session.engine().frame_time();
if(!_started) {
speed = 0.0;
pos = 0;
+ previous_speed = one_ppqn_in_frames / average_midi_clock_frame_duration;
return true;
}
- nframes_t now = session.engine().frame_time();
- nframes_t frame_rate = session.frame_rate();
SafeTime last;
read_current (&last);
/* no timecode for 1/4 second ? conclude that its stopped */
- if (last_inbound_frame && now > last_inbound_frame && now - last_inbound_frame > frame_rate / 4) {
- cerr << "No MIDI Clock frames received for some time, stopping!" << endl;
+ if (last_inbound_frame &&
+ now > last_inbound_frame &&
+ now - last_inbound_frame > session.frame_rate() / 4) {
+ //cerr << "No MIDI Clock frames received for some time, stopping!" << endl;
pos = last.position;
session.request_locate (pos, false);
session.request_transport_speed (0);
@@ -237,25 +240,29 @@ MIDIClock_Slave::speed_and_position (float& speed, nframes_t& pos)
return false;
}
- cerr << " now: " << now << " last: " << last.timestamp;
+ //cerr << " now: " << now << " last: " << last.timestamp;
speed = one_ppqn_in_frames / average_midi_clock_frame_duration;
- cerr << " final speed: " << speed;
+ //cerr << " final speed: " << speed;
if (now > last.timestamp) {
// we are in between MIDI clock messages
// so we interpolate position according to speed
nframes_t elapsed = now - last.timestamp;
- cerr << " elapsed: " << elapsed << " elapsed (scaled) " << elapsed * speed;
nframes_t delta = elapsed * speed;
+ //cerr << " elapsed: " << elapsed << " elapsed (scaled) " << delta;
pos = last.position + delta;
} else {
- // A new MIDI clock message has arrived this cycle
- pos = last.position;
+ // A new MIDI clock message has arrived this cycle
+ pos = (last.position + session.transport_frame()) / 2.0;
+ previous_speed = speed;
}
- cerr << " position: " << pos;
+ /*
+ cerr << " transport position now: " << session.transport_frame();
+ cerr << " calculated position: " << pos;
cerr << endl;
+ */
// we want start on frame 0 on the first call after a MIDI start
if(_starting) {