Fix thinkos in cubasish theme
[ardour.git] / gtk2_ardour / audio_clock.cc
index d9415f26652cc01e1b04a0dd983926fcbff00d9a..8556405a51b3c84c1e3e37bc60ad60bb6b829c43 100644 (file)
@@ -1,21 +1,30 @@
 /*
-    Copyright (C) 1999 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
+ * Copyright (C) 2005-2006 Taybin Rutkin <taybin@taybin.com>
+ * Copyright (C) 2005-2018 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2006-2012 David Robillard <d@drobilla.net>
+ * Copyright (C) 2007 Doug McLain <doug@nostar.net>
+ * Copyright (C) 2009-2012 Carl Hetherington <carl@carlh.net>
+ * Copyright (C) 2012-2019 Robin Gareus <robin@gareus.org>
+ * Copyright (C) 2013-2017 John Emmas <john@creativepost.co.uk>
+ * Copyright (C) 2015-2016 Tim Mayberry <mojofunk@gmail.com>
+ * Copyright (C) 2015 Ben Loftis <ben@harrisonconsoles.com>
+ * Copyright (C) 2015 Colin Fletcher <colin.m.fletcher@googlemail.com>
+ * Copyright (C) 2016-2017 Nick Mainsbridge <mainsbridge@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
 
 #include <cstdio> // for sprintf
 #include <cmath>
@@ -34,8 +43,9 @@
 #include "ardour/profile.h"
 #include "ardour/lmath.h"
 #include "ardour/session.h"
-#include "ardour/slave.h"
+#include "ardour/transport_master.h"
 #include "ardour/tempo.h"
+#include "ardour/transport_master_manager.h"
 #include "ardour/types.h"
 
 #include "ardour_ui.h"
@@ -114,6 +124,9 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
                clocks.push_back (this);
        }
 
+       _left_btn.set_name ("transport option button");
+       _right_btn.set_name ("transport option button");
+
        _left_btn.set_sizing_text (_("0000000000000"));
        // NB right_btn is in a size-group
 
@@ -126,6 +139,7 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
 
 AudioClock::~AudioClock ()
 {
+       delete ops_menu;
        delete foreground_attr;
        delete editing_attr;
 }
@@ -509,7 +523,7 @@ AudioClock::end_edit (bool modify)
                        break;
 
                case Seconds:
-                       // no break
+                       /* fallthrough */
                case Samples:
                        if (edit_string.length() < 1) {
                                edit_string = pre_edit_string;
@@ -938,20 +952,19 @@ AudioClock::set_slave_info ()
                return;
        }
 
-       SyncSource sync_src = Config->get_sync_source();
+       boost::shared_ptr<TransportMaster> tm = TransportMasterManager::instance().current();
 
-       if (_session->config.get_external_sync()) {
-               Slave* slave = _session->slave();
+       if (_session->transport_master_is_external()) {
 
-               switch (sync_src) {
+               switch (tm->type()) {
                case Engine:
-                       _left_btn.set_text (sync_source_to_string (sync_src, true), true);
+                       _left_btn.set_text (tm->name(), true);
                        _right_btn.set_text ("", true);
                        break;
                case MIDIClock:
-                       if (slave) {
-                               _left_btn.set_text (sync_source_to_string (sync_src, true), true);
-                               _right_btn.set_text (slave->approximate_current_delta (), true);
+                       if (tm) {
+                               _left_btn.set_text (tm->display_name(), true);
+                               _right_btn.set_text (tm->delta_string (), true);
                        } else {
                                _left_btn.set_text (_("--pending--"), true);
                                _right_btn.set_text ("", true);
@@ -959,17 +972,17 @@ AudioClock::set_slave_info ()
                        break;
                case LTC:
                case MTC:
-                       if (slave) {
+                       if (tm) {
                                bool matching;
-                               TimecodeSlave* tcslave;
-                               if ((tcslave = dynamic_cast<TimecodeSlave*>(_session->slave())) != 0) {
-                                       matching = (tcslave->apparent_timecode_format() == _session->config.get_timecode_format());
+                               boost::shared_ptr<TimecodeTransportMaster> tcmaster;
+                               if ((tcmaster = boost::dynamic_pointer_cast<TimecodeTransportMaster>(tm)) != 0) {
+                                       matching = (tcmaster->apparent_timecode_format() == _session->config.get_timecode_format());
                                        _left_btn.set_text (string_compose ("%1<span face=\"monospace\" foreground=\"%3\">%2</span>",
-                                                               sync_source_to_string(sync_src, true)[0],
-                                                               dynamic_cast<TimecodeSlave*>(slave)->approximate_current_position (),
-                                                               matching ? "#66ff66" : "#ff3333"
+                                                                           tm->display_name()[0],
+                                                                           tcmaster->position_string (),
+                                                                           matching ? "#66ff66" : "#ff3333"
                                                                ), true);
-                                       _right_btn.set_text (slave->approximate_current_delta (), true);
+                                       _right_btn.set_text (tm->delta_string (), true);
                                }
                        } else {
                                _left_btn.set_text (_("--pending--"), true);
@@ -978,8 +991,7 @@ AudioClock::set_slave_info ()
                        break;
                }
        } else {
-               _left_btn.set_text (string_compose ("%1/%2",
-                                       _("INT"), sync_source_to_string(sync_src, true)), true);
+               _left_btn.set_text (string_compose ("%1/%2", _("INT"), tm->display_name()), true);
                _right_btn.set_text ("", true);
        }
 }
@@ -1912,7 +1924,6 @@ AudioClock::current_duration (samplepos_t pos) const
        case MinSec:
        case Seconds:
        case Samples:
-               ret = last_when;
                ret = last_when;
                break;
        }
@@ -1921,7 +1932,7 @@ AudioClock::current_duration (samplepos_t pos) const
 }
 
 bool
-AudioClock::bbt_validate_edit (const string& str)
+AudioClock::bbt_validate_edit (string & str)
 {
        AnyTime any;
 
@@ -1938,7 +1949,14 @@ AudioClock::bbt_validate_edit (const string& str)
        }
 
        if (!is_duration && any.bbt.beats == 0) {
-               return false;
+               /* user could not have mean zero beats because for a
+                * non-duration clock that's impossible. Assume that they
+                * mis-entered things and meant Bar|1|ticks
+                */
+
+               char buf[128];
+               snprintf (buf, sizeof (buf), "%" PRIu32 "|%" PRIu32 "|%" PRIu32, any.bbt.bars, 1, any.bbt.ticks);
+               str = buf;
        }
 
        return true;