+ string i18n_enabler = ARDOUR::translation_enable_path();
+ int fd = ::open (i18n_enabler.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0644);
+
+ if (fd < 0) {
+ return false;
+ }
+
+ char c;
+
+ if (yn) {
+ c = '1';
+ } else {
+ c = '0';
+ }
+
+ ::write (fd, &c, 1);
+ ::close (fd);
+
+ return true;
+}
+
+
+vector<SyncSource>
+ARDOUR::get_available_sync_options ()
+{
+ vector<SyncSource> ret;
+
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance()->current_backend();
+ if (backend && backend->name() == "JACK") {
+ ret.push_back (Engine);
+ }
+
+ ret.push_back (MTC);
+ ret.push_back (MIDIClock);
+ ret.push_back (LTC);
+
+ return ret;
+}
+
+/** Return a monotonic value for the number of microseconds that have elapsed
+ * since an arbitrary zero origin.
+ */
+
+#ifdef __MACH__
+/* Thanks Apple for not implementing this basic SUSv2, POSIX.1-2001 function
+ */
+#include <mach/mach_time.h>
+#define CLOCK_REALTIME 0
+#define CLOCK_MONOTONIC 0
+int
+clock_gettime (int /*clk_id*/, struct timespec *t)
+{
+ static bool initialized = false;
+ static mach_timebase_info_data_t timebase;
+ if (!initialized) {
+ mach_timebase_info(&timebase);
+ initialized = true;
+ }
+ uint64_t time;
+ time = mach_absolute_time();
+ double nseconds = ((double)time * (double)timebase.numer)/((double)timebase.denom);
+ double seconds = ((double)time * (double)timebase.numer)/((double)timebase.denom * 1e9);
+ t->tv_sec = seconds;
+ t->tv_nsec = nseconds;
+ return 0;
+}
+#endif
+
+microseconds_t
+ARDOUR::get_microseconds ()
+{
+ struct timespec ts;
+ if (clock_gettime (CLOCK_MONOTONIC, &ts) != 0) {
+ /* EEEK! */
+ return 0;
+ }
+ return (microseconds_t) ts.tv_sec * 1000000 + (ts.tv_nsec/1000);