summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2009-12-07 21:37:35 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2009-12-07 21:37:35 +0000
commit9686f8097d45c306168d1a5220d9c8bf225edb8c (patch)
tree274d7f7d8a549f96a5459d9be257581980906be3 /libs
parentdc86434283718b7c4a4ed6af52a950e6cfc5e86f (diff)
first pass at end-to-end RT operation request (GUI->session->RT thread->GUI), just for rec-enable
git-svn-id: svn://localhost/ardour2/branches/3.0@6324 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/session.h16
-rw-r--r--libs/ardour/ardour/session_event.h6
-rw-r--r--libs/ardour/session.cc20
-rw-r--r--libs/ardour/session_events.cc7
-rw-r--r--libs/ardour/session_process.cc24
-rw-r--r--libs/ardour/session_state.cc17
-rw-r--r--libs/surfaces/control_protocol/basic_ui.cc4
7 files changed, 70 insertions, 24 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index c9b2ba11a3..18af14a313 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -330,6 +330,12 @@ class Session : public PBD::StatefulDestructible, public SessionEventManager, pu
int remove_region_from_region_list (boost::shared_ptr<Region>);
+ /* ask the session to do realtime things, in RT context, then get back to us via a callback (which must be
+ cross-thread or RT safe, since it too is called from RT context)
+ */
+
+ void request_real_time_operation (sigc::slot<void> rt_op, sigc::slot<void,SessionEvent*> callback);
+
nframes_t get_maximum_extent () const;
nframes_t current_end_frame() const { return end_location->start(); }
nframes_t current_start_frame() const { return start_location->start(); }
@@ -621,8 +627,8 @@ class Session : public PBD::StatefulDestructible, public SessionEventManager, pu
sigc::signal<void,bool> SoloActive;
sigc::signal<void> SoloChanged;
- void record_disenable_all ();
- void record_enable_all ();
+ void record_disenable_all (sigc::slot<void,SessionEvent*>);
+ void record_enable_all (sigc::slot<void,SessionEvent*>);
/* control/master out */
@@ -719,6 +725,9 @@ class Session : public PBD::StatefulDestructible, public SessionEventManager, pu
void begin_reversible_command (const std::string& cmd_name);
void commit_reversible_command (Command* cmd = 0);
+ UndoTransaction* start_reversible_command (const std::string& cmd_name);
+ void finish_reversible_command (UndoTransaction&);
+
void add_command (Command *const cmd) {
assert(!_current_trans.empty ());
_current_trans.top()->add_command (cmd);
@@ -1466,8 +1475,9 @@ class Session : public PBD::StatefulDestructible, public SessionEventManager, pu
void jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int);
int jack_sync_callback (jack_transport_state_t, jack_position_t*);
void reset_jack_connection (jack_client_t* jack);
- void record_enable_change_all (bool yn);
+ void record_enable_change_all (bool yn, sigc::slot<void,SessionEvent*>);
void do_record_enable_change_all (RouteList*, bool);
+ void process_rtop (SessionEvent*);
XMLNode& state(bool);
diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h
index 07c795257f..a903e3cd4f 100644
--- a/libs/ardour/ardour/session_event.h
+++ b/libs/ardour/ardour/session_event.h
@@ -33,6 +33,7 @@ struct SessionEvent {
InputConfigurationChange,
SetPlayAudioRange,
SetRecordEnable,
+ RealTimeOperation,
/* only one of each of these events can be queued at any one time */
@@ -66,13 +67,14 @@ struct SessionEvent {
RouteList* routes;
};
+ sigc::slot<void> rt_slot; /* what to call in RT context */
+ sigc::slot<void,SessionEvent*> rt_return; /* called after rt_slot, with this event as an argument */
+
std::list<AudioRange> audio_range;
std::list<MusicRange> music_range;
boost::shared_ptr<Region> region;
- sigc::signal<void,SessionEvent*,int> Complete;
-
SessionEvent (Type t, Action a, nframes_t when, nframes_t where, double spd, bool yn = false, bool yn2 = false)
: type (t)
, action (a)
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index f113bf4ebc..5c8c2254f9 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -3605,27 +3605,27 @@ Session::graph_reordered ()
}
void
-Session::record_disenable_all ()
+Session::record_disenable_all (sigc::slot<void,SessionEvent*> callback)
{
if (!writable()) {
return;
}
- record_enable_change_all (false);
+ record_enable_change_all (false, callback);
}
void
-Session::record_enable_all ()
+Session::record_enable_all (sigc::slot<void,SessionEvent*> callback)
{
if (!writable()) {
return;
}
- record_enable_change_all (true);
+ record_enable_change_all (true, callback);
}
void
-Session::record_enable_change_all (bool yn)
+Session::record_enable_change_all (bool yn, sigc::slot<void,SessionEvent*> callback)
{
shared_ptr<RouteList> r = routes.reader ();
RouteList* tracks = new RouteList;
@@ -3637,11 +3637,15 @@ Session::record_enable_change_all (bool yn)
tracks->push_back (*i);
}
}
+
+ sigc::slot<void> rt_op = bind (sigc::mem_fun (*this, &Session::do_record_enable_change_all), tracks, yn);
+
+ SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
- SessionEvent* ev = new SessionEvent (SessionEvent::SetRecordEnable, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0, yn);
+ ev->routes = tracks; // set here so that callback can delete it
+ ev->rt_slot = rt_op;
+ ev->rt_return = callback;
- ev->routes = tracks;
- ev->Complete.connect (mem_fun (*this, &Session::cleanup_event));
queue_event (ev);
}
diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc
index 7b24b1abef..170a1c0c4c 100644
--- a/libs/ardour/session_events.cc
+++ b/libs/ardour/session_events.cc
@@ -278,10 +278,3 @@ SessionEventManager::_clear_event_type (SessionEvent::Type type)
set_next_event ();
}
-#if 0
-void
-Session::process_rtop (SessionEvent* ev)
-{
- ev->rt_return (ev->rt_slot ());
-}
-#endif
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index 329bb62174..22c6abfc73 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -1138,6 +1138,11 @@ Session::process_event (SessionEvent* ev)
do_record_enable_change_all (ev->routes, ev->yes_or_no);
break;
+ case SessionEvent::RealTimeOperation:
+ process_rtop (ev);
+ del = false; // other side of RT request needs to clean up
+ break;
+
default:
fatal << string_compose(_("Programming error: illegal event type in process_event (%1)"), ev->type) << endmsg;
/*NOTREACHED*/
@@ -1148,9 +1153,24 @@ Session::process_event (SessionEvent* ev)
del = del && !_remove_event (ev);
}
- ev->Complete (ev, 0); /* EMIT SIGNAL */
-
if (del) {
delete ev;
}
}
+
+
+void
+Session::request_real_time_operation (sigc::slot<void> rt_op, sigc::slot<void,SessionEvent*> callback)
+{
+ SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
+ ev->rt_slot = rt_op;
+ ev->rt_return = callback;
+ queue_event (ev);
+}
+
+void
+Session::process_rtop (SessionEvent* ev)
+{
+ ev->rt_slot ();
+ ev->rt_return (ev);
+}
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 7b8f49e128..3aaa3dbf22 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -2125,6 +2125,23 @@ Session::route_group_by_name (string name)
return 0;
}
+UndoTransaction*
+Session::start_reversible_command (const string& name)
+{
+ UndoTransaction* trans = new UndoTransaction();
+ trans->set_name(name);
+ return trans;
+}
+
+void
+Session::finish_reversible_command (UndoTransaction& ut)
+{
+ struct timeval now;
+ gettimeofday(&now, 0);
+ ut.set_timestamp(now);
+ _history.add (&ut);
+}
+
void
Session::begin_reversible_command(const string& name)
{
diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc
index 3d336adb47..3ae5455a8c 100644
--- a/libs/surfaces/control_protocol/basic_ui.cc
+++ b/libs/surfaces/control_protocol/basic_ui.cc
@@ -215,9 +215,9 @@ void
BasicUI::toggle_all_rec_enables ()
{
if (session->get_record_enabled()) {
- session->record_disenable_all ();
+ // session->record_disenable_all ();
} else {
- session->record_enable_all ();
+ // session->record_enable_all ();
}
}