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 MidiSystemExclusiveAutomation,
157 MonitoringAutomation,
181 std::string auto_state_to_string (AutoState);
182 AutoState string_to_auto_state (std::string);
189 std::string auto_style_to_string (AutoStyle);
190 AutoStyle string_to_auto_style (std::string);
212 MeterMaxSignal = 0x0001,
213 MeterMaxPeak = 0x0002,
218 MeterIEC1DIN = 0x0040,
219 MeterIEC1NOR = 0x0080,
220 MeterIEC2BBC = 0x0100,
221 MeterIEC2EBU = 0x0200,
224 MeterPeak0dB = 0x1000,
240 AllChannels = 0, ///< Pass through all channel information unmodified
241 FilterChannels, ///< Ignore events on certain channels
242 ForceChannel ///< Force all events to a certain channel
252 RoundDownMaybe = -2, ///< Round down only if necessary
253 RoundDownAlways = -1, ///< Always round down, even if on a division
254 RoundNearest = 0, ///< Round to nearest
255 RoundUpAlways = 1, ///< Always round up, even if on a division
256 RoundUpMaybe = 2 ///< Round up only if necessary
270 Timecode::Time timecode;
271 Timecode::BBT_Time bbt;
278 AnyTime() { type = Frames; frames = 0; }
280 bool operator== (AnyTime const & other) const {
281 if (type != other.type) { return false; }
285 return timecode == other.timecode;
287 return bbt == other.bbt;
289 return frames == other.frames;
291 return seconds == other.seconds;
293 return false; // get rid of warning
296 bool not_zero() const
300 return timecode.hours != 0 || timecode.minutes != 0 ||
301 timecode.seconds != 0 || timecode.frames != 0;
303 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
310 abort(); /* NOTREACHED */
315 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
316 but this has a uint32_t id which Evoral::Range<> does not.
323 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
325 framecnt_t length() const { return end - start + 1; }
327 bool operator== (const AudioRange& other) const {
328 return start == other.start && end == other.end && id == other.id;
331 bool equal (const AudioRange& other) const {
332 return start == other.start && end == other.end;
335 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
336 return Evoral::coverage (start, end, s, e);
341 Timecode::BBT_Time start;
342 Timecode::BBT_Time end;
345 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
346 : start (s), end (e), id (i) {}
348 bool operator== (const MusicRange& other) const {
349 return start == other.start && end == other.end && id == other.id;
352 bool equal (const MusicRange& other) const {
353 return start == other.start && end == other.end;
358 Slowest = 6.6dB/sec falloff at update rate of 40ms
359 Slow = 6.8dB/sec falloff at update rate of 40ms
364 MeterFalloffSlowest = 1,
365 MeterFalloffSlow = 2,
366 MeterFalloffSlowish = 3,
367 MeterFalloffModerate = 4,
368 MeterFalloffMedium = 5,
369 MeterFalloffFast = 6,
370 MeterFalloffFaster = 7,
371 MeterFalloffFastest = 8,
377 MeterHoldMedium = 100,
388 enum RegionSelectionAfterSplit {
390 NewlyCreatedLeft = 1, // bit 0
391 NewlyCreatedRight = 2, // bit 1
392 NewlyCreatedBoth = 3,
393 Existing = 4, // bit 2
394 ExistingNewlyCreatedLeft = 5,
395 ExistingNewlyCreatedRight = 6,
396 ExistingNewlyCreatedBoth = 7
411 HardwareMonitoring, ///< JACK does monitoring
412 SoftwareMonitoring, ///< Ardour does monitoring
413 ExternalMonitoring ///< we leave monitoring to the audio hardware
424 MonitoringSilence = 0x1,
425 MonitoringInput = 0x2,
426 MonitoringDisk = 0x4,
430 MeteringInput, ///< meter the input IO, regardless of what is going through the route
431 MeteringRoute ///< meter what is going through the route
434 enum VUMeterStandard {
435 MeteringVUfrench, // 0VU = -2dBu
436 MeteringVUamerican, // 0VU = 0dBu
437 MeteringVUstandard, // 0VU = +4dBu
438 MeteringVUeight // 0VU = +8dBu
449 /** PFL signals come from before pre-fader processors */
450 PFLFromBeforeProcessors,
451 /** PFL signals come pre-fader but after pre-fader processors */
452 PFLFromAfterProcessors
456 /** AFL signals come post-fader and before post-fader processors */
457 AFLFromBeforeProcessors,
458 /** AFL signals come post-fader but after post-fader processors */
459 AFLFromAfterProcessors
474 enum ListenPosition {
479 enum AutoConnectOption {
481 AutoConnectPhysical = 0x1,
482 AutoConnectMaster = 0x2
485 enum TracksAutoNamingRule {
486 UseDefaultNames = 0x1,
487 NameAfterDriver = 0x2
496 int format_data_width (ARDOUR::SampleFormat);
498 enum CDMarkerFormat {
518 typedef Sample PeakDatum;
531 /* These are "synonyms". It is important for JACK to be first
532 both here and in enums.cc, so that the string "JACK" is
533 correctly recognized in older session and preference files.
542 enum ShuttleBehaviour {
552 typedef std::vector<boost::shared_ptr<Source> > SourceList;
562 typedef std::list<framepos_t> AnalysisFeatureList;
564 typedef std::list<boost::shared_ptr<Route> > RouteList;
565 typedef std::list<boost::shared_ptr<Stripable> > StripableList;
566 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
567 typedef std::list<boost::weak_ptr <Stripable> > WeakStripableList;
568 typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
570 typedef std::list<boost::shared_ptr<VCA> > VCAList;
573 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
585 struct CleanupReport {
586 std::vector<std::string> paths;
590 enum PositionLockStyle {
595 /** A struct used to describe changes to processors in a route.
596 * This is useful because objects that respond to a change in processors
597 * can optimise what work they do based on details of what has changed.
599 struct RouteProcessorChange {
602 MeterPointChange = 0x1,
606 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
609 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
612 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
615 /** type of change; "GeneralChange" means anything could have changed */
617 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
618 bool meter_visibly_changed;
622 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
623 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
624 uint32_t master_out_channels; /* how many channels for the master bus */
625 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
626 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
637 enum TransportState {
638 /* these values happen to match the constants used by JACK but
639 this equality cannot be assumed.
641 TransportStopped = 0,
642 TransportRolling = 1,
643 TransportLooping = 2,
644 TransportStarting = 3,
648 /* these values happen to match the constants used by JACK but
649 this equality cannot be assumed.
658 struct LatencyRange {
659 uint32_t min; //< samples
660 uint32_t max; //< samples
663 enum BufferingPreset {
670 enum AutoReturnTarget {
672 RangeSelectionStart = 0x2,
674 RegionSelectionStart = 0x8,
677 enum PlaylistDisposition {
683 } // namespace ARDOUR
686 /* these cover types declared above in this header. See enums.cc
689 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
690 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
691 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
692 std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
693 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
694 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
695 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
696 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& 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::ListenPosition& sf);
721 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
722 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
723 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
724 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
725 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
726 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
727 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
728 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
729 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
730 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
731 std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
732 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
733 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
735 /* because these operators work on types which can be used when making
736 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
738 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
739 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
740 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
741 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
743 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
744 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
745 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
746 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
749 static inline ARDOUR::framepos_t
750 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
752 long double result = (long double) session_frame * (long double) speed;
754 if (result >= (long double) ARDOUR::max_framepos) {
755 return ARDOUR::max_framepos;
756 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
757 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
763 static inline ARDOUR::framepos_t
764 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
766 /* NB - do we need a check for speed == 0 ??? */
767 long double result = (long double) track_frame / (long double) speed;
769 if (result >= (long double) ARDOUR::max_framepos) {
770 return ARDOUR::max_framepos;
771 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
772 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
778 /* for now, break the rules and use "using" to make this "global" */
780 using ARDOUR::framepos_t;
783 #endif /* __ardour_types_h__ */