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,
159 #if 1 // XXX remove me.
160 /* These really need to go away, they're "well known" PluginAutomation.
161 * Abusing the AutomationType (range, steps, etc) to indentify controls is wrong.
162 * Luckily it's only used by mackie/strip.cc in Mixbus.
178 BusSendLevel, //really GainAutomation
190 std::string auto_state_to_string (AutoState);
191 AutoState string_to_auto_state (std::string);
213 MeterMaxSignal = 0x0001,
214 MeterMaxPeak = 0x0002,
219 MeterIEC1DIN = 0x0040,
220 MeterIEC1NOR = 0x0080,
221 MeterIEC2BBC = 0x0100,
222 MeterIEC2EBU = 0x0200,
225 MeterPeak0dB = 0x1000,
241 AllChannels = 0, ///< Pass through all channel information unmodified
242 FilterChannels, ///< Ignore events on certain channels
243 ForceChannel ///< Force all events to a certain channel
253 RoundDownMaybe = -2, ///< Round down only if necessary
254 RoundDownAlways = -1, ///< Always round down, even if on a division
255 RoundNearest = 0, ///< Round to nearest
256 RoundUpAlways = 1, ///< Always round up, even if on a division
257 RoundUpMaybe = 2 ///< Round up only if necessary
271 Timecode::Time timecode;
272 Timecode::BBT_Time bbt;
279 AnyTime() { type = Frames; frames = 0; }
281 bool operator== (AnyTime const & other) const {
282 if (type != other.type) { return false; }
286 return timecode == other.timecode;
288 return bbt == other.bbt;
290 return frames == other.frames;
292 return seconds == other.seconds;
294 return false; // get rid of warning
297 bool not_zero() const
301 return timecode.hours != 0 || timecode.minutes != 0 ||
302 timecode.seconds != 0 || timecode.frames != 0;
304 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
311 abort(); /* NOTREACHED */
316 /* used for translating audio frames to an exact musical position using a note divisor.
317 an exact musical position almost never falls exactly on an audio frame, but for sub-sample
318 musical accuracy we need to derive exact musical locations from a frame position
319 the division follows TempoMap::exact_beat_at_frame().
321 -1 musical location is the bar closest to frame
322 0 musical location is the musical position of the frame
323 1 musical location is the BBT beat closest to frame
324 n musical location is the quarter-note division n closest to frame
330 MusicFrame (framepos_t f, int32_t d) : frame (f), division (d) {}
332 void set (framepos_t f, int32_t d) {frame = f; division = d; }
334 MusicFrame operator- (MusicFrame other) { return MusicFrame (frame - other.frame, 0); }
337 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
338 but this has a uint32_t id which Evoral::Range<> does not.
345 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
347 framecnt_t length() const { return end - start + 1; }
349 bool operator== (const AudioRange& other) const {
350 return start == other.start && end == other.end && id == other.id;
353 bool equal (const AudioRange& other) const {
354 return start == other.start && end == other.end;
357 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
358 return Evoral::coverage (start, end, s, e);
363 Timecode::BBT_Time start;
364 Timecode::BBT_Time end;
367 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
368 : start (s), end (e), id (i) {}
370 bool operator== (const MusicRange& other) const {
371 return start == other.start && end == other.end && id == other.id;
374 bool equal (const MusicRange& other) const {
375 return start == other.start && end == other.end;
380 Slowest = 6.6dB/sec falloff at update rate of 40ms
381 Slow = 6.8dB/sec falloff at update rate of 40ms
386 MeterFalloffSlowest = 1,
387 MeterFalloffSlow = 2,
388 MeterFalloffSlowish = 3,
389 MeterFalloffModerate = 4,
390 MeterFalloffMedium = 5,
391 MeterFalloffFast = 6,
392 MeterFalloffFaster = 7,
393 MeterFalloffFastest = 8,
399 MeterHoldMedium = 100,
410 enum RegionSelectionAfterSplit {
412 NewlyCreatedLeft = 1, // bit 0
413 NewlyCreatedRight = 2, // bit 1
414 NewlyCreatedBoth = 3,
415 Existing = 4, // bit 2
416 ExistingNewlyCreatedLeft = 5,
417 ExistingNewlyCreatedRight = 6,
418 ExistingNewlyCreatedBoth = 7
433 HardwareMonitoring, ///< JACK does monitoring
434 SoftwareMonitoring, ///< Ardour does monitoring
435 ExternalMonitoring ///< we leave monitoring to the audio hardware
446 MonitoringSilence = 0x1,
447 MonitoringInput = 0x2,
448 MonitoringDisk = 0x4,
452 MeteringInput, ///< meter the input IO, regardless of what is going through the route
453 MeteringRoute ///< meter what is going through the route
456 enum VUMeterStandard {
457 MeteringVUfrench, // 0VU = -2dBu
458 MeteringVUamerican, // 0VU = 0dBu
459 MeteringVUstandard, // 0VU = +4dBu
460 MeteringVUeight // 0VU = +8dBu
471 /** PFL signals come from before pre-fader processors */
472 PFLFromBeforeProcessors,
473 /** PFL signals come pre-fader but after pre-fader processors */
474 PFLFromAfterProcessors
478 /** AFL signals come post-fader and before post-fader processors */
479 AFLFromBeforeProcessors,
480 /** AFL signals come post-fader but after post-fader processors */
481 AFLFromAfterProcessors
496 enum ListenPosition {
501 enum AutoConnectOption {
503 AutoConnectPhysical = 0x1,
504 AutoConnectMaster = 0x2
507 enum TracksAutoNamingRule {
508 UseDefaultNames = 0x1,
509 NameAfterDriver = 0x2
518 int format_data_width (ARDOUR::SampleFormat);
520 enum CDMarkerFormat {
540 typedef Sample PeakDatum;
553 /* These are "synonyms". It is important for JACK to be first
554 both here and in enums.cc, so that the string "JACK" is
555 correctly recognized in older session and preference files.
564 enum ShuttleBehaviour {
574 typedef std::vector<boost::shared_ptr<Source> > SourceList;
584 typedef std::list<framepos_t> AnalysisFeatureList;
586 typedef std::list<boost::shared_ptr<Route> > RouteList;
587 typedef std::list<boost::shared_ptr<Stripable> > StripableList;
588 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
589 typedef std::list<boost::weak_ptr <Stripable> > WeakStripableList;
590 typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
592 typedef std::list<boost::shared_ptr<VCA> > VCAList;
595 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
607 struct CleanupReport {
608 std::vector<std::string> paths;
612 enum PositionLockStyle {
617 /** A struct used to describe changes to processors in a route.
618 * This is useful because objects that respond to a change in processors
619 * can optimise what work they do based on details of what has changed.
621 struct RouteProcessorChange {
624 MeterPointChange = 0x1,
628 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
631 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
634 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
637 /** type of change; "GeneralChange" means anything could have changed */
639 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
640 bool meter_visibly_changed;
644 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
645 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
646 uint32_t master_out_channels; /* how many channels for the master bus */
647 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
648 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
659 enum TransportState {
660 /* these values happen to match the constants used by JACK but
661 this equality cannot be assumed.
663 TransportStopped = 0,
664 TransportRolling = 1,
665 TransportLooping = 2,
666 TransportStarting = 3,
670 /* these values happen to match the constants used by JACK but
671 this equality cannot be assumed.
679 /* non-JACK related flags */
686 MidiPortControl = 0x2,
687 MidiPortSelection = 0x4,
688 MidiPortVirtual = 0x8
691 struct LatencyRange {
692 uint32_t min; //< samples
693 uint32_t max; //< samples
696 enum BufferingPreset {
703 enum AutoReturnTarget {
705 RangeSelectionStart = 0x2,
707 RegionSelectionStart = 0x8,
710 enum PlaylistDisposition {
716 enum MidiTrackNameSource {
722 enum MidiTempoMapDisposition {
727 } // namespace ARDOUR
729 static inline ARDOUR::framepos_t
730 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
732 long double result = (long double) session_frame * (long double) speed;
734 if (result >= (long double) ARDOUR::max_framepos) {
735 return ARDOUR::max_framepos;
736 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
737 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
743 static inline ARDOUR::framepos_t
744 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
746 /* NB - do we need a check for speed == 0 ??? */
747 long double result = (long double) track_frame / (long double) speed;
749 if (result >= (long double) ARDOUR::max_framepos) {
750 return ARDOUR::max_framepos;
751 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
752 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
758 /* for now, break the rules and use "using" to make this "global" */
760 using ARDOUR::framepos_t;
763 #endif /* __ardour_types_h__ */