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"
60 typedef uint32_t layer_t;
61 typedef uint64_t microseconds_t;
62 typedef uint32_t pframes_t;
64 /* Any position measured in audio frames.
65 Assumed to be non-negative but not enforced.
67 typedef int64_t framepos_t;
69 /* Any distance from a given framepos_t.
70 Maybe positive or negative.
72 typedef int64_t frameoffset_t;
74 /* Any count of audio frames.
75 Assumed to be positive but not enforced.
77 typedef int64_t framecnt_t;
79 static const framepos_t max_framepos = INT64_MAX;
80 static const framecnt_t max_framecnt = INT64_MAX;
81 static const layer_t max_layer = UINT32_MAX;
83 // a set of (time) intervals: first of pair is the offset of the start within the region, second is the offset of the end
84 typedef std::list<std::pair<frameoffset_t, frameoffset_t> > AudioIntervalResult;
85 // associate a set of intervals with regions (e.g. for silence detection)
86 typedef std::map<boost::shared_ptr<ARDOUR::Region>,AudioIntervalResult> AudioIntervalMap;
88 typedef std::list<boost::shared_ptr<Region> > RegionList;
94 ConfigurationChanged = 0x1,
95 ConnectionsChanged = 0x2
98 IOChange () : type (NoChange) {}
99 IOChange (Type t) : type (t) {}
101 /** channel count of IO before a ConfigurationChanged, if appropriate */
102 ARDOUR::ChanCount before;
103 /** channel count of IO after a ConfigurationChanged, if appropriate */
104 ARDOUR::ChanCount after;
107 /* policies for inserting/pasting material where overlaps
111 enum InsertMergePolicy {
112 InsertMergeReject, // no overlaps allowed
113 InsertMergeRelax, // we just don't care about overlaps
114 InsertMergeReplace, // replace old with new
115 InsertMergeTruncateExisting, // shorten existing to avoid overlap
116 InsertMergeTruncateAddition, // shorten new to avoid overlap
117 InsertMergeExtend // extend new (or old) to the range of old+new
120 /** See evoral/Parameter.hpp
122 * When you add things here, you REALLY SHOULD add a case clause to
123 * the constructor of ParameterDescriptor, unless the Controllables
124 * that the enum refers to are completely standard (0-1.0 range, 0.0 as
125 * normal, non-toggled, non-enumerated). Anything else needs to be
126 * added there so that things that try to represent them can do so
127 * with as much information as possible.
129 enum AutomationType {
132 PanAzimuthAutomation,
133 PanElevationAutomation,
135 PanFrontBackAutomation,
138 PluginPropertyAutomation,
140 SoloIsolateAutomation,
144 MidiPgmChangeAutomation,
145 MidiPitchBenderAutomation,
146 MidiChannelPressureAutomation,
147 MidiSystemExclusiveAutomation,
154 MonitoringAutomation,
178 std::string auto_state_to_string (AutoState);
179 AutoState string_to_auto_state (std::string);
186 std::string auto_style_to_string (AutoStyle);
187 AutoStyle string_to_auto_style (std::string);
209 MeterMaxSignal = 0x0001,
210 MeterMaxPeak = 0x0002,
215 MeterIEC1DIN = 0x0040,
216 MeterIEC1NOR = 0x0080,
217 MeterIEC2BBC = 0x0100,
218 MeterIEC2EBU = 0x0200,
221 MeterPeak0dB = 0x1000,
237 AllChannels = 0, ///< Pass through all channel information unmodified
238 FilterChannels, ///< Ignore events on certain channels
239 ForceChannel ///< Force all events to a certain channel
249 RoundDownMaybe = -2, ///< Round down only if necessary
250 RoundDownAlways = -1, ///< Always round down, even if on a division
251 RoundNearest = 0, ///< Round to nearest
252 RoundUpAlways = 1, ///< Always round up, even if on a division
253 RoundUpMaybe = 2 ///< Round up only if necessary
267 Timecode::Time timecode;
268 Timecode::BBT_Time bbt;
275 AnyTime() { type = Frames; frames = 0; }
277 bool operator== (AnyTime const & other) const {
278 if (type != other.type) { return false; }
282 return timecode == other.timecode;
284 return bbt == other.bbt;
286 return frames == other.frames;
288 return seconds == other.seconds;
290 return false; // get rid of warning
293 bool not_zero() const
297 return timecode.hours != 0 || timecode.minutes != 0 ||
298 timecode.seconds != 0 || timecode.frames != 0;
300 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
307 abort(); /* NOTREACHED */
312 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
313 but this has a uint32_t id which Evoral::Range<> does not.
320 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
322 framecnt_t length() const { return end - start + 1; }
324 bool operator== (const AudioRange& other) const {
325 return start == other.start && end == other.end && id == other.id;
328 bool equal (const AudioRange& other) const {
329 return start == other.start && end == other.end;
332 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
333 return Evoral::coverage (start, end, s, e);
338 Timecode::BBT_Time start;
339 Timecode::BBT_Time end;
342 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
343 : start (s), end (e), id (i) {}
345 bool operator== (const MusicRange& other) const {
346 return start == other.start && end == other.end && id == other.id;
349 bool equal (const MusicRange& other) const {
350 return start == other.start && end == other.end;
355 Slowest = 6.6dB/sec falloff at update rate of 40ms
356 Slow = 6.8dB/sec falloff at update rate of 40ms
361 MeterFalloffSlowest = 1,
362 MeterFalloffSlow = 2,
363 MeterFalloffSlowish = 3,
364 MeterFalloffModerate = 4,
365 MeterFalloffMedium = 5,
366 MeterFalloffFast = 6,
367 MeterFalloffFaster = 7,
368 MeterFalloffFastest = 8,
374 MeterHoldMedium = 100,
385 enum RegionSelectionAfterSplit {
387 NewlyCreatedLeft = 1, // bit 0
388 NewlyCreatedRight = 2, // bit 1
389 NewlyCreatedBoth = 3,
390 Existing = 4, // bit 2
391 ExistingNewlyCreatedLeft = 5,
392 ExistingNewlyCreatedRight = 6,
393 ExistingNewlyCreatedBoth = 7
408 HardwareMonitoring, ///< JACK does monitoring
409 SoftwareMonitoring, ///< Ardour does monitoring
410 ExternalMonitoring ///< we leave monitoring to the audio hardware
421 MonitoringSilence = 0x1,
422 MonitoringInput = 0x2,
423 MonitoringDisk = 0x4,
427 MeteringInput, ///< meter the input IO, regardless of what is going through the route
428 MeteringRoute ///< meter what is going through the route
431 enum VUMeterStandard {
432 MeteringVUfrench, // 0VU = -2dBu
433 MeteringVUamerican, // 0VU = 0dBu
434 MeteringVUstandard, // 0VU = +4dBu
435 MeteringVUeight // 0VU = +8dBu
446 /** PFL signals come from before pre-fader processors */
447 PFLFromBeforeProcessors,
448 /** PFL signals come pre-fader but after pre-fader processors */
449 PFLFromAfterProcessors
453 /** AFL signals come post-fader and before post-fader processors */
454 AFLFromBeforeProcessors,
455 /** AFL signals come post-fader but after post-fader processors */
456 AFLFromAfterProcessors
476 enum ListenPosition {
481 enum AutoConnectOption {
483 AutoConnectPhysical = 0x1,
484 AutoConnectMaster = 0x2
487 enum TracksAutoNamingRule {
488 UseDefaultNames = 0x1,
489 NameAfterDriver = 0x2
498 int format_data_width (ARDOUR::SampleFormat);
500 enum CDMarkerFormat {
520 typedef Sample PeakDatum;
533 /* These are "synonyms". It is important for JACK to be first
534 both here and in enums.cc, so that the string "JACK" is
535 correctly recognized in older session and preference files.
544 enum ShuttleBehaviour {
554 typedef std::vector<boost::shared_ptr<Source> > SourceList;
564 typedef std::list<framepos_t> AnalysisFeatureList;
566 typedef std::list<boost::shared_ptr<Route> > RouteList;
567 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
569 typedef std::list<boost::shared_ptr<VCA> > VCAList;
572 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
584 struct CleanupReport {
585 std::vector<std::string> paths;
589 enum PositionLockStyle {
594 /** A struct used to describe changes to processors in a route.
595 * This is useful because objects that respond to a change in processors
596 * can optimise what work they do based on details of what has changed.
598 struct RouteProcessorChange {
601 MeterPointChange = 0x1,
605 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
608 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
611 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
614 /** type of change; "GeneralChange" means anything could have changed */
616 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
617 bool meter_visibly_changed;
621 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
622 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
623 uint32_t master_out_channels; /* how many channels for the master bus */
624 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
625 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
636 enum TransportState {
637 /* these values happen to match the constants used by JACK but
638 this equality cannot be assumed.
640 TransportStopped = 0,
641 TransportRolling = 1,
642 TransportLooping = 2,
643 TransportStarting = 3,
647 /* these values happen to match the constants used by JACK but
648 this equality cannot be assumed.
657 struct LatencyRange {
658 uint32_t min; //< samples
659 uint32_t max; //< samples
662 enum BufferingPreset {
669 enum AutoReturnTarget {
671 RangeSelectionStart = 0x2,
673 RegionSelectionStart = 0x8,
676 enum PlaylistDisposition {
682 } // namespace ARDOUR
685 /* these cover types declared above in this header. See enums.cc
688 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
689 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
690 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
691 std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
692 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
693 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
694 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
695 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
696 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
697 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
698 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
699 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
700 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
701 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
702 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
703 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
704 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
705 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
706 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
707 std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
708 std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
709 std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
710 std::istream& operator>>(std::istream& o, ARDOUR::MeterType& sf);
712 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
713 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
714 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
715 std::ostream& operator<<(std::ostream& o, const ARDOUR::TracksAutoNamingRule& sf);
716 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
717 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
718 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
719 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
720 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
721 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
722 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
723 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
724 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
725 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
726 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
727 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
728 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
729 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
730 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
731 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
732 std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
733 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
734 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
736 /* because these operators work on types which can be used when making
737 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
739 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
740 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
741 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
742 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
744 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
745 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
746 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
747 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
750 static inline ARDOUR::framepos_t
751 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
753 long double result = (long double) session_frame * (long double) speed;
755 if (result >= (long double) ARDOUR::max_framepos) {
756 return ARDOUR::max_framepos;
757 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
758 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
764 static inline ARDOUR::framepos_t
765 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
767 /* NB - do we need a check for speed == 0 ??? */
768 long double result = (long double) track_frame / (long double) speed;
770 if (result >= (long double) ARDOUR::max_framepos) {
771 return ARDOUR::max_framepos;
772 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
773 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
779 /* for now, break the rules and use "using" to make this "global" */
781 using ARDOUR::framepos_t;
784 #endif /* __ardour_types_h__ */