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,
182 std::string auto_state_to_string (AutoState);
183 AutoState string_to_auto_state (std::string);
190 std::string auto_style_to_string (AutoStyle);
191 AutoStyle string_to_auto_style (std::string);
213 MeterMaxSignal = 0x0001,
214 MeterMaxPeak = 0x0002,
219 MeterIEC1DIN = 0x0040,
220 MeterIEC1NOR = 0x0080,
221 MeterIEC2BBC = 0x0100,
222 MeterIEC2EBU = 0x0200,
225 MeterPeak0dB = 0x1000,
241 AllChannels = 0, ///< Pass through all channel information unmodified
242 FilterChannels, ///< Ignore events on certain channels
243 ForceChannel ///< Force all events to a certain channel
253 RoundDownMaybe = -2, ///< Round down only if necessary
254 RoundDownAlways = -1, ///< Always round down, even if on a division
255 RoundNearest = 0, ///< Round to nearest
256 RoundUpAlways = 1, ///< Always round up, even if on a division
257 RoundUpMaybe = 2 ///< Round up only if necessary
271 Timecode::Time timecode;
272 Timecode::BBT_Time bbt;
279 AnyTime() { type = Frames; frames = 0; }
281 bool operator== (AnyTime const & other) const {
282 if (type != other.type) { return false; }
286 return timecode == other.timecode;
288 return bbt == other.bbt;
290 return frames == other.frames;
292 return seconds == other.seconds;
294 return false; // get rid of warning
297 bool not_zero() const
301 return timecode.hours != 0 || timecode.minutes != 0 ||
302 timecode.seconds != 0 || timecode.frames != 0;
304 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
311 abort(); /* NOTREACHED */
316 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
317 but this has a uint32_t id which Evoral::Range<> does not.
324 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
326 framecnt_t length() const { return end - start + 1; }
328 bool operator== (const AudioRange& other) const {
329 return start == other.start && end == other.end && id == other.id;
332 bool equal (const AudioRange& other) const {
333 return start == other.start && end == other.end;
336 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
337 return Evoral::coverage (start, end, s, e);
342 Timecode::BBT_Time start;
343 Timecode::BBT_Time end;
346 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
347 : start (s), end (e), id (i) {}
349 bool operator== (const MusicRange& other) const {
350 return start == other.start && end == other.end && id == other.id;
353 bool equal (const MusicRange& other) const {
354 return start == other.start && end == other.end;
359 Slowest = 6.6dB/sec falloff at update rate of 40ms
360 Slow = 6.8dB/sec falloff at update rate of 40ms
365 MeterFalloffSlowest = 1,
366 MeterFalloffSlow = 2,
367 MeterFalloffSlowish = 3,
368 MeterFalloffModerate = 4,
369 MeterFalloffMedium = 5,
370 MeterFalloffFast = 6,
371 MeterFalloffFaster = 7,
372 MeterFalloffFastest = 8,
378 MeterHoldMedium = 100,
389 enum RegionSelectionAfterSplit {
391 NewlyCreatedLeft = 1, // bit 0
392 NewlyCreatedRight = 2, // bit 1
393 NewlyCreatedBoth = 3,
394 Existing = 4, // bit 2
395 ExistingNewlyCreatedLeft = 5,
396 ExistingNewlyCreatedRight = 6,
397 ExistingNewlyCreatedBoth = 7
412 HardwareMonitoring, ///< JACK does monitoring
413 SoftwareMonitoring, ///< Ardour does monitoring
414 ExternalMonitoring ///< we leave monitoring to the audio hardware
425 MonitoringSilence = 0x1,
426 MonitoringInput = 0x2,
427 MonitoringDisk = 0x4,
431 MeteringInput, ///< meter the input IO, regardless of what is going through the route
432 MeteringRoute ///< meter what is going through the route
435 enum VUMeterStandard {
436 MeteringVUfrench, // 0VU = -2dBu
437 MeteringVUamerican, // 0VU = 0dBu
438 MeteringVUstandard, // 0VU = +4dBu
439 MeteringVUeight // 0VU = +8dBu
450 /** PFL signals come from before pre-fader processors */
451 PFLFromBeforeProcessors,
452 /** PFL signals come pre-fader but after pre-fader processors */
453 PFLFromAfterProcessors
457 /** AFL signals come post-fader and before post-fader processors */
458 AFLFromBeforeProcessors,
459 /** AFL signals come post-fader but after post-fader processors */
460 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::shared_ptr<Stripable> > StripableList;
567 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
568 typedef std::list<boost::weak_ptr <Stripable> > WeakStripableList;
569 typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
571 typedef std::list<boost::shared_ptr<VCA> > VCAList;
574 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
586 struct CleanupReport {
587 std::vector<std::string> paths;
591 enum PositionLockStyle {
596 /** A struct used to describe changes to processors in a route.
597 * This is useful because objects that respond to a change in processors
598 * can optimise what work they do based on details of what has changed.
600 struct RouteProcessorChange {
603 MeterPointChange = 0x1,
607 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
610 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
613 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
616 /** type of change; "GeneralChange" means anything could have changed */
618 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
619 bool meter_visibly_changed;
623 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
624 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
625 uint32_t master_out_channels; /* how many channels for the master bus */
626 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
627 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
638 enum TransportState {
639 /* these values happen to match the constants used by JACK but
640 this equality cannot be assumed.
642 TransportStopped = 0,
643 TransportRolling = 1,
644 TransportLooping = 2,
645 TransportStarting = 3,
649 /* these values happen to match the constants used by JACK but
650 this equality cannot be assumed.
658 /* non-JACK related flags */
661 ControlOnly = 0x80, /* MIDI, do not use as a source of music/performance data */
664 struct LatencyRange {
665 uint32_t min; //< samples
666 uint32_t max; //< samples
669 enum BufferingPreset {
676 enum AutoReturnTarget {
678 RangeSelectionStart = 0x2,
680 RegionSelectionStart = 0x8,
683 enum PlaylistDisposition {
689 } // namespace ARDOUR
692 /* these cover types declared above in this header. See enums.cc
695 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
696 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
697 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
698 std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
699 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
700 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
701 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
702 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
703 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
704 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
705 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
706 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
707 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
708 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
709 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
710 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
711 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
712 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
713 std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
714 std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
715 std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
716 std::istream& operator>>(std::istream& o, ARDOUR::MeterType& sf);
718 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
719 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
720 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
721 std::ostream& operator<<(std::ostream& o, const ARDOUR::TracksAutoNamingRule& sf);
722 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
723 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
724 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
725 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
726 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
727 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
728 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
729 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
730 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
731 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
732 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
733 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
734 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
735 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
736 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
737 std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
738 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
739 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
741 /* because these operators work on types which can be used when making
742 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
744 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
745 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
746 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
747 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
749 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
750 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
751 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
752 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
755 static inline ARDOUR::framepos_t
756 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
758 long double result = (long double) session_frame * (long double) speed;
760 if (result >= (long double) ARDOUR::max_framepos) {
761 return ARDOUR::max_framepos;
762 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
763 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
769 static inline ARDOUR::framepos_t
770 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
772 /* NB - do we need a check for speed == 0 ??? */
773 long double result = (long double) track_frame / (long double) speed;
775 if (result >= (long double) ARDOUR::max_framepos) {
776 return ARDOUR::max_framepos;
777 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
778 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
784 /* for now, break the rules and use "using" to make this "global" */
786 using ARDOUR::framepos_t;
789 #endif /* __ardour_types_h__ */