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);
192 std::string auto_style_to_string (AutoStyle);
193 AutoStyle string_to_auto_style (std::string);
215 MeterMaxSignal = 0x0001,
216 MeterMaxPeak = 0x0002,
221 MeterIEC1DIN = 0x0040,
222 MeterIEC1NOR = 0x0080,
223 MeterIEC2BBC = 0x0100,
224 MeterIEC2EBU = 0x0200,
227 MeterPeak0dB = 0x1000,
243 AllChannels = 0, ///< Pass through all channel information unmodified
244 FilterChannels, ///< Ignore events on certain channels
245 ForceChannel ///< Force all events to a certain channel
255 RoundDownMaybe = -2, ///< Round down only if necessary
256 RoundDownAlways = -1, ///< Always round down, even if on a division
257 RoundNearest = 0, ///< Round to nearest
258 RoundUpAlways = 1, ///< Always round up, even if on a division
259 RoundUpMaybe = 2 ///< Round up only if necessary
273 Timecode::Time timecode;
274 Timecode::BBT_Time bbt;
281 AnyTime() { type = Frames; frames = 0; }
283 bool operator== (AnyTime const & other) const {
284 if (type != other.type) { return false; }
288 return timecode == other.timecode;
290 return bbt == other.bbt;
292 return frames == other.frames;
294 return seconds == other.seconds;
296 return false; // get rid of warning
299 bool not_zero() const
303 return timecode.hours != 0 || timecode.minutes != 0 ||
304 timecode.seconds != 0 || timecode.frames != 0;
306 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
313 abort(); /* NOTREACHED */
318 /* used for translating audio frames to an exact musical position using a note divisor.
319 an exact musical position almost never falls exactly on an audio frame, but for sub-sample
320 musical accuracy we need to derive exact musical locations from a frame position
321 the division follows TempoMap::exact_beat_at_frame().
323 -1 musical location is the bar closest to frame
324 0 musical location is the musical position of the frame
325 1 musical location is the BBT beat closest to frame
326 n musical location is the quarter-note division n closest to frame
332 MusicFrame (framepos_t f, int32_t d) : frame (f), division (d) {}
334 void set (framepos_t f, int32_t d) {frame = f; division = d; }
336 MusicFrame operator- (MusicFrame other) { return MusicFrame (frame - other.frame, 0); }
339 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
340 but this has a uint32_t id which Evoral::Range<> does not.
347 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
349 framecnt_t length() const { return end - start + 1; }
351 bool operator== (const AudioRange& other) const {
352 return start == other.start && end == other.end && id == other.id;
355 bool equal (const AudioRange& other) const {
356 return start == other.start && end == other.end;
359 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
360 return Evoral::coverage (start, end, s, e);
365 Timecode::BBT_Time start;
366 Timecode::BBT_Time end;
369 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
370 : start (s), end (e), id (i) {}
372 bool operator== (const MusicRange& other) const {
373 return start == other.start && end == other.end && id == other.id;
376 bool equal (const MusicRange& other) const {
377 return start == other.start && end == other.end;
382 Slowest = 6.6dB/sec falloff at update rate of 40ms
383 Slow = 6.8dB/sec falloff at update rate of 40ms
388 MeterFalloffSlowest = 1,
389 MeterFalloffSlow = 2,
390 MeterFalloffSlowish = 3,
391 MeterFalloffModerate = 4,
392 MeterFalloffMedium = 5,
393 MeterFalloffFast = 6,
394 MeterFalloffFaster = 7,
395 MeterFalloffFastest = 8,
401 MeterHoldMedium = 100,
412 enum RegionSelectionAfterSplit {
414 NewlyCreatedLeft = 1, // bit 0
415 NewlyCreatedRight = 2, // bit 1
416 NewlyCreatedBoth = 3,
417 Existing = 4, // bit 2
418 ExistingNewlyCreatedLeft = 5,
419 ExistingNewlyCreatedRight = 6,
420 ExistingNewlyCreatedBoth = 7
435 HardwareMonitoring, ///< JACK does monitoring
436 SoftwareMonitoring, ///< Ardour does monitoring
437 ExternalMonitoring ///< we leave monitoring to the audio hardware
448 MonitoringSilence = 0x1,
449 MonitoringInput = 0x2,
450 MonitoringDisk = 0x4,
454 MeteringInput, ///< meter the input IO, regardless of what is going through the route
455 MeteringRoute ///< meter what is going through the route
458 enum VUMeterStandard {
459 MeteringVUfrench, // 0VU = -2dBu
460 MeteringVUamerican, // 0VU = 0dBu
461 MeteringVUstandard, // 0VU = +4dBu
462 MeteringVUeight // 0VU = +8dBu
473 /** PFL signals come from before pre-fader processors */
474 PFLFromBeforeProcessors,
475 /** PFL signals come pre-fader but after pre-fader processors */
476 PFLFromAfterProcessors
480 /** AFL signals come post-fader and before post-fader processors */
481 AFLFromBeforeProcessors,
482 /** AFL signals come post-fader but after post-fader processors */
483 AFLFromAfterProcessors
498 enum ListenPosition {
503 enum AutoConnectOption {
505 AutoConnectPhysical = 0x1,
506 AutoConnectMaster = 0x2
509 enum TracksAutoNamingRule {
510 UseDefaultNames = 0x1,
511 NameAfterDriver = 0x2
520 int format_data_width (ARDOUR::SampleFormat);
522 enum CDMarkerFormat {
542 typedef Sample PeakDatum;
555 /* These are "synonyms". It is important for JACK to be first
556 both here and in enums.cc, so that the string "JACK" is
557 correctly recognized in older session and preference files.
566 enum ShuttleBehaviour {
576 typedef std::vector<boost::shared_ptr<Source> > SourceList;
586 typedef std::list<framepos_t> AnalysisFeatureList;
588 typedef std::list<boost::shared_ptr<Route> > RouteList;
589 typedef std::list<boost::shared_ptr<Stripable> > StripableList;
590 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
591 typedef std::list<boost::weak_ptr <Stripable> > WeakStripableList;
592 typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
594 typedef std::list<boost::shared_ptr<VCA> > VCAList;
597 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
609 struct CleanupReport {
610 std::vector<std::string> paths;
614 enum PositionLockStyle {
619 /** A struct used to describe changes to processors in a route.
620 * This is useful because objects that respond to a change in processors
621 * can optimise what work they do based on details of what has changed.
623 struct RouteProcessorChange {
626 MeterPointChange = 0x1,
630 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
633 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
636 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
639 /** type of change; "GeneralChange" means anything could have changed */
641 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
642 bool meter_visibly_changed;
646 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
647 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
648 uint32_t master_out_channels; /* how many channels for the master bus */
649 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
650 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
661 enum TransportState {
662 /* these values happen to match the constants used by JACK but
663 this equality cannot be assumed.
665 TransportStopped = 0,
666 TransportRolling = 1,
667 TransportLooping = 2,
668 TransportStarting = 3,
672 /* these values happen to match the constants used by JACK but
673 this equality cannot be assumed.
681 /* non-JACK related flags */
688 MidiPortControl = 0x2,
689 MidiPortSelection = 0x4,
690 MidiPortVirtual = 0x8
693 struct LatencyRange {
694 uint32_t min; //< samples
695 uint32_t max; //< samples
698 enum BufferingPreset {
705 enum AutoReturnTarget {
707 RangeSelectionStart = 0x2,
709 RegionSelectionStart = 0x8,
712 enum PlaylistDisposition {
718 enum MidiTrackNameSource {
724 enum MidiTempoMapDisposition {
729 } // namespace ARDOUR
731 static inline ARDOUR::framepos_t
732 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
734 long double result = (long double) session_frame * (long double) speed;
736 if (result >= (long double) ARDOUR::max_framepos) {
737 return ARDOUR::max_framepos;
738 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
739 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
745 static inline ARDOUR::framepos_t
746 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
748 /* NB - do we need a check for speed == 0 ??? */
749 long double result = (long double) track_frame / (long double) speed;
751 if (result >= (long double) ARDOUR::max_framepos) {
752 return ARDOUR::max_framepos;
753 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
754 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
760 /* for now, break the rules and use "using" to make this "global" */
762 using ARDOUR::framepos_t;
765 #endif /* __ardour_types_h__ */