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"
59 typedef uint32_t layer_t;
60 typedef uint64_t microseconds_t;
61 typedef uint32_t pframes_t;
63 /* Any position measured in audio frames.
64 Assumed to be non-negative but not enforced.
66 typedef int64_t framepos_t;
68 /* Any distance from a given framepos_t.
69 Maybe positive or negative.
71 typedef int64_t frameoffset_t;
73 /* Any count of audio frames.
74 Assumed to be positive but not enforced.
76 typedef int64_t framecnt_t;
78 static const framepos_t max_framepos = INT64_MAX;
79 static const framecnt_t max_framecnt = INT64_MAX;
80 static const layer_t max_layer = UINT32_MAX;
82 // a set of (time) intervals: first of pair is the offset of the start within the region, second is the offset of the end
83 typedef std::list<std::pair<frameoffset_t, frameoffset_t> > AudioIntervalResult;
84 // associate a set of intervals with regions (e.g. for silence detection)
85 typedef std::map<boost::shared_ptr<ARDOUR::Region>,AudioIntervalResult> AudioIntervalMap;
87 typedef std::list<boost::shared_ptr<Region> > RegionList;
93 ConfigurationChanged = 0x1,
94 ConnectionsChanged = 0x2
97 IOChange () : type (NoChange) {}
98 IOChange (Type t) : type (t) {}
100 /** channel count of IO before a ConfigurationChanged, if appropriate */
101 ARDOUR::ChanCount before;
102 /** channel count of IO after a ConfigurationChanged, if appropriate */
103 ARDOUR::ChanCount after;
106 /* policies for inserting/pasting material where overlaps
110 enum InsertMergePolicy {
111 InsertMergeReject, // no overlaps allowed
112 InsertMergeRelax, // we just don't care about overlaps
113 InsertMergeReplace, // replace old with new
114 InsertMergeTruncateExisting, // shorten existing to avoid overlap
115 InsertMergeTruncateAddition, // shorten new to avoid overlap
116 InsertMergeExtend // extend new (or old) to the range of old+new
119 /** See evoral/Parameter.hpp
121 enum AutomationType {
124 PanAzimuthAutomation,
125 PanElevationAutomation,
127 PanFrontBackAutomation,
130 PluginPropertyAutomation,
134 MidiPgmChangeAutomation,
135 MidiPitchBenderAutomation,
136 MidiChannelPressureAutomation,
137 MidiSystemExclusiveAutomation,
154 std::string auto_state_to_string (AutoState);
155 AutoState string_to_auto_state (std::string);
162 std::string auto_style_to_string (AutoStyle);
163 AutoStyle string_to_auto_style (std::string);
185 MeterMaxSignal = 0x0001,
186 MeterMaxPeak = 0x0002,
191 MeterIEC1DIN = 0x0040,
192 MeterIEC1NOR = 0x0080,
193 MeterIEC2BBC = 0x0100,
194 MeterIEC2EBU = 0x0200,
197 MeterPeak0dB = 0x1000,
213 AllChannels = 0, ///< Pass through all channel information unmodified
214 FilterChannels, ///< Ignore events on certain channels
215 ForceChannel ///< Force all events to a certain channel
225 RoundDownMaybe = -2, ///< Round down only if necessary
226 RoundDownAlways = -1, ///< Always round down, even if on a division
227 RoundNearest = 0, ///< Round to nearest
228 RoundUpAlways = 1, ///< Always round up, even if on a division
229 RoundUpMaybe = 2 ///< Round up only if necessary
243 Timecode::Time timecode;
244 Timecode::BBT_Time bbt;
251 AnyTime() { type = Frames; frames = 0; }
253 bool operator== (AnyTime const & other) const {
254 if (type != other.type) { return false; }
258 return timecode == other.timecode;
260 return bbt == other.bbt;
262 return frames == other.frames;
264 return seconds == other.seconds;
266 return false; // get rid of warning
269 bool not_zero() const
273 return timecode.hours != 0 || timecode.minutes != 0 ||
274 timecode.seconds != 0 || timecode.frames != 0;
276 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
283 abort(); /* NOTREACHED */
288 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
289 but this has a uint32_t id which Evoral::Range<> does not.
296 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
298 framecnt_t length() { return end - start + 1; }
300 bool operator== (const AudioRange& other) const {
301 return start == other.start && end == other.end && id == other.id;
304 bool equal (const AudioRange& other) const {
305 return start == other.start && end == other.end;
308 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
309 return Evoral::coverage (start, end, s, e);
314 Timecode::BBT_Time start;
315 Timecode::BBT_Time end;
318 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
319 : start (s), end (e), id (i) {}
321 bool operator== (const MusicRange& other) const {
322 return start == other.start && end == other.end && id == other.id;
325 bool equal (const MusicRange& other) const {
326 return start == other.start && end == other.end;
331 Slowest = 6.6dB/sec falloff at update rate of 40ms
332 Slow = 6.8dB/sec falloff at update rate of 40ms
337 MeterFalloffSlowest = 1,
338 MeterFalloffSlow = 2,
339 MeterFalloffSlowish = 3,
340 MeterFalloffModerate = 4,
341 MeterFalloffMedium = 5,
342 MeterFalloffFast = 6,
343 MeterFalloffFaster = 7,
344 MeterFalloffFastest = 8,
350 MeterHoldMedium = 100,
361 enum RegionSelectionAfterSplit {
363 NewlyCreatedLeft = 1, // bit 0
364 NewlyCreatedRight = 2, // bit 1
365 NewlyCreatedBoth = 3,
366 Existing = 4, // bit 2
367 ExistingNewlyCreatedLeft = 5,
368 ExistingNewlyCreatedRight = 6,
369 ExistingNewlyCreatedBoth = 7
384 HardwareMonitoring, ///< JACK does monitoring
385 SoftwareMonitoring, ///< Ardour does monitoring
386 ExternalMonitoring ///< we leave monitoring to the audio hardware
397 MonitoringSilence = 0x1,
398 MonitoringInput = 0x2,
399 MonitoringDisk = 0x4,
403 MeteringInput, ///< meter the input IO, regardless of what is going through the route
404 MeteringRoute ///< meter what is going through the route
407 enum VUMeterStandard {
408 MeteringVUfrench, // 0VU = -2dBu
409 MeteringVUamerican, // 0VU = 0dBu
410 MeteringVUstandard, // 0VU = +4dBu
411 MeteringVUeight // 0VU = +8dBu
422 /** PFL signals come from before pre-fader processors */
423 PFLFromBeforeProcessors,
424 /** PFL signals come pre-fader but after pre-fader processors */
425 PFLFromAfterProcessors
429 /** AFL signals come post-fader and before post-fader processors */
430 AFLFromBeforeProcessors,
431 /** AFL signals come post-fader but after post-fader processors */
432 AFLFromAfterProcessors
452 enum ListenPosition {
457 enum AutoConnectOption {
459 AutoConnectPhysical = 0x1,
460 AutoConnectMaster = 0x2
463 enum TracksAutoNamingRule {
464 UseDefaultNames = 0x1,
465 NameAfterDriver = 0x2
474 int format_data_width (ARDOUR::SampleFormat);
476 enum CDMarkerFormat {
496 typedef Sample PeakDatum;
509 /* These are "synonyms". It is important for JACK to be first
510 both here and in enums.cc, so that the string "JACK" is
511 correctly recognized in older session and preference files.
520 enum ShuttleBehaviour {
530 typedef std::vector<boost::shared_ptr<Source> > SourceList;
540 typedef std::list<framepos_t> AnalysisFeatureList;
542 typedef std::list<boost::shared_ptr<Route> > RouteList;
543 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
546 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
558 struct CleanupReport {
559 std::vector<std::string> paths;
563 enum PositionLockStyle {
568 /** A struct used to describe changes to processors in a route.
569 * This is useful because objects that respond to a change in processors
570 * can optimise what work they do based on details of what has changed.
572 struct RouteProcessorChange {
575 MeterPointChange = 0x1,
579 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
582 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
585 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
588 /** type of change; "GeneralChange" means anything could have changed */
590 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
591 bool meter_visibly_changed;
595 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
596 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
597 uint32_t master_out_channels; /* how many channels for the master bus */
598 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
599 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
610 enum TransportState {
611 /* these values happen to match the constants used by JACK but
612 this equality cannot be assumed.
614 TransportStopped = 0,
615 TransportRolling = 1,
616 TransportLooping = 2,
617 TransportStarting = 3,
621 /* these values happen to match the constants used by JACK but
622 this equality cannot be assumed.
631 struct LatencyRange {
632 uint32_t min; //< samples
633 uint32_t max; //< samples
636 enum BufferingPreset {
643 enum AutoReturnTarget {
645 RangeSelectionStart = 0x2,
647 RegionSelectionStart = 0x8,
650 } // namespace ARDOUR
653 /* these cover types declared above in this header. See enums.cc
656 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
657 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
658 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
659 std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
660 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
661 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
662 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
663 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
664 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
665 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
666 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
667 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
668 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
669 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
670 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
671 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
672 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
673 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
674 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
675 std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
676 std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
677 std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
678 std::istream& operator>>(std::istream& o, ARDOUR::MeterType& sf);
680 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
681 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
682 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
683 std::ostream& operator<<(std::ostream& o, const ARDOUR::TracksAutoNamingRule& sf);
684 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
685 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
686 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
687 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
688 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
689 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
690 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
691 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
692 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
693 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
694 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
695 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
696 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
697 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
698 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
699 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
700 std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
701 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
702 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
704 /* because these operators work on types which can be used when making
705 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
707 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
708 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
709 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
710 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
712 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
713 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
714 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
715 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
718 static inline ARDOUR::framepos_t
719 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
721 long double result = (long double) session_frame * (long double) speed;
723 if (result >= (long double) ARDOUR::max_framepos) {
724 return ARDOUR::max_framepos;
725 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
726 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
732 static inline ARDOUR::framepos_t
733 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
735 /* NB - do we need a check for speed == 0 ??? */
736 long double result = (long double) track_frame / (long double) speed;
738 if (result >= (long double) ARDOUR::max_framepos) {
739 return ARDOUR::max_framepos;
740 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
741 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
747 /* for now, break the rules and use "using" to make this "global" */
749 using ARDOUR::framepos_t;
752 #endif /* __ardour_types_h__ */