Add support for Latch Automation
[ardour.git] / libs / ardour / ardour / types.h
index a7f9b5b5ffde83b9ddda3cdededbe03bf867078f..8358d78e9ad5299dc5809e63e331f03a0fdaf129 100644 (file)
@@ -23,6 +23,7 @@
 #include <istream>
 #include <vector>
 #include <map>
+#include <set>
 #include <boost/shared_ptr.hpp>
 #include <sys/types.h>
 #include <stdint.h>
@@ -52,6 +53,10 @@ namespace ARDOUR {
        class AudioSource;
        class Route;
        class Region;
+       class Stripable;
+       class VCA;
+       class AutomationControl;
+       class SlavableAutomationControl;
 
        typedef float    Sample;
        typedef float    pan_t;
@@ -108,15 +113,22 @@ namespace ARDOUR {
        */
 
        enum InsertMergePolicy {
-               InsertMergeReject,  // no overlaps allowed
-               InsertMergeRelax,   // we just don't care about overlaps
-               InsertMergeReplace, // replace old with new
-               InsertMergeTruncateExisting, // shorten existing to avoid overlap
-               InsertMergeTruncateAddition, // shorten new to avoid overlap
-               InsertMergeExtend   // extend new (or old) to the range of old+new
+               InsertMergeReject,  ///< no overlaps allowed
+               InsertMergeRelax,   ///< we just don't care about overlaps
+               InsertMergeReplace, ///< replace old with new
+               InsertMergeTruncateExisting, ///< shorten existing to avoid overlap
+               InsertMergeTruncateAddition, ///< shorten new to avoid overlap
+               InsertMergeExtend   ///< extend new (or old) to the range of old+new
        };
 
        /** See evoral/Parameter.hpp
+        *
+        * When you add things here, you REALLY SHOULD add a case clause to
+        * the constructor of ParameterDescriptor, unless the Controllables
+        * that the enum refers to are completely standard (0-1.0 range, 0.0 as
+        * normal, non-toggled, non-enumerated). Anything else needs to be
+        * added there so that things that try to represent them can do so
+        * with as much information as possible.
         */
        enum AutomationType {
                NullAutomation,
@@ -129,51 +141,38 @@ namespace ARDOUR {
                PluginAutomation,
                PluginPropertyAutomation,
                SoloAutomation,
+               SoloIsolateAutomation,
+               SoloSafeAutomation,
                MuteAutomation,
                MidiCCAutomation,
                MidiPgmChangeAutomation,
                MidiPitchBenderAutomation,
                MidiChannelPressureAutomation,
+               MidiNotePressureAutomation,
                MidiSystemExclusiveAutomation,
                FadeInAutomation,
                FadeOutAutomation,
                EnvelopeAutomation,
                RecEnableAutomation,
+               RecSafeAutomation,
                TrimAutomation,
                PhaseAutomation,
-               SendAutomation,
-               EQGain,
-               EQFrequency,
-               EQQ,
-               EQShape,
-               EQHPF,
-               EQEnable,
-               CompThreshold,
-               CompSpeed,
-               CompMode,
-               CompMakeup,
-               CompRedux,
-               CompEnable,
+               MonitoringAutomation,
+               BusSendLevel,
+               BusSendEnable
        };
 
        enum AutoState {
-               Off = 0x0,
-               Write = 0x1,
-               Touch = 0x2,
-               Play = 0x4
+               Off   = 0x00,
+               Write = 0x01,
+               Touch = 0x02,
+               Play  = 0x04,
+               Latch = 0x08
        };
 
        std::string auto_state_to_string (AutoState);
        AutoState string_to_auto_state (std::string);
 
-       enum AutoStyle {
-               Absolute = 0x1,
-               Trim = 0x2
-       };
-
-       std::string auto_style_to_string (AutoStyle);
-       AutoStyle string_to_auto_style (std::string);
-
        enum AlignStyle {
                CaptureTime,
                ExistingMaterial
@@ -297,6 +296,27 @@ namespace ARDOUR {
                }
        };
 
+       /* used for translating audio frames to an exact musical position using a note divisor.
+          an exact musical position almost never falls exactly on an audio frame, but for sub-sample
+          musical accuracy we need to derive exact musical locations from a frame position
+          the division follows TempoMap::exact_beat_at_frame().
+          division
+          -1       musical location is the bar closest to frame
+           0       musical location is the musical position of the frame
+           1       musical location is the BBT beat closest to frame
+           n       musical location is the quarter-note division n closest to frame
+       */
+       struct MusicFrame {
+               framepos_t frame;
+               int32_t    division;
+
+               MusicFrame (framepos_t f, int32_t d) : frame (f), division (d) {}
+
+               void set (framepos_t f, int32_t d) {frame = f; division = d; }
+
+               MusicFrame operator- (MusicFrame other) { return MusicFrame (frame - other.frame, 0); }
+       };
+
        /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
           but this has a uint32_t id which Evoral::Range<> does not.
        */
@@ -307,7 +327,7 @@ namespace ARDOUR {
 
                AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
 
-               framecnt_t length() { return end - start + 1; }
+               framecnt_t length() const { return end - start + 1; }
 
                bool operator== (const AudioRange& other) const {
                        return start == other.start && end == other.end && id == other.id;
@@ -451,11 +471,6 @@ namespace ARDOUR {
                DenormalFTZDAZ
        };
 
-       enum RemoteModel {
-               UserOrdered,
-               MixerOrdered
-       };
-
        enum LayerModel {
                LaterHigher,
                Manual
@@ -552,7 +567,14 @@ namespace ARDOUR {
        typedef std::list<framepos_t> AnalysisFeatureList;
 
        typedef std::list<boost::shared_ptr<Route> > RouteList;
+       typedef std::list<boost::shared_ptr<Stripable> > StripableList;
        typedef std::list<boost::weak_ptr  <Route> > WeakRouteList;
+       typedef std::list<boost::weak_ptr  <Stripable> > WeakStripableList;
+       typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
+       typedef std::list<boost::shared_ptr<SlavableAutomationControl> > SlavableControlList;
+       typedef std::set <boost::shared_ptr<AutomationControl> > AutomationControlSet;
+
+       typedef std::list<boost::shared_ptr<VCA> > VCAList;
 
        class Bundle;
        typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
@@ -604,11 +626,7 @@ namespace ARDOUR {
        };
 
        struct BusProfile {
-               AutoConnectOption input_ac;      /* override the RC config for input auto-connection */
-               AutoConnectOption output_ac;     /* override the RC config for output auto-connection */
-               uint32_t master_out_channels;    /* how many channels for the master bus */
-               uint32_t requested_physical_in;  /* now many of the available physical inputs to consider usable */
-               uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
+               uint32_t master_out_channels; /* how many channels for the master bus, 0: no master bus */
        };
 
        enum FadeShape {
@@ -637,7 +655,18 @@ namespace ARDOUR {
                IsOutput = 0x2,
                IsPhysical = 0x4,
                CanMonitor = 0x8,
-               IsTerminal = 0x10
+               IsTerminal = 0x10,
+
+               /* non-JACK related flags */
+               Hidden = 0x20,
+               Shadow = 0x40
+       };
+
+       enum MidiPortFlags {
+               MidiPortMusic = 0x1,
+               MidiPortControl = 0x2,
+               MidiPortSelection = 0x4,
+               MidiPortVirtual = 0x8
        };
 
        struct LatencyRange {
@@ -665,73 +694,18 @@ namespace ARDOUR {
                SharePlaylist
        };
 
-} // 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::TracksAutoNamingRule& 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::PFLPosition& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& 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::InsertMergePolicy& 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, Timecode::TimecodeFormat& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
-std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::MeterType& sf);
-
-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::TracksAutoNamingRule& 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::PFLPosition& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& 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::InsertMergePolicy& 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 Timecode::TimecodeFormat& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
-
-/* because these operators work on types which can be used when making
-   a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
-*/
-LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
-LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
-LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
-LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
+       enum MidiTrackNameSource {
+               SMFTrackNumber,
+               SMFTrackName,
+               SMFInstrumentName
+       };
 
-LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
-LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
-LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
-LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
+       enum MidiTempoMapDisposition {
+               SMFTempoIgnore,
+               SMFTempoUse,
+       };
 
+} // namespace ARDOUR
 
 static inline ARDOUR::framepos_t
 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
@@ -768,4 +742,3 @@ using ARDOUR::framepos_t;
 
 
 #endif /* __ardour_types_h__ */
-