2 Copyright (C) 2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef __ardour_types_h__
21 #define __ardour_types_h__
26 #include <boost/shared_ptr.hpp>
27 #include <sys/types.h>
33 #include "timecode/bbt_time.h"
34 #include "timecode/time.h"
38 #include "evoral/Range.hpp"
40 #include "ardour/chan_count.h"
41 #include "ardour/plugin_types.h"
57 class AutomationControl;
62 typedef uint32_t layer_t;
63 typedef uint64_t microseconds_t;
64 typedef uint32_t pframes_t;
66 /* Any position measured in audio frames.
67 Assumed to be non-negative but not enforced.
69 typedef int64_t framepos_t;
71 /* Any distance from a given framepos_t.
72 Maybe positive or negative.
74 typedef int64_t frameoffset_t;
76 /* Any count of audio frames.
77 Assumed to be positive but not enforced.
79 typedef int64_t framecnt_t;
81 static const framepos_t max_framepos = INT64_MAX;
82 static const framecnt_t max_framecnt = INT64_MAX;
83 static const layer_t max_layer = UINT32_MAX;
85 // a set of (time) intervals: first of pair is the offset of the start within the region, second is the offset of the end
86 typedef std::list<std::pair<frameoffset_t, frameoffset_t> > AudioIntervalResult;
87 // associate a set of intervals with regions (e.g. for silence detection)
88 typedef std::map<boost::shared_ptr<ARDOUR::Region>,AudioIntervalResult> AudioIntervalMap;
90 typedef std::list<boost::shared_ptr<Region> > RegionList;
96 ConfigurationChanged = 0x1,
97 ConnectionsChanged = 0x2
100 IOChange () : type (NoChange) {}
101 IOChange (Type t) : type (t) {}
103 /** channel count of IO before a ConfigurationChanged, if appropriate */
104 ARDOUR::ChanCount before;
105 /** channel count of IO after a ConfigurationChanged, if appropriate */
106 ARDOUR::ChanCount after;
109 /* policies for inserting/pasting material where overlaps
113 enum InsertMergePolicy {
114 InsertMergeReject, ///< no overlaps allowed
115 InsertMergeRelax, ///< we just don't care about overlaps
116 InsertMergeReplace, ///< replace old with new
117 InsertMergeTruncateExisting, ///< shorten existing to avoid overlap
118 InsertMergeTruncateAddition, ///< shorten new to avoid overlap
119 InsertMergeExtend ///< extend new (or old) to the range of old+new
122 /** See evoral/Parameter.hpp
124 * When you add things here, you REALLY SHOULD add a case clause to
125 * the constructor of ParameterDescriptor, unless the Controllables
126 * that the enum refers to are completely standard (0-1.0 range, 0.0 as
127 * normal, non-toggled, non-enumerated). Anything else needs to be
128 * added there so that things that try to represent them can do so
129 * with as much information as possible.
131 enum AutomationType {
134 PanAzimuthAutomation,
135 PanElevationAutomation,
137 PanFrontBackAutomation,
140 PluginPropertyAutomation,
142 SoloIsolateAutomation,
146 MidiPgmChangeAutomation,
147 MidiPitchBenderAutomation,
148 MidiChannelPressureAutomation,
149 MidiNotePressureAutomation,
150 MidiSystemExclusiveAutomation,
158 MonitoringAutomation,
184 std::string auto_state_to_string (AutoState);
185 AutoState string_to_auto_state (std::string);
207 MeterMaxSignal = 0x0001,
208 MeterMaxPeak = 0x0002,
213 MeterIEC1DIN = 0x0040,
214 MeterIEC1NOR = 0x0080,
215 MeterIEC2BBC = 0x0100,
216 MeterIEC2EBU = 0x0200,
219 MeterPeak0dB = 0x1000,
235 AllChannels = 0, ///< Pass through all channel information unmodified
236 FilterChannels, ///< Ignore events on certain channels
237 ForceChannel ///< Force all events to a certain channel
247 RoundDownMaybe = -2, ///< Round down only if necessary
248 RoundDownAlways = -1, ///< Always round down, even if on a division
249 RoundNearest = 0, ///< Round to nearest
250 RoundUpAlways = 1, ///< Always round up, even if on a division
251 RoundUpMaybe = 2 ///< Round up only if necessary
265 Timecode::Time timecode;
266 Timecode::BBT_Time bbt;
273 AnyTime() { type = Frames; frames = 0; }
275 bool operator== (AnyTime const & other) const {
276 if (type != other.type) { return false; }
280 return timecode == other.timecode;
282 return bbt == other.bbt;
284 return frames == other.frames;
286 return seconds == other.seconds;
288 return false; // get rid of warning
291 bool not_zero() const
295 return timecode.hours != 0 || timecode.minutes != 0 ||
296 timecode.seconds != 0 || timecode.frames != 0;
298 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
305 abort(); /* NOTREACHED */
310 /* used for translating audio frames to an exact musical position using a note divisor.
311 an exact musical position almost never falls exactly on an audio frame, but for sub-sample
312 musical accuracy we need to derive exact musical locations from a frame position
313 the division follows TempoMap::exact_beat_at_frame().
315 -1 musical location is the bar closest to frame
316 0 musical location is the musical position of the frame
317 1 musical location is the BBT beat closest to frame
318 n musical location is the quarter-note division n closest to frame
324 MusicFrame (framepos_t f, int32_t d) : frame (f), division (d) {}
326 void set (framepos_t f, int32_t d) {frame = f; division = d; }
328 MusicFrame operator- (MusicFrame other) { return MusicFrame (frame - other.frame, 0); }
331 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
332 but this has a uint32_t id which Evoral::Range<> does not.
339 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
341 framecnt_t length() const { return end - start + 1; }
343 bool operator== (const AudioRange& other) const {
344 return start == other.start && end == other.end && id == other.id;
347 bool equal (const AudioRange& other) const {
348 return start == other.start && end == other.end;
351 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
352 return Evoral::coverage (start, end, s, e);
357 Timecode::BBT_Time start;
358 Timecode::BBT_Time end;
361 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
362 : start (s), end (e), id (i) {}
364 bool operator== (const MusicRange& other) const {
365 return start == other.start && end == other.end && id == other.id;
368 bool equal (const MusicRange& other) const {
369 return start == other.start && end == other.end;
374 Slowest = 6.6dB/sec falloff at update rate of 40ms
375 Slow = 6.8dB/sec falloff at update rate of 40ms
380 MeterFalloffSlowest = 1,
381 MeterFalloffSlow = 2,
382 MeterFalloffSlowish = 3,
383 MeterFalloffModerate = 4,
384 MeterFalloffMedium = 5,
385 MeterFalloffFast = 6,
386 MeterFalloffFaster = 7,
387 MeterFalloffFastest = 8,
393 MeterHoldMedium = 100,
404 enum RegionSelectionAfterSplit {
406 NewlyCreatedLeft = 1, // bit 0
407 NewlyCreatedRight = 2, // bit 1
408 NewlyCreatedBoth = 3,
409 Existing = 4, // bit 2
410 ExistingNewlyCreatedLeft = 5,
411 ExistingNewlyCreatedRight = 6,
412 ExistingNewlyCreatedBoth = 7
427 HardwareMonitoring, ///< JACK does monitoring
428 SoftwareMonitoring, ///< Ardour does monitoring
429 ExternalMonitoring ///< we leave monitoring to the audio hardware
440 MonitoringSilence = 0x1,
441 MonitoringInput = 0x2,
442 MonitoringDisk = 0x4,
446 MeteringInput, ///< meter the input IO, regardless of what is going through the route
447 MeteringRoute ///< meter what is going through the route
450 enum VUMeterStandard {
451 MeteringVUfrench, // 0VU = -2dBu
452 MeteringVUamerican, // 0VU = 0dBu
453 MeteringVUstandard, // 0VU = +4dBu
454 MeteringVUeight // 0VU = +8dBu
465 /** PFL signals come from before pre-fader processors */
466 PFLFromBeforeProcessors,
467 /** PFL signals come pre-fader but after pre-fader processors */
468 PFLFromAfterProcessors
472 /** AFL signals come post-fader and before post-fader processors */
473 AFLFromBeforeProcessors,
474 /** AFL signals come post-fader but after post-fader processors */
475 AFLFromAfterProcessors
490 enum ListenPosition {
495 enum AutoConnectOption {
497 AutoConnectPhysical = 0x1,
498 AutoConnectMaster = 0x2
501 enum TracksAutoNamingRule {
502 UseDefaultNames = 0x1,
503 NameAfterDriver = 0x2
512 int format_data_width (ARDOUR::SampleFormat);
514 enum CDMarkerFormat {
534 typedef Sample PeakDatum;
547 /* These are "synonyms". It is important for JACK to be first
548 both here and in enums.cc, so that the string "JACK" is
549 correctly recognized in older session and preference files.
558 enum ShuttleBehaviour {
568 typedef std::vector<boost::shared_ptr<Source> > SourceList;
578 typedef std::list<framepos_t> AnalysisFeatureList;
580 typedef std::list<boost::shared_ptr<Route> > RouteList;
581 typedef std::list<boost::shared_ptr<Stripable> > StripableList;
582 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
583 typedef std::list<boost::weak_ptr <Stripable> > WeakStripableList;
584 typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
586 typedef std::list<boost::shared_ptr<VCA> > VCAList;
589 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
601 struct CleanupReport {
602 std::vector<std::string> paths;
606 enum PositionLockStyle {
611 /** A struct used to describe changes to processors in a route.
612 * This is useful because objects that respond to a change in processors
613 * can optimise what work they do based on details of what has changed.
615 struct RouteProcessorChange {
618 MeterPointChange = 0x1,
622 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
625 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
628 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
631 /** type of change; "GeneralChange" means anything could have changed */
633 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
634 bool meter_visibly_changed;
638 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
639 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
640 uint32_t master_out_channels; /* how many channels for the master bus */
641 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
642 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
653 enum TransportState {
654 /* these values happen to match the constants used by JACK but
655 this equality cannot be assumed.
657 TransportStopped = 0,
658 TransportRolling = 1,
659 TransportLooping = 2,
660 TransportStarting = 3,
664 /* these values happen to match the constants used by JACK but
665 this equality cannot be assumed.
673 /* non-JACK related flags */
680 MidiPortControl = 0x2,
681 MidiPortSelection = 0x4,
682 MidiPortVirtual = 0x8
685 struct LatencyRange {
686 uint32_t min; //< samples
687 uint32_t max; //< samples
690 enum BufferingPreset {
697 enum AutoReturnTarget {
699 RangeSelectionStart = 0x2,
701 RegionSelectionStart = 0x8,
704 enum PlaylistDisposition {
710 enum MidiTrackNameSource {
716 enum MidiTempoMapDisposition {
721 } // namespace ARDOUR
723 static inline ARDOUR::framepos_t
724 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
726 long double result = (long double) session_frame * (long double) speed;
728 if (result >= (long double) ARDOUR::max_framepos) {
729 return ARDOUR::max_framepos;
730 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
731 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
737 static inline ARDOUR::framepos_t
738 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
740 /* NB - do we need a check for speed == 0 ??? */
741 long double result = (long double) track_frame / (long double) speed;
743 if (result >= (long double) ARDOUR::max_framepos) {
744 return ARDOUR::max_framepos;
745 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
746 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
752 /* for now, break the rules and use "using" to make this "global" */
754 using ARDOUR::framepos_t;
757 #endif /* __ardour_types_h__ */