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 * When you add things here, you REALLY SHOULD add a case clause to
122 * the constructor of ParameterDescriptor, unless the Controllables
123 * that the enum refers to are completely standard (0-1.0 range, 0.0 as
124 * normal, non-toggled, non-enumerated). Anything else needs to be
125 * added there so that things that try to represent them can do so
126 * with as much information as possible.
128 enum AutomationType {
131 PanAzimuthAutomation,
132 PanElevationAutomation,
134 PanFrontBackAutomation,
137 PluginPropertyAutomation,
139 SoloIsolateAutomation,
143 MidiPgmChangeAutomation,
144 MidiPitchBenderAutomation,
145 MidiChannelPressureAutomation,
146 MidiSystemExclusiveAutomation,
153 MonitoringAutomation,
177 std::string auto_state_to_string (AutoState);
178 AutoState string_to_auto_state (std::string);
185 std::string auto_style_to_string (AutoStyle);
186 AutoStyle string_to_auto_style (std::string);
208 MeterMaxSignal = 0x0001,
209 MeterMaxPeak = 0x0002,
214 MeterIEC1DIN = 0x0040,
215 MeterIEC1NOR = 0x0080,
216 MeterIEC2BBC = 0x0100,
217 MeterIEC2EBU = 0x0200,
220 MeterPeak0dB = 0x1000,
236 AllChannels = 0, ///< Pass through all channel information unmodified
237 FilterChannels, ///< Ignore events on certain channels
238 ForceChannel ///< Force all events to a certain channel
248 RoundDownMaybe = -2, ///< Round down only if necessary
249 RoundDownAlways = -1, ///< Always round down, even if on a division
250 RoundNearest = 0, ///< Round to nearest
251 RoundUpAlways = 1, ///< Always round up, even if on a division
252 RoundUpMaybe = 2 ///< Round up only if necessary
266 Timecode::Time timecode;
267 Timecode::BBT_Time bbt;
274 AnyTime() { type = Frames; frames = 0; }
276 bool operator== (AnyTime const & other) const {
277 if (type != other.type) { return false; }
281 return timecode == other.timecode;
283 return bbt == other.bbt;
285 return frames == other.frames;
287 return seconds == other.seconds;
289 return false; // get rid of warning
292 bool not_zero() const
296 return timecode.hours != 0 || timecode.minutes != 0 ||
297 timecode.seconds != 0 || timecode.frames != 0;
299 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
306 abort(); /* NOTREACHED */
311 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
312 but this has a uint32_t id which Evoral::Range<> does not.
319 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
321 framecnt_t length() { return end - start + 1; }
323 bool operator== (const AudioRange& other) const {
324 return start == other.start && end == other.end && id == other.id;
327 bool equal (const AudioRange& other) const {
328 return start == other.start && end == other.end;
331 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
332 return Evoral::coverage (start, end, s, e);
337 Timecode::BBT_Time start;
338 Timecode::BBT_Time end;
341 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
342 : start (s), end (e), id (i) {}
344 bool operator== (const MusicRange& other) const {
345 return start == other.start && end == other.end && id == other.id;
348 bool equal (const MusicRange& other) const {
349 return start == other.start && end == other.end;
354 Slowest = 6.6dB/sec falloff at update rate of 40ms
355 Slow = 6.8dB/sec falloff at update rate of 40ms
360 MeterFalloffSlowest = 1,
361 MeterFalloffSlow = 2,
362 MeterFalloffSlowish = 3,
363 MeterFalloffModerate = 4,
364 MeterFalloffMedium = 5,
365 MeterFalloffFast = 6,
366 MeterFalloffFaster = 7,
367 MeterFalloffFastest = 8,
373 MeterHoldMedium = 100,
384 enum RegionSelectionAfterSplit {
386 NewlyCreatedLeft = 1, // bit 0
387 NewlyCreatedRight = 2, // bit 1
388 NewlyCreatedBoth = 3,
389 Existing = 4, // bit 2
390 ExistingNewlyCreatedLeft = 5,
391 ExistingNewlyCreatedRight = 6,
392 ExistingNewlyCreatedBoth = 7
407 HardwareMonitoring, ///< JACK does monitoring
408 SoftwareMonitoring, ///< Ardour does monitoring
409 ExternalMonitoring ///< we leave monitoring to the audio hardware
420 MonitoringSilence = 0x1,
421 MonitoringInput = 0x2,
422 MonitoringDisk = 0x4,
426 MeteringInput, ///< meter the input IO, regardless of what is going through the route
427 MeteringRoute ///< meter what is going through the route
430 enum VUMeterStandard {
431 MeteringVUfrench, // 0VU = -2dBu
432 MeteringVUamerican, // 0VU = 0dBu
433 MeteringVUstandard, // 0VU = +4dBu
434 MeteringVUeight // 0VU = +8dBu
445 /** PFL signals come from before pre-fader processors */
446 PFLFromBeforeProcessors,
447 /** PFL signals come pre-fader but after pre-fader processors */
448 PFLFromAfterProcessors
452 /** AFL signals come post-fader and before post-fader processors */
453 AFLFromBeforeProcessors,
454 /** AFL signals come post-fader but after post-fader processors */
455 AFLFromAfterProcessors
475 enum ListenPosition {
480 enum AutoConnectOption {
482 AutoConnectPhysical = 0x1,
483 AutoConnectMaster = 0x2
486 enum TracksAutoNamingRule {
487 UseDefaultNames = 0x1,
488 NameAfterDriver = 0x2
497 int format_data_width (ARDOUR::SampleFormat);
499 enum CDMarkerFormat {
519 typedef Sample PeakDatum;
532 /* These are "synonyms". It is important for JACK to be first
533 both here and in enums.cc, so that the string "JACK" is
534 correctly recognized in older session and preference files.
543 enum ShuttleBehaviour {
553 typedef std::vector<boost::shared_ptr<Source> > SourceList;
563 typedef std::list<framepos_t> AnalysisFeatureList;
565 typedef std::list<boost::shared_ptr<Route> > RouteList;
566 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
569 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
581 struct CleanupReport {
582 std::vector<std::string> paths;
586 enum PositionLockStyle {
591 /** A struct used to describe changes to processors in a route.
592 * This is useful because objects that respond to a change in processors
593 * can optimise what work they do based on details of what has changed.
595 struct RouteProcessorChange {
598 MeterPointChange = 0x1,
602 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
605 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
608 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
611 /** type of change; "GeneralChange" means anything could have changed */
613 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
614 bool meter_visibly_changed;
618 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
619 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
620 uint32_t master_out_channels; /* how many channels for the master bus */
621 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
622 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
633 enum TransportState {
634 /* these values happen to match the constants used by JACK but
635 this equality cannot be assumed.
637 TransportStopped = 0,
638 TransportRolling = 1,
639 TransportLooping = 2,
640 TransportStarting = 3,
644 /* these values happen to match the constants used by JACK but
645 this equality cannot be assumed.
654 struct LatencyRange {
655 uint32_t min; //< samples
656 uint32_t max; //< samples
659 enum BufferingPreset {
666 enum AutoReturnTarget {
668 RangeSelectionStart = 0x2,
670 RegionSelectionStart = 0x8,
673 enum PlaylistDisposition {
679 } // namespace ARDOUR
682 /* these cover types declared above in this header. See enums.cc
685 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
686 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
687 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
688 std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
689 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
690 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
691 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
692 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
693 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
694 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
695 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
696 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
697 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
698 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
699 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
700 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
701 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
702 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
703 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
704 std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
705 std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
706 std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
707 std::istream& operator>>(std::istream& o, ARDOUR::MeterType& sf);
709 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
710 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
711 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
712 std::ostream& operator<<(std::ostream& o, const ARDOUR::TracksAutoNamingRule& sf);
713 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
714 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
715 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
716 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
717 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
718 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
719 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
720 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
721 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
722 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
723 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
724 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
725 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
726 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
727 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
728 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
729 std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
730 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
731 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
733 /* because these operators work on types which can be used when making
734 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
736 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
737 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
738 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
739 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
741 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
742 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
743 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
744 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
747 static inline ARDOUR::framepos_t
748 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
750 long double result = (long double) session_frame * (long double) speed;
752 if (result >= (long double) ARDOUR::max_framepos) {
753 return ARDOUR::max_framepos;
754 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
755 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
761 static inline ARDOUR::framepos_t
762 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
764 /* NB - do we need a check for speed == 0 ??? */
765 long double result = (long double) track_frame / (long double) speed;
767 if (result >= (long double) ARDOUR::max_framepos) {
768 return ARDOUR::max_framepos;
769 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
770 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
776 /* for now, break the rules and use "using" to make this "global" */
778 using ARDOUR::framepos_t;
781 #endif /* __ardour_types_h__ */