X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Ftypes.h;h=8358d78e9ad5299dc5809e63e331f03a0fdaf129;hb=1d587592ca1472e38b2f8127b87b6202874f0d4e;hp=165afd0dd9b2f72fc39f51db37f3ebf0a5be92c4;hpb=6b3a8915f3c50f7220121fcb9202ec20144389c4;p=ardour.git diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 165afd0dd9..8358d78e9a 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -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,36 +141,38 @@ namespace ARDOUR { PluginAutomation, PluginPropertyAutomation, SoloAutomation, + SoloIsolateAutomation, + SoloSafeAutomation, MuteAutomation, MidiCCAutomation, MidiPgmChangeAutomation, MidiPitchBenderAutomation, MidiChannelPressureAutomation, + MidiNotePressureAutomation, MidiSystemExclusiveAutomation, FadeInAutomation, FadeOutAutomation, EnvelopeAutomation, RecEnableAutomation, + RecSafeAutomation, + TrimAutomation, + PhaseAutomation, + 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 @@ -179,18 +193,20 @@ namespace ARDOUR { }; enum MeterType { - MeterMaxSignal = 0x001, - MeterMaxPeak = 0x002, - MeterPeak = 0x004, - MeterKrms = 0x008, - MeterK20 = 0x010, - MeterK14 = 0x020, - MeterIEC1DIN = 0x040, - MeterIEC1NOR = 0x080, - MeterIEC2BBC = 0x100, - MeterIEC2EBU = 0x200, - MeterVU = 0x400, - MeterK12 = 0x800 + MeterMaxSignal = 0x0001, + MeterMaxPeak = 0x0002, + MeterPeak = 0x0004, + MeterKrms = 0x0008, + MeterK20 = 0x0010, + MeterK14 = 0x0020, + MeterIEC1DIN = 0x0040, + MeterIEC1NOR = 0x0080, + MeterIEC2BBC = 0x0100, + MeterIEC2EBU = 0x0200, + MeterVU = 0x0400, + MeterK12 = 0x0800, + MeterPeak0dB = 0x1000, + MeterMCP = 0x2000 }; enum TrackMode { @@ -216,6 +232,14 @@ namespace ARDOUR { TrackColor }; + enum RoundMode { + RoundDownMaybe = -2, ///< Round down only if necessary + RoundDownAlways = -1, ///< Always round down, even if on a division + RoundNearest = 0, ///< Round to nearest + RoundUpAlways = 1, ///< Always round up, even if on a division + RoundUpMaybe = 2 ///< Round up only if necessary + }; + class AnyTime { public: enum Type { @@ -272,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. */ @@ -282,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; @@ -345,6 +390,17 @@ namespace ARDOUR { Lock }; + enum RegionSelectionAfterSplit { + None = 0, + NewlyCreatedLeft = 1, // bit 0 + NewlyCreatedRight = 2, // bit 1 + NewlyCreatedBoth = 3, + Existing = 4, // bit 2 + ExistingNewlyCreatedLeft = 5, + ExistingNewlyCreatedRight = 6, + ExistingNewlyCreatedBoth = 7 + }; + enum RegionPoint { Start, End, @@ -415,9 +471,9 @@ namespace ARDOUR { DenormalFTZDAZ }; - enum RemoteModel { - UserOrdered, - MixerOrdered + enum LayerModel { + LaterHigher, + Manual }; enum ListenPosition { @@ -431,16 +487,24 @@ namespace ARDOUR { AutoConnectMaster = 0x2 }; + enum TracksAutoNamingRule { + UseDefaultNames = 0x1, + NameAfterDriver = 0x2 + }; + enum SampleFormat { FormatFloat = 0, FormatInt24, FormatInt16 }; + int format_data_width (ARDOUR::SampleFormat); + enum CDMarkerFormat { CDMarkerNone, CDMarkerCUE, - CDMarkerTOC + CDMarkerTOC, + MP4Chaps }; enum HeaderFormat { @@ -450,7 +514,9 @@ namespace ARDOUR { CAF, AIFF, iXML, - RF64 + RF64, + RF64_WAV, + MBWF, }; struct PeakData { @@ -501,7 +567,14 @@ namespace ARDOUR { typedef std::list AnalysisFeatureList; typedef std::list > RouteList; + typedef std::list > StripableList; typedef std::list > WeakRouteList; + typedef std::list > WeakStripableList; + typedef std::list > ControlList; + typedef std::list > SlavableControlList; + typedef std::set > AutomationControlSet; + + typedef std::list > VCAList; class Bundle; typedef std::vector > BundleList; @@ -533,7 +606,8 @@ namespace ARDOUR { struct RouteProcessorChange { enum Type { GeneralChange = 0x0, - MeterPointChange = 0x1 + MeterPointChange = 0x1, + RealTimeChange = 0x2 }; RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true) @@ -552,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 { @@ -572,8 +642,8 @@ namespace ARDOUR { this equality cannot be assumed. */ TransportStopped = 0, - TransportRolling = 1, - TransportLooping = 2, + TransportRolling = 1, + TransportLooping = 2, TransportStarting = 3, }; @@ -581,11 +651,22 @@ namespace ARDOUR { /* these values happen to match the constants used by JACK but this equality cannot be assumed. */ - IsInput = 0x1, + IsInput = 0x1, 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 { @@ -593,67 +674,66 @@ namespace ARDOUR { uint32_t max; //< samples }; -} // namespace ARDOUR + enum BufferingPreset { + Small, + Medium, + Large, + Custom, + }; + enum AutoReturnTarget { + LastLocate = 0x1, + RangeSelectionStart = 0x2, + Loop = 0x4, + RegionSelectionStart = 0x8, + }; -/* these cover types declared above in this header. See enums.cc - for the definitions. -*/ + enum PlaylistDisposition { + CopyPlaylist, + NewPlaylist, + SharePlaylist + }; + + enum MidiTrackNameSource { + SMFTrackNumber, + SMFTrackName, + SMFInstrumentName + }; -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::VUMeterStandard& sf); -std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& 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::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::WaveformScale& sf); -std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf); -std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf); -std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& 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::EditMode& sf); -std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf); -std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf); -std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& 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::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::WaveformScale& sf); -std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf); -std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf); -std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf); + enum MidiTempoMapDisposition { + SMFTempoIgnore, + SMFTempoUse, + }; + +} // namespace ARDOUR static inline ARDOUR::framepos_t session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed) { - return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed); + long double result = (long double) session_frame * (long double) speed; + + if (result >= (long double) ARDOUR::max_framepos) { + return ARDOUR::max_framepos; + } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) { + return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1)); + } else { + return result; + } } static inline ARDOUR::framepos_t track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed) { - return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed); + /* NB - do we need a check for speed == 0 ??? */ + long double result = (long double) track_frame / (long double) speed; + + if (result >= (long double) ARDOUR::max_framepos) { + return ARDOUR::max_framepos; + } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) { + return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1)); + } else { + return result; + } } /* for now, break the rules and use "using" to make this "global" */ @@ -662,4 +742,3 @@ using ARDOUR::framepos_t; #endif /* __ardour_types_h__ */ -