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;
58 class SlavableAutomationControl;
63 typedef uint32_t layer_t;
64 typedef uint64_t microseconds_t;
65 typedef uint32_t pframes_t;
67 /* Any position measured in audio frames.
68 Assumed to be non-negative but not enforced.
70 typedef int64_t framepos_t;
72 /* Any distance from a given framepos_t.
73 Maybe positive or negative.
75 typedef int64_t frameoffset_t;
77 /* Any count of audio frames.
78 Assumed to be positive but not enforced.
80 typedef int64_t framecnt_t;
82 static const framepos_t max_framepos = INT64_MAX;
83 static const framecnt_t max_framecnt = INT64_MAX;
84 static const layer_t max_layer = UINT32_MAX;
86 // a set of (time) intervals: first of pair is the offset of the start within the region, second is the offset of the end
87 typedef std::list<std::pair<frameoffset_t, frameoffset_t> > AudioIntervalResult;
88 // associate a set of intervals with regions (e.g. for silence detection)
89 typedef std::map<boost::shared_ptr<ARDOUR::Region>,AudioIntervalResult> AudioIntervalMap;
91 typedef std::list<boost::shared_ptr<Region> > RegionList;
97 ConfigurationChanged = 0x1,
98 ConnectionsChanged = 0x2
101 IOChange () : type (NoChange) {}
102 IOChange (Type t) : type (t) {}
104 /** channel count of IO before a ConfigurationChanged, if appropriate */
105 ARDOUR::ChanCount before;
106 /** channel count of IO after a ConfigurationChanged, if appropriate */
107 ARDOUR::ChanCount after;
110 /* policies for inserting/pasting material where overlaps
114 enum InsertMergePolicy {
115 InsertMergeReject, ///< no overlaps allowed
116 InsertMergeRelax, ///< we just don't care about overlaps
117 InsertMergeReplace, ///< replace old with new
118 InsertMergeTruncateExisting, ///< shorten existing to avoid overlap
119 InsertMergeTruncateAddition, ///< shorten new to avoid overlap
120 InsertMergeExtend ///< extend new (or old) to the range of old+new
123 /** See evoral/Parameter.hpp
125 * When you add things here, you REALLY SHOULD add a case clause to
126 * the constructor of ParameterDescriptor, unless the Controllables
127 * that the enum refers to are completely standard (0-1.0 range, 0.0 as
128 * normal, non-toggled, non-enumerated). Anything else needs to be
129 * added there so that things that try to represent them can do so
130 * with as much information as possible.
132 enum AutomationType {
135 PanAzimuthAutomation,
136 PanElevationAutomation,
138 PanFrontBackAutomation,
141 PluginPropertyAutomation,
143 SoloIsolateAutomation,
147 MidiPgmChangeAutomation,
148 MidiPitchBenderAutomation,
149 MidiChannelPressureAutomation,
150 MidiNotePressureAutomation,
151 MidiSystemExclusiveAutomation,
159 MonitoringAutomation,
171 std::string auto_state_to_string (AutoState);
172 AutoState string_to_auto_state (std::string);
194 MeterMaxSignal = 0x0001,
195 MeterMaxPeak = 0x0002,
200 MeterIEC1DIN = 0x0040,
201 MeterIEC1NOR = 0x0080,
202 MeterIEC2BBC = 0x0100,
203 MeterIEC2EBU = 0x0200,
206 MeterPeak0dB = 0x1000,
222 AllChannels = 0, ///< Pass through all channel information unmodified
223 FilterChannels, ///< Ignore events on certain channels
224 ForceChannel ///< Force all events to a certain channel
234 RoundDownMaybe = -2, ///< Round down only if necessary
235 RoundDownAlways = -1, ///< Always round down, even if on a division
236 RoundNearest = 0, ///< Round to nearest
237 RoundUpAlways = 1, ///< Always round up, even if on a division
238 RoundUpMaybe = 2 ///< Round up only if necessary
252 Timecode::Time timecode;
253 Timecode::BBT_Time bbt;
260 AnyTime() { type = Frames; frames = 0; }
262 bool operator== (AnyTime const & other) const {
263 if (type != other.type) { return false; }
267 return timecode == other.timecode;
269 return bbt == other.bbt;
271 return frames == other.frames;
273 return seconds == other.seconds;
275 return false; // get rid of warning
278 bool not_zero() const
282 return timecode.hours != 0 || timecode.minutes != 0 ||
283 timecode.seconds != 0 || timecode.frames != 0;
285 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
292 abort(); /* NOTREACHED */
297 /* used for translating audio frames to an exact musical position using a note divisor.
298 an exact musical position almost never falls exactly on an audio frame, but for sub-sample
299 musical accuracy we need to derive exact musical locations from a frame position
300 the division follows TempoMap::exact_beat_at_frame().
302 -1 musical location is the bar closest to frame
303 0 musical location is the musical position of the frame
304 1 musical location is the BBT beat closest to frame
305 n musical location is the quarter-note division n closest to frame
311 MusicFrame (framepos_t f, int32_t d) : frame (f), division (d) {}
313 void set (framepos_t f, int32_t d) {frame = f; division = d; }
315 MusicFrame operator- (MusicFrame other) { return MusicFrame (frame - other.frame, 0); }
318 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
319 but this has a uint32_t id which Evoral::Range<> does not.
326 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
328 framecnt_t length() const { return end - start + 1; }
330 bool operator== (const AudioRange& other) const {
331 return start == other.start && end == other.end && id == other.id;
334 bool equal (const AudioRange& other) const {
335 return start == other.start && end == other.end;
338 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
339 return Evoral::coverage (start, end, s, e);
344 Timecode::BBT_Time start;
345 Timecode::BBT_Time end;
348 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
349 : start (s), end (e), id (i) {}
351 bool operator== (const MusicRange& other) const {
352 return start == other.start && end == other.end && id == other.id;
355 bool equal (const MusicRange& other) const {
356 return start == other.start && end == other.end;
361 Slowest = 6.6dB/sec falloff at update rate of 40ms
362 Slow = 6.8dB/sec falloff at update rate of 40ms
367 MeterFalloffSlowest = 1,
368 MeterFalloffSlow = 2,
369 MeterFalloffSlowish = 3,
370 MeterFalloffModerate = 4,
371 MeterFalloffMedium = 5,
372 MeterFalloffFast = 6,
373 MeterFalloffFaster = 7,
374 MeterFalloffFastest = 8,
380 MeterHoldMedium = 100,
391 enum RegionSelectionAfterSplit {
393 NewlyCreatedLeft = 1, // bit 0
394 NewlyCreatedRight = 2, // bit 1
395 NewlyCreatedBoth = 3,
396 Existing = 4, // bit 2
397 ExistingNewlyCreatedLeft = 5,
398 ExistingNewlyCreatedRight = 6,
399 ExistingNewlyCreatedBoth = 7
414 HardwareMonitoring, ///< JACK does monitoring
415 SoftwareMonitoring, ///< Ardour does monitoring
416 ExternalMonitoring ///< we leave monitoring to the audio hardware
427 MonitoringSilence = 0x1,
428 MonitoringInput = 0x2,
429 MonitoringDisk = 0x4,
433 MeteringInput, ///< meter the input IO, regardless of what is going through the route
434 MeteringRoute ///< meter what is going through the route
437 enum VUMeterStandard {
438 MeteringVUfrench, // 0VU = -2dBu
439 MeteringVUamerican, // 0VU = 0dBu
440 MeteringVUstandard, // 0VU = +4dBu
441 MeteringVUeight // 0VU = +8dBu
452 /** PFL signals come from before pre-fader processors */
453 PFLFromBeforeProcessors,
454 /** PFL signals come pre-fader but after pre-fader processors */
455 PFLFromAfterProcessors
459 /** AFL signals come post-fader and before post-fader processors */
460 AFLFromBeforeProcessors,
461 /** AFL signals come post-fader but after post-fader processors */
462 AFLFromAfterProcessors
477 enum ListenPosition {
482 enum AutoConnectOption {
484 AutoConnectPhysical = 0x1,
485 AutoConnectMaster = 0x2
488 enum TracksAutoNamingRule {
489 UseDefaultNames = 0x1,
490 NameAfterDriver = 0x2
499 int format_data_width (ARDOUR::SampleFormat);
501 enum CDMarkerFormat {
521 typedef Sample PeakDatum;
534 /* These are "synonyms". It is important for JACK to be first
535 both here and in enums.cc, so that the string "JACK" is
536 correctly recognized in older session and preference files.
545 enum ShuttleBehaviour {
555 typedef std::vector<boost::shared_ptr<Source> > SourceList;
565 typedef std::list<framepos_t> AnalysisFeatureList;
567 typedef std::list<boost::shared_ptr<Route> > RouteList;
568 typedef std::list<boost::shared_ptr<Stripable> > StripableList;
569 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
570 typedef std::list<boost::weak_ptr <Stripable> > WeakStripableList;
571 typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
572 typedef std::list<boost::shared_ptr<SlavableAutomationControl> > SlavableControlList;
574 typedef std::list<boost::shared_ptr<VCA> > VCAList;
577 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
589 struct CleanupReport {
590 std::vector<std::string> paths;
594 enum PositionLockStyle {
599 /** A struct used to describe changes to processors in a route.
600 * This is useful because objects that respond to a change in processors
601 * can optimise what work they do based on details of what has changed.
603 struct RouteProcessorChange {
606 MeterPointChange = 0x1,
610 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
613 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
616 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
619 /** type of change; "GeneralChange" means anything could have changed */
621 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
622 bool meter_visibly_changed;
626 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
627 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
628 uint32_t master_out_channels; /* how many channels for the master bus */
629 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
630 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
641 enum TransportState {
642 /* these values happen to match the constants used by JACK but
643 this equality cannot be assumed.
645 TransportStopped = 0,
646 TransportRolling = 1,
647 TransportLooping = 2,
648 TransportStarting = 3,
652 /* these values happen to match the constants used by JACK but
653 this equality cannot be assumed.
661 /* non-JACK related flags */
668 MidiPortControl = 0x2,
669 MidiPortSelection = 0x4,
670 MidiPortVirtual = 0x8
673 struct LatencyRange {
674 uint32_t min; //< samples
675 uint32_t max; //< samples
678 enum BufferingPreset {
685 enum AutoReturnTarget {
687 RangeSelectionStart = 0x2,
689 RegionSelectionStart = 0x8,
692 enum PlaylistDisposition {
698 enum MidiTrackNameSource {
704 enum MidiTempoMapDisposition {
709 } // namespace ARDOUR
711 static inline ARDOUR::framepos_t
712 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
714 long double result = (long double) session_frame * (long double) speed;
716 if (result >= (long double) ARDOUR::max_framepos) {
717 return ARDOUR::max_framepos;
718 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
719 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
725 static inline ARDOUR::framepos_t
726 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
728 /* NB - do we need a check for speed == 0 ??? */
729 long double result = (long double) track_frame / (long double) speed;
731 if (result >= (long double) ARDOUR::max_framepos) {
732 return ARDOUR::max_framepos;
733 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
734 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
740 /* for now, break the rules and use "using" to make this "global" */
742 using ARDOUR::framepos_t;
745 #endif /* __ardour_types_h__ */