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,
132 SoloIsolateAutomation,
136 MidiPgmChangeAutomation,
137 MidiPitchBenderAutomation,
138 MidiChannelPressureAutomation,
139 MidiSystemExclusiveAutomation,
146 MonitoringAutomation,
170 std::string auto_state_to_string (AutoState);
171 AutoState string_to_auto_state (std::string);
178 std::string auto_style_to_string (AutoStyle);
179 AutoStyle string_to_auto_style (std::string);
201 MeterMaxSignal = 0x0001,
202 MeterMaxPeak = 0x0002,
207 MeterIEC1DIN = 0x0040,
208 MeterIEC1NOR = 0x0080,
209 MeterIEC2BBC = 0x0100,
210 MeterIEC2EBU = 0x0200,
213 MeterPeak0dB = 0x1000,
229 AllChannels = 0, ///< Pass through all channel information unmodified
230 FilterChannels, ///< Ignore events on certain channels
231 ForceChannel ///< Force all events to a certain channel
241 RoundDownMaybe = -2, ///< Round down only if necessary
242 RoundDownAlways = -1, ///< Always round down, even if on a division
243 RoundNearest = 0, ///< Round to nearest
244 RoundUpAlways = 1, ///< Always round up, even if on a division
245 RoundUpMaybe = 2 ///< Round up only if necessary
259 Timecode::Time timecode;
260 Timecode::BBT_Time bbt;
267 AnyTime() { type = Frames; frames = 0; }
269 bool operator== (AnyTime const & other) const {
270 if (type != other.type) { return false; }
274 return timecode == other.timecode;
276 return bbt == other.bbt;
278 return frames == other.frames;
280 return seconds == other.seconds;
282 return false; // get rid of warning
285 bool not_zero() const
289 return timecode.hours != 0 || timecode.minutes != 0 ||
290 timecode.seconds != 0 || timecode.frames != 0;
292 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
299 abort(); /* NOTREACHED */
304 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
305 but this has a uint32_t id which Evoral::Range<> does not.
312 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
314 framecnt_t length() { return end - start + 1; }
316 bool operator== (const AudioRange& other) const {
317 return start == other.start && end == other.end && id == other.id;
320 bool equal (const AudioRange& other) const {
321 return start == other.start && end == other.end;
324 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
325 return Evoral::coverage (start, end, s, e);
330 Timecode::BBT_Time start;
331 Timecode::BBT_Time end;
334 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
335 : start (s), end (e), id (i) {}
337 bool operator== (const MusicRange& other) const {
338 return start == other.start && end == other.end && id == other.id;
341 bool equal (const MusicRange& other) const {
342 return start == other.start && end == other.end;
347 Slowest = 6.6dB/sec falloff at update rate of 40ms
348 Slow = 6.8dB/sec falloff at update rate of 40ms
353 MeterFalloffSlowest = 1,
354 MeterFalloffSlow = 2,
355 MeterFalloffSlowish = 3,
356 MeterFalloffModerate = 4,
357 MeterFalloffMedium = 5,
358 MeterFalloffFast = 6,
359 MeterFalloffFaster = 7,
360 MeterFalloffFastest = 8,
366 MeterHoldMedium = 100,
377 enum RegionSelectionAfterSplit {
379 NewlyCreatedLeft = 1, // bit 0
380 NewlyCreatedRight = 2, // bit 1
381 NewlyCreatedBoth = 3,
382 Existing = 4, // bit 2
383 ExistingNewlyCreatedLeft = 5,
384 ExistingNewlyCreatedRight = 6,
385 ExistingNewlyCreatedBoth = 7
400 HardwareMonitoring, ///< JACK does monitoring
401 SoftwareMonitoring, ///< Ardour does monitoring
402 ExternalMonitoring ///< we leave monitoring to the audio hardware
413 MonitoringSilence = 0x1,
414 MonitoringInput = 0x2,
415 MonitoringDisk = 0x4,
419 MeteringInput, ///< meter the input IO, regardless of what is going through the route
420 MeteringRoute ///< meter what is going through the route
423 enum VUMeterStandard {
424 MeteringVUfrench, // 0VU = -2dBu
425 MeteringVUamerican, // 0VU = 0dBu
426 MeteringVUstandard, // 0VU = +4dBu
427 MeteringVUeight // 0VU = +8dBu
438 /** PFL signals come from before pre-fader processors */
439 PFLFromBeforeProcessors,
440 /** PFL signals come pre-fader but after pre-fader processors */
441 PFLFromAfterProcessors
445 /** AFL signals come post-fader and before post-fader processors */
446 AFLFromBeforeProcessors,
447 /** AFL signals come post-fader but after post-fader processors */
448 AFLFromAfterProcessors
468 enum ListenPosition {
473 enum AutoConnectOption {
475 AutoConnectPhysical = 0x1,
476 AutoConnectMaster = 0x2
479 enum TracksAutoNamingRule {
480 UseDefaultNames = 0x1,
481 NameAfterDriver = 0x2
490 int format_data_width (ARDOUR::SampleFormat);
492 enum CDMarkerFormat {
512 typedef Sample PeakDatum;
525 /* These are "synonyms". It is important for JACK to be first
526 both here and in enums.cc, so that the string "JACK" is
527 correctly recognized in older session and preference files.
536 enum ShuttleBehaviour {
546 typedef std::vector<boost::shared_ptr<Source> > SourceList;
556 typedef std::list<framepos_t> AnalysisFeatureList;
558 typedef std::list<boost::shared_ptr<Route> > RouteList;
559 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
562 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
574 struct CleanupReport {
575 std::vector<std::string> paths;
579 enum PositionLockStyle {
584 /** A struct used to describe changes to processors in a route.
585 * This is useful because objects that respond to a change in processors
586 * can optimise what work they do based on details of what has changed.
588 struct RouteProcessorChange {
591 MeterPointChange = 0x1,
595 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
598 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
601 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
604 /** type of change; "GeneralChange" means anything could have changed */
606 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
607 bool meter_visibly_changed;
611 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
612 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
613 uint32_t master_out_channels; /* how many channels for the master bus */
614 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
615 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
626 enum TransportState {
627 /* these values happen to match the constants used by JACK but
628 this equality cannot be assumed.
630 TransportStopped = 0,
631 TransportRolling = 1,
632 TransportLooping = 2,
633 TransportStarting = 3,
637 /* these values happen to match the constants used by JACK but
638 this equality cannot be assumed.
647 struct LatencyRange {
648 uint32_t min; //< samples
649 uint32_t max; //< samples
652 enum BufferingPreset {
659 enum AutoReturnTarget {
661 RangeSelectionStart = 0x2,
663 RegionSelectionStart = 0x8,
666 enum PlaylistDisposition {
672 } // namespace ARDOUR
675 /* these cover types declared above in this header. See enums.cc
678 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
679 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
680 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
681 std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
682 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
683 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
684 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
685 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
686 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
687 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
688 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
689 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
690 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
691 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
692 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
693 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
694 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
695 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
696 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
697 std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
698 std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
699 std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
700 std::istream& operator>>(std::istream& o, ARDOUR::MeterType& sf);
702 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
703 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
704 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
705 std::ostream& operator<<(std::ostream& o, const ARDOUR::TracksAutoNamingRule& sf);
706 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
707 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
708 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
709 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
710 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
711 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
712 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
713 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
714 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
715 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
716 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
717 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
718 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
719 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
720 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
721 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
722 std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
723 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
724 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
726 /* because these operators work on types which can be used when making
727 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
729 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
730 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
731 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
732 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
734 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
735 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
736 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
737 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
740 static inline ARDOUR::framepos_t
741 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
743 long double result = (long double) session_frame * (long double) speed;
745 if (result >= (long double) ARDOUR::max_framepos) {
746 return ARDOUR::max_framepos;
747 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
748 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
754 static inline ARDOUR::framepos_t
755 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
757 /* NB - do we need a check for speed == 0 ??? */
758 long double result = (long double) track_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 /* for now, break the rules and use "using" to make this "global" */
771 using ARDOUR::framepos_t;
774 #endif /* __ardour_types_h__ */