more MTC stuff, including toggleable use of torben's PI controller
[ardour.git] / libs / ardour / ardour / types.h
index 874a3f7ca0ef6f4a800571fbf24678eeaf4e9d5a..92c26a944830b4c271326d03fd2cb4a86f43bf72 100644 (file)
 #include <inttypes.h>
 #include <jack/types.h>
 #include <jack/midiport.h>
-#include "control_protocol/smpte.h"
+#include "control_protocol/timecode.h"
 #include "pbd/id.h"
 
+#include "ardour/bbt_time.h"
+
 #include <map>
 
 #if __GNUC__ < 3
-
 typedef int intptr_t;
 #endif
 
-/* eventually, we'd like everything (including JACK) to
-   move to this. for now, its a dedicated type.
-*/
-
-typedef int64_t                    nframes64_t;
-
 namespace ARDOUR {
 
        class Source;
@@ -59,6 +54,8 @@ namespace ARDOUR {
        typedef uint32_t                    layer_t;
        typedef uint64_t                    microseconds_t;
        typedef uint32_t                    nframes_t;
+       typedef int64_t                     nframes64_t;
+
 
        /** "Session frames", frames relative to the session timeline.
         * Everything related to transport position etc. should be of this type.
@@ -130,7 +127,8 @@ namespace ARDOUR {
        enum MeterPoint {
                MeterInput,
                MeterPreFader,
-               MeterPostFader
+               MeterPostFader,
+               MeterCustom
        };
 
        enum TrackMode {
@@ -149,111 +147,84 @@ namespace ARDOUR {
                FilterChannels,  ///< Ignore events on certain channels
                ForceChannel     ///< Force all events to a certain channel
        };
-       
+
        enum ColorMode {
                MeterColors = 0,
                ChannelColors,
                TrackColor
        };
 
-       struct BBT_Time {
-           uint32_t bars;
-           uint32_t beats;
-           uint32_t ticks;
-
-           BBT_Time() {
-                   bars = 1;
-                   beats = 1;
-                   ticks = 0;
-           }
-
-           /* we can't define arithmetic operators for BBT_Time, because
-              the results depend on a TempoMap, but we can define
-              a useful check on the less-than condition.
-           */
-
-           bool operator< (const BBT_Time& other) const {
-                   return bars < other.bars ||
-                           (bars == other.bars && beats < other.beats) ||
-                           (bars == other.bars && beats == other.beats && ticks < other.ticks);
-           }
-
-           bool operator== (const BBT_Time& other) const {
-                   return bars == other.bars && beats == other.beats && ticks == other.ticks;
-           }
-
-       };
-       enum SmpteFormat {
-               smpte_23976,
-               smpte_24,
-               smpte_24976,
-               smpte_25,
-               smpte_2997,
-               smpte_2997drop,
-               smpte_30,
-               smpte_30drop,
-               smpte_5994,
-               smpte_60
+       enum TimecodeFormat {
+               timecode_23976,
+               timecode_24,
+               timecode_24976,
+               timecode_25,
+               timecode_2997,
+               timecode_2997drop,
+               timecode_30,
+               timecode_30drop,
+               timecode_5994,
+               timecode_60
        };
 
        struct AnyTime {
-           enum Type {
-                   SMPTE,
-                   BBT,
-                   Frames,
-                   Seconds
-           };
+               enum Type {
+                       Timecode,
+                       BBT,
+                       Frames,
+                       Seconds
+               };
 
-           Type type;
+               Type type;
 
-           SMPTE::Time    smpte;
-           BBT_Time       bbt;
+               Timecode::Time    timecode;
+               BBT_Time       bbt;
 
-           union {
-               nframes_t      frames;
-               double         seconds;
-           };
+               union {
+                       nframes_t      frames;
+                       double         seconds;
+               };
 
-           AnyTime() { type = Frames; frames = 0; }
+               AnyTime() { type = Frames; frames = 0; }
        };
 
        struct AudioRange {
-           nframes_t start;
-           nframes_t end;
-           uint32_t id;
+               nframes_t start;
+               nframes_t end;
+               uint32_t id;
 
-           AudioRange (nframes_t s, nframes_t e, uint32_t i) : start (s), end (e) , id (i) {}
+               AudioRange (nframes_t s, nframes_t e, uint32_t i) : start (s), end (e) , id (i) {}
 
-           nframes_t length() { return end - start + 1; }
+               nframes_t length() { return end - start + 1; }
 
-           bool operator== (const AudioRange& other) const {
-                   return start == other.start && end == other.end && id == other.id;
-           }
+               bool operator== (const AudioRange& other) const {
+                       return start == other.start && end == other.end && id == other.id;
+               }
 
-           bool equal (const AudioRange& other) const {
-                   return start == other.start && end == other.end;
-           }
+               bool equal (const AudioRange& other) const {
+                       return start == other.start && end == other.end;
+               }
 
-           OverlapType coverage (nframes_t s, nframes_t e) const {
-                   return ARDOUR::coverage (start, end, s, e);
-           }
+               OverlapType coverage (nframes_t s, nframes_t e) const {
+                       return ARDOUR::coverage (start, end, s, e);
+               }
        };
 
        struct MusicRange {
-           BBT_Time start;
-           BBT_Time end;
-           uint32_t id;
+               BBT_Time start;
+               BBT_Time end;
+               uint32_t id;
 
-           MusicRange (BBT_Time& s, BBT_Time& e, uint32_t i)
-                   : start (s), end (e), id (i) {}
+               MusicRange (BBT_Time& s, BBT_Time& e, uint32_t i)
+                       : start (s), end (e), id (i) {}
 
-           bool operator== (const MusicRange& other) const {
-                   return start == other.start && end == other.end && id == other.id;
-           }
+               bool operator== (const MusicRange& other) const {
+                       return start == other.start && end == other.end && id == other.id;
+               }
 
-           bool equal (const MusicRange& other) const {
-                   return start == other.start && end == other.end;
-           }
+               bool equal (const MusicRange& other) const {
+                       return start == other.start && end == other.end;
+               }
        };
 
        /*
@@ -285,9 +256,9 @@ namespace ARDOUR {
        };
 
        enum RegionPoint {
-           Start,
-           End,
-           SyncPoint
+               Start,
+               End,
+               SyncPoint
        };
 
        enum Change {
@@ -330,9 +301,9 @@ namespace ARDOUR {
                AddHigher
        };
 
-       enum SoloModel {
-               SoloInPlace,
-               SoloBus
+       enum ListenPosition {
+               AfterFaderListen,
+               PreFaderListen
        };
 
        enum AutoConnectOption {
@@ -342,10 +313,10 @@ namespace ARDOUR {
        };
 
        struct InterThreadInfo {
-           volatile bool  done;
-           volatile bool  cancel;
-           volatile float progress;
-           pthread_t      thread;
+               volatile bool  done;
+               volatile bool  cancel;
+               volatile float progress;
+               pthread_t      thread;
        };
 
        enum SampleFormat {
@@ -371,10 +342,10 @@ namespace ARDOUR {
        };
 
        struct PeakData {
-           typedef Sample PeakDatum;
+               typedef Sample PeakDatum;
 
-           PeakDatum min;
-           PeakDatum max;
+               PeakDatum min;
+               PeakDatum max;
        };
 
        enum PluginType {
@@ -383,17 +354,16 @@ namespace ARDOUR {
                LV2,
                VST
        };
-       
+
        enum RunContext {
                ButlerContext = 0,
                TransportContext,
                ExportContext
        };
 
-       enum SlaveSource {
-               None = 0,
-               MTC,
+       enum SyncSource {
                JACK,
+               MTC,
                MIDIClock
        };
 
@@ -403,7 +373,7 @@ namespace ARDOUR {
        };
 
        enum ShuttleUnits {
-               Percentage,
+               Percentage,
                Semitones
        };
 
@@ -418,15 +388,16 @@ namespace ARDOUR {
        };
 
        struct TimeFXRequest : public InterThreadInfo {
-               TimeFXRequest() : time_fraction(0), pitch_fraction(0),
+               TimeFXRequest()
+                       : time_fraction(0), pitch_fraction(0),
                        quick_seek(false), antialias(false),  opts(0) {}
-           float time_fraction;
-           float pitch_fraction;
-           /* SoundTouch */
-           bool  quick_seek;
-           bool  antialias;
-           /* RubberBand */
-           int   opts; // really RubberBandStretcher::Options
+               float time_fraction;
+               float pitch_fraction;
+               /* SoundTouch */
+               bool  quick_seek;
+               bool  antialias;
+               /* RubberBand */
+               int   opts; // really RubberBandStretcher::Options
        };
 
        typedef std::list<nframes64_t> AnalysisFeatureList;
@@ -446,39 +417,105 @@ namespace ARDOUR {
                Rectified
        };
 
+       enum QuantizeType {
+               Plain,
+               Legato,
+               Groove
+       };
+
+       struct CleanupReport {
+               std::vector<std::string> paths;
+               int64_t                  space;
+       };
+
+       /** A struct used to describe changes to processors in a route.
+        *  This is useful because objects that respond to a change in processors
+        *  can optimise what work they do based on details of what has changed.
+       */
+       struct RouteProcessorChange {
+               enum Type {
+                       GeneralChange = 0x0,
+                       MeterPointChange = 0x1
+               };
+
+               RouteProcessorChange () {
+                       type = GeneralChange;
+               }
+
+               RouteProcessorChange (Type t) {
+                       type = t;
+                       meter_visibly_changed = true;
+               }
+
+               RouteProcessorChange (Type t, bool m) {
+                       type = t;
+                       meter_visibly_changed = m;
+               }
+
+               /** type of change; "GeneralChange" means anything could have changed */
+               Type type;
+               /** true if, when a MeterPointChange has occurred, the change is visible to the user */
+               bool meter_visibly_changed;
+       };
+
 } // namespace ARDOUR
 
