save version string with session for informational purposes
[ardour.git] / libs / ardour / ardour / session_event.h
index 27f778b8acef0c8dd855f7295fb0840e9b8f5efa..8bb160b90e2abde07b308d7f9334028790043557 100644 (file)
@@ -1,3 +1,22 @@
+/*
+    Copyright (C) 2012 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
 #ifndef __ardour_session_event_h__
 #define __ardour_session_event_h__
 
@@ -9,6 +28,7 @@
 #include "pbd/ringbuffer.h"
 #include "pbd/event_loop.h"
 
+#include "ardour/libardour_visibility.h"
 #include "ardour/types.h"
 
 namespace ARDOUR {
@@ -16,7 +36,8 @@ namespace ARDOUR {
 class Slave;
 class Region;
 
-struct SessionEvent {
+class LIBARDOUR_API SessionEvent {
+public:
        enum Type {
                SetTransportSpeed,
                SetTrackSpeed,
@@ -33,15 +54,18 @@ struct SessionEvent {
                Audition,
                InputConfigurationChange,
                SetPlayAudioRange,
+               CancelPlayAudioRange,
                RealTimeOperation,
                AdjustPlaybackBuffering,
                AdjustCaptureBuffering,
                SetTimecodeTransmission,
+               Skip,
 
                /* only one of each of these events can be queued at any one time */
 
                StopOnce,
-               AutoLoop
+               AutoLoop,
+               AutoLoopDeclick,
        };
 
        enum Action {
@@ -60,22 +84,28 @@ struct SessionEvent {
        union {
                void*        ptr;
                bool         yes_or_no;
-               framepos_t  target2_frame;
+               framepos_t   target2_frame;
                Slave*       slave;
                Route*       route;
        };
 
        union {
                bool second_yes_or_no;
+               double control_value;
        };
 
-       /* 4 members to handle a multi-group event handled in RT context */
+       union {
+               bool third_yes_or_no;
+       };
+
+       /* 5 members to handle a multi-group event handled in RT context */
 
        typedef boost::function<void (SessionEvent*)> RTeventCallback;
 
-       boost::shared_ptr<RouteList> routes;    /* apply to */
-       boost::function<void (void)> rt_slot;   /* what to call in RT context */
-       RTeventCallback              rt_return; /* called after rt_slot, with this event as an argument */
+       boost::shared_ptr<ControlList> controls; /* apply to */
+       boost::shared_ptr<RouteList> routes;     /* apply to */
+       boost::function<void (void)> rt_slot;    /* what to call in RT context */
+       RTeventCallback              rt_return;  /* called after rt_slot, with this event as an argument */
        PBD::EventLoop*              event_loop;
 
        std::list<AudioRange> audio_range;
@@ -83,15 +113,7 @@ struct SessionEvent {
 
        boost::shared_ptr<Region> region;
 
-       SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false)
-               : type (t)
-               , action (a)
-               , action_frame (when)
-               , target_frame (where)
-               , speed (spd)
-               , yes_or_no (yn)
-               , second_yes_or_no (yn2)
-               , event_loop (0) {}
+       SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false, bool yn3 = false);
 
        void set_ptr (void* p) {
                ptr = p;
@@ -112,11 +134,14 @@ struct SessionEvent {
        void* operator new (size_t);
        void  operator delete (void *ptr, size_t /*size*/);
 
-       static const framepos_t Immediate = 0;
+       static const framepos_t Immediate = -1;
 
+       static bool has_per_thread_pool ();
        static void create_per_thread_pool (const std::string& n, uint32_t nitems);
        static void init_event_pool ();
 
+       CrossThreadPool* event_pool() const { return own_pool; }
+
 private:
        static PerThreadPool* pool;
        CrossThreadPool* own_pool;
@@ -132,6 +157,7 @@ public:
 
        virtual void queue_event (SessionEvent *ev) = 0;
        void clear_events (SessionEvent::Type type);
+       void clear_events (SessionEvent::Type type, boost::function<void (void)> after);
 
 protected:
        RingBuffer<SessionEvent*> pending_events;