X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fglobals.cc;h=1d510cfef1d42f60f7fe226b4b62fefc0eb4ff57;hb=1bd4c5b3a212460eed1773f6b049d18c89625565;hp=5cfe83e9448af1bf79476f5a8edfb5b10884b602;hpb=e27ac3278b0d335be0ccd9d6d6373287d406adb5;p=ardour.git diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 5cfe83e944..1d510cfef1 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -15,7 +15,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ + $Id: globals.cc 935 2006-09-29 21:39:39Z paul $ */ #include // Needed so that libraptor (included in lrdf) won't complain @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -43,9 +44,14 @@ #include #include #include -#include +#include #include #include +#include + +#ifdef HAVE_LIBLO +#include +#endif #include @@ -58,8 +64,13 @@ ARDOUR::Configuration* ARDOUR::Config = 0; ARDOUR::AudioLibrary* ARDOUR::Library = 0; +#ifdef HAVE_LIBLO +ARDOUR::OSC* ARDOUR::osc = 0; +#endif + using namespace ARDOUR; using namespace std; +using namespace PBD; MIDI::Port *default_mmc_port = 0; MIDI::Port *default_mtc_port = 0; @@ -71,6 +82,23 @@ Change ARDOUR::PositionChanged = ARDOUR::new_change (); Change ARDOUR::NameChanged = ARDOUR::new_change (); Change ARDOUR::BoundsChanged = Change (0); // see init(), below +#ifdef HAVE_LIBLO +static int +setup_osc () +{ + /* no real cost to creating this object, and it avoids + conditionals anywhere that uses it + */ + + osc = new OSC (Config->get_osc_port()); + + if (Config->get_use_osc ()) { + return osc->start (); + } else { + return 0; + } +} +#endif static int setup_midi () @@ -162,12 +190,17 @@ setup_midi () } int -ARDOUR::init (AudioEngine& engine, bool use_vst, bool try_optimization, void (*sighandler)(int,siginfo_t*,void*)) +ARDOUR::init (bool use_vst, bool try_optimization) { bool generic_mix_functions = true; (void) bindtextdomain(PACKAGE, LOCALEDIR); + PBD::ID::init (); + + lrdf_init(); + Library = new AudioLibrary; + Config = new Configuration; if (Config->load_state ()) { @@ -179,9 +212,15 @@ ARDOUR::init (AudioEngine& engine, bool use_vst, bool try_optimization, void (*s if (setup_midi ()) { return -1; } + +#ifdef HAVE_LIBLO + if (setup_osc ()) { + return -1; + } +#endif #ifdef VST_SUPPORT - if (Config->get_use_vst() && fst_init (sighandler)) { + if (Config->get_use_vst() && fst_init ()) { return -1; } #endif @@ -259,12 +298,18 @@ ARDOUR::init (AudioEngine& engine, bool use_vst, bool try_optimization, void (*s info << "No H/W specific optimizations in use" << endmsg; } - - lrdf_init(); - Library = new AudioLibrary; /* singleton - first object is "it" */ - new PluginManager (engine); + new PluginManager (); + + /* singleton - first object is "it" */ + new ControlProtocolManager (); + ControlProtocolManager::instance().discover_control_protocols (Session::control_protocol_path()); + + XMLNode* node; + if ((node = Config->control_protocol_state()) != 0) { + ControlProtocolManager::instance().set_state (*node); + } BoundsChanged = Change (StartChanged|PositionChanged|LengthChanged); @@ -276,13 +321,19 @@ ARDOUR::cleanup () { delete Library; lrdf_cleanup (); + delete &ControlProtocolManager::instance(); return 0; } -ARDOUR::id_t -ARDOUR::new_id () + +microseconds_t +ARDOUR::get_microseconds () { - return get_uid(); + /* XXX need JACK to export its functionality */ + + struct timeval now; + gettimeofday (&now, 0); + return now.tv_sec * 1000000ULL + now.tv_usec; } ARDOUR::Change @@ -291,14 +342,27 @@ ARDOUR::new_change () Change c; static uint32_t change_bit = 1; - /* XXX catch out-of-range */ + /* catch out-of-range */ + if (!change_bit) + { + fatal << _("programming error: ") + << "change_bit out of range in ARDOUR::new_change()" + << endmsg; + /*NOTREACHED*/ + } c = Change (change_bit); - change_bit <<= 1; + change_bit <<= 1; // if it shifts too far, change_bit == 0 return c; } +string +ARDOUR::get_ardour_revision () +{ + return "$Rev$"; +} + string ARDOUR::get_user_ardour_path () { @@ -314,13 +378,15 @@ ARDOUR::get_user_ardour_path () /* create it if necessary */ - mkdir (path.c_str (), 0755); + if (g_mkdir_with_parents (path.c_str (), 0755)) { + throw exception (); + } return path; } string -ARDOUR::get_system_ardour_path () +ARDOUR::get_system_data_path () { string path; @@ -330,13 +396,24 @@ ARDOUR::get_system_ardour_path () return path; } +string +ARDOUR::get_system_module_path () +{ + string path; + + path += MODULE_DIR; + path += "/ardour2/"; + + return path; +} + static string find_file (string name, string dir, string subdir = "") { string path; char* envvar = getenv("ARDOUR_PATH"); - /* stop A: any directory in ARDOUR_PATH */ + /* 1st attempt: any directory in ARDOUR_PATH */ if (envvar != 0) { @@ -348,13 +425,13 @@ find_file (string name, string dir, string subdir = "") path = *i; path += "/" + name; if (access (path.c_str(), R_OK) == 0) { - cerr << "Using file " << path << " found in ARDOUR_PATH." << endl; + // cerr << "Using file " << path << " found in ARDOUR_PATH." << endl; return path; } } } - /* stop B: ~/.ardour/ */ + /* 2nd attempt: ~/.ardour/ */ path = get_user_ardour_path(); @@ -367,7 +444,7 @@ find_file (string name, string dir, string subdir = "") return path; } - /* C: dir/... */ + /* 3rd attempt: dir/... */ path = dir; path += "/ardour2/"; @@ -423,8 +500,8 @@ ARDOUR::LocaleGuard::~LocaleGuard () } ARDOUR::OverlapType -ARDOUR::coverage (jack_nframes_t sa, jack_nframes_t ea, - jack_nframes_t sb, jack_nframes_t eb) +ARDOUR::coverage (nframes_t sa, nframes_t ea, + nframes_t sb, nframes_t eb) { /* OverlapType returned reflects how the second (B) range overlaps the first (A). @@ -503,16 +580,23 @@ ARDOUR::coverage (jack_nframes_t sa, jack_nframes_t ea, /* not sure where to put these */ -std::istream& operator>>(std::istream& o, HeaderFormat hf) { +template +std::istream& int_to_type (std::istream& o, T& hf) { int val; o >> val; - hf = (HeaderFormat) val; + hf = (T) val; return o; } -std::istream& operator>>(std::istream& o, SampleFormat sf) { - int val; - o >> val; - sf = (SampleFormat) val; - return o; -} +std::istream& operator>>(std::istream& o, HeaderFormat& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, SampleFormat& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, AutoConnectOption& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, MonitorModel& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, EditMode& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, SoloModel& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, LayerModel& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, CrossfadeModel& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, SlaveSource& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, ShuttleBehaviour& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, ShuttleUnits& var) { return int_to_type (o, var); } +