#include <sys/param.h>
#endif
+#include <glibmm.h>
+
#include <midi++/mmc.h>
#include <midi++/port.h>
#include <pbd/error.h>
-#include <pbd/dirname.h>
-#include <pbd/lockmonitor.h>
+
+#include <glibmm/thread.h>
#include <pbd/pathscanner.h>
#include <pbd/pthread_utils.h>
-#include <pbd/basename.h>
#include <pbd/strsplit.h>
#include <ardour/audioengine.h>
#include <ardour/location.h>
#include <ardour/audioregion.h>
#include <ardour/crossfade.h>
+#include <ardour/control_protocol_manager.h>
#include "i18n.h"
#include <locale.h>
_tempo_map = new TempoMap (_current_frame_rate);
_tempo_map->StateChanged.connect (mem_fun (*this, &Session::tempo_map_changed));
- atomic_set (&processing_prohibited, 0);
+ g_atomic_int_set (&processing_prohibited, 0);
send_cnt = 0;
insert_cnt = 0;
_transport_speed = 0;
end_location = new Location (0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd)));
start_location = new Location (0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
_end_location_is_free = true;
- atomic_set (&_record_status, Disabled);
+ g_atomic_int_set (&_record_status, Disabled);
auto_play = false;
punch_in = false;
punch_out = false;
butler_mixdown_buffer = 0;
butler_gain_buffer = 0;
auditioner = 0;
- generic_midi_control_protocol = 0;
mmc_control = false;
- midi_feedback = false;
midi_control = true;
mmc = 0;
post_transport_work = PostTransportWork (0);
- atomic_set (&butler_should_do_transport_work, 0);
- atomic_set (&butler_active, 0);
- atomic_set (&_playback_load, 100);
- atomic_set (&_capture_load, 100);
- atomic_set (&_playback_load_min, 100);
- atomic_set (&_capture_load_min, 100);
+ g_atomic_int_set (&butler_should_do_transport_work, 0);
+ g_atomic_int_set (&butler_active, 0);
+ g_atomic_int_set (&_playback_load, 100);
+ g_atomic_int_set (&_capture_load, 100);
+ g_atomic_int_set (&_playback_load_min, 100);
+ g_atomic_int_set (&_capture_load_min, 100);
pending_audition_region = 0;
_edit_mode = Slide;
pending_edit_mode = _edit_mode;
return -1;
}
- initialize_control();
-
- if (init_feedback ()) {
- return -1;
- }
-
if (state_tree) {
if (set_state (*state_tree->root())) {
return -1;
deliver_mmc (MIDI::MachineControl::cmdMmcReset, 0);
deliver_mmc (MIDI::MachineControl::cmdLocate, 0);
- // XXX need to poke the feedback thread to send full state
+ ControlProtocolManager::instance().set_session (*this);
if (new_session) {
_end_location_is_free = true;
child = node->add_child ("Sources");
if (full_state) {
- LockMonitor sl (source_lock, __LINE__, __FILE__);
+ Glib::Mutex::Lock sl (source_lock);
for (SourceList::iterator siter = sources.begin(); siter != sources.end(); ++siter) {
child = node->add_child ("Regions");
if (full_state) {
- LockMonitor rl (region_lock, __LINE__, __FILE__);
+ Glib::Mutex::Lock rl (region_lock);
for (AudioRegionList::const_iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) {
child = node->add_child ("DiskStreams");
{
- RWLockMonitor dl (diskstream_lock, false, __LINE__, __FILE__);
+ Glib::RWLock::ReaderLock dl (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
child->add_child_nocopy ((*i)->get_state());
child = node->add_child ("Connections");
{
- LockMonitor lm (connection_lock, __LINE__, __FILE__);
+ Glib::Mutex::Lock lm (connection_lock);
for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); ++i) {
if (!(*i)->system_dependent()) {
child->add_child_nocopy ((*i)->get_state());
child = node->add_child ("Routes");
{
- RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
+ Glib::RWLock::ReaderLock lm (route_lock);
RoutePublicOrderSorter cmp;
RouteList public_order(routes);
{
XMLNode* node = new XMLNode (X_("Sources"));
- LockMonitor lm (source_lock, __LINE__, __FILE__);
+ Glib::Mutex::Lock lm (source_lock);
for (SourceList::iterator i = sources.begin(); i != sources.end(); ++i) {
node->add_child_nocopy ((*i).second->get_state());
#if HAVE_SYS_VFS_H
struct statfs statfsbuf;
vector<space_and_path>::iterator i;
- LockMonitor lm (space_lock, __LINE__, __FILE__);
+ Glib::Mutex::Lock lm (space_lock);
double scale;
/* get freespace on every FS that is part of the session path */
}
string
-Session::template_path ()
+Session::suffixed_search_path (string suffix, bool data)
{
string path;
if (path[path.length()-1] != ':') {
path += ':';
}
- path += get_system_ardour_path();
+
+ if (data) {
+ path += get_system_data_path();
+ } else {
+ path += get_system_module_path();
+ }
vector<string> split_path;
for (vector<string>::iterator i = split_path.begin(); i != split_path.end(); ++i) {
path += *i;
- path += "templates/";
+ path += suffix;
+ path += '/';
if (distance (i, split_path.end()) != 1) {
path += ':';
return path;
}
+string
+Session::template_path ()
+{
+ return suffixed_search_path (X_("templates"), true);
+}
+
+string
+Session::control_protocol_path ()
+{
+ return suffixed_search_path (X_("surfaces"), false);
+}
+
int
Session::load_connections (const XMLNode& node)
{
{
XMLNodeList nlist = node.children();
XMLNodeConstIterator niter;
- RouteGroup* route;
+ RouteGroup* rg;
set_dirty();
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if ((*niter)->name() == "RouteGroup") {
if (edit) {
- route = add_edit_group ("");
- route->set_state (**niter);
+ rg = add_edit_group ("");
+ rg->set_state (**niter);
} else {
- route = add_mix_group ("");
- route->set_state (**niter);
+ rg = add_mix_group ("");
+ rg->set_state (**niter);
}
}
}
void
Session::swap_configuration(Configuration** new_config)
{
- RWLockMonitor lm (route_lock, true, __LINE__, __FILE__); // jlc - WHY?
+ Glib::RWLock::WriterLock lm (route_lock); // jlc - WHY?
Configuration* tmp = *new_config;
*new_config = Config;
Config = tmp;
void
Session::copy_configuration(Configuration* new_config)
{
- RWLockMonitor lm (route_lock, true, __LINE__, __FILE__);
+ Glib::RWLock::WriterLock lm (route_lock);
new_config = new Configuration(*Config);
}
Session::get_global_route_boolean (bool (Route::*method)(void) const)
{
GlobalRouteBooleanState s;
- RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
+ Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if (!(*i)->hidden()) {
Session::get_global_route_metering ()
{
GlobalRouteMeterState s;
- RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
+ Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if (!(*i)->hidden()) {
on whichever filesystem it was already on.
*/
- newpath = PBD::dirname (*x);
- newpath = PBD::dirname (newpath);
+ newpath = Glib::path_get_dirname (*x);
+ newpath = Glib::path_get_dirname (newpath);
newpath += '/';
newpath += dead_sound_dir_name;
newpath += '/';
- newpath += PBD::basename ((*x));
+ newpath += Glib::path_get_basename ((*x));
if (access (newpath.c_str(), F_OK) == 0) {
Session::set_dirty ()
{
bool was_dirty = dirty();
-
+
_state_of_the_state = StateOfTheState (_state_of_the_state | Dirty);
if (!was_dirty) {