+
+/* these cover types declared above in this header. See enums.cc
+   for the definitions.
+*/
+
 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::SoloModel& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeModel& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::SlaveSource& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::SmpteFormat& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::TimecodeFormat& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
 
-using ARDOUR::nframes_t;
-
-static inline nframes_t
-session_frame_to_track_frame (nframes_t session_frame, double speed)
+std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeModel& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::TimecodeFormat& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
+
+static inline ARDOUR::nframes64_t
+session_frame_to_track_frame (ARDOUR::nframes64_t session_frame, double speed)
 {
-       return (nframes_t)( (double)session_frame * speed );
+       return (ARDOUR::nframes64_t)( (double)session_frame * speed );
 }
 
-static inline nframes_t
-track_frame_to_session_frame (nframes_t track_frame, double speed)
+static inline ARDOUR::nframes64_t
+track_frame_to_session_frame (ARDOUR::nframes64_t track_frame, double speed)
 {
-       return (nframes_t)( (double)track_frame / speed );
+       return (ARDOUR::nframes64_t)( (double)track_frame / speed );
 }
 
+/* for now, break the rules and use "using" to make these "global" */
+
+using ARDOUR::nframes_t;
+using ARDOUR::nframes64_t;
+
 
 #endif /* __ardour_types_h__ */