Fix compensation of roll delay with MIDI tracks; data
[ardour.git] / libs / ardour / ardour / session.h
index e41ea5a625646a807efcebec3fd4d00de70446f5..ad42ee768ba15852b6b512a735a19cebb9ebaa93 100644 (file)
 #include <glibmm/thread.h>
 
 #include "pbd/error.h"
+#include "pbd/event_loop.h"
 #include "pbd/rcu.h"
 #include "pbd/statefuldestructible.h"
 #include "pbd/signals.h"
 #include "pbd/undo.h"
 
+#include "evoral/types.hpp"
+
 #include "midi++/types.h"
 
 #include "timecode/time.h"
 
 #include "ardour/ardour.h"
-#include "ardour/click.h"
 #include "ardour/chan_count.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/session_configuration.h"
 #include "ardour/session_event.h"
 #include "ardour/location.h"
 #include "ardour/interpolation.h"
-#include "ardour/speakers.h"
 
 #ifdef HAVE_JACK_SESSION
 #include <jack/session.h>
@@ -92,16 +93,18 @@ class AuxInput;
 class BufferSet;
 class Bundle;
 class Butler;
+class Click;
 class Diskstream;
 class ExportHandler;
 class ExportStatus;
+class Graph;
 class IO;
 class IOProcessor;
 class ImportStatus;
+class MidiControlUI;
 class MidiRegion;
 class MidiSource;
 class MidiTrack;
-class MidiControlUI;
 class NamedSelection;
 class Playlist;
 class PluginInsert;
@@ -122,9 +125,8 @@ class Slave;
 class Source;
 class Speakers;
 class TempoMap;
-class VSTPlugin;
-class Graph;
 class Track;
+class VSTPlugin;
 
 extern void setup_enum_writer ();
 
@@ -621,6 +623,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
        void set_record_enabled (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false);
        void set_solo_isolated (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false);
        void set_exclusive_input_active (boost::shared_ptr<Route> rt, bool others_on);
+       void set_monitoring (boost::shared_ptr<RouteList>, MonitorChoice, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false);
 
        PBD::Signal1<void,bool> SoloActive;
        PBD::Signal0<void> SoloChanged;
@@ -744,10 +747,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
                        
        /*Native linuxVST support*/
        
-       static long lxvst_callback (AEffect* effect,
-                                 long opcode,
-                                 long index,
-                                 long value,
+       static intptr_t lxvst_callback (AEffect* effect,
+                                 int32_t opcode,
+                                 int32_t index,
+                                 intptr_t value,
                                  void* ptr,
                                  float opt);
 
@@ -1369,7 +1372,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
        XMLNode& state(bool);
 
        /* click track */
-
+       typedef std::list<Click*> Clicks;
        Clicks                 clicks;
        bool                  _clicking;
        boost::shared_ptr<IO> _click_io;
@@ -1453,10 +1456,16 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
        static int ask_about_playlist_deletion (boost::shared_ptr<Playlist>);
 
        /* realtime "apply to set of routes" operations */
-       SessionEvent* get_rt_event (
-               boost::shared_ptr<RouteList> rl, bool yn,
-               SessionEvent::RTeventCallback after, bool group_override,
-               void (Session::*method) (boost::shared_ptr<RouteList>, bool, bool));
+       template<typename T> SessionEvent*
+               get_rt_event (boost::shared_ptr<RouteList> rl, T targ, SessionEvent::RTeventCallback after, bool group_override,
+                             void (Session::*method) (boost::shared_ptr<RouteList>, T, bool)) {
+               SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
+               ev->rt_slot = boost::bind (method, this, rl, targ, group_override);
+               ev->rt_return = after;
+               ev->event_loop = PBD::EventLoop::get_event_loop_for_thread ();
+               
+               return ev;
+       }
 
        void rt_set_solo (boost::shared_ptr<RouteList>, bool yn, bool group_override);
        void rt_set_just_one_solo (boost::shared_ptr<RouteList>, bool yn, bool /* ignored*/ );
@@ -1464,6 +1473,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
        void rt_set_listen (boost::shared_ptr<RouteList>, bool yn, bool group_override);
        void rt_set_solo_isolated (boost::shared_ptr<RouteList>, bool yn, bool group_override);
        void rt_set_record_enabled (boost::shared_ptr<RouteList>, bool yn, bool group_override);
+       void rt_set_monitoring (boost::shared_ptr<RouteList>, MonitorChoice, bool group_override);
 
        /** temporary list of Diskstreams used only during load of 2.X sessions */
        std::list<boost::shared_ptr<Diskstream> > _diskstreams_2X;