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,
152 std::string auto_state_to_string (AutoState);
153 AutoState string_to_auto_state (std::string);
160 std::string auto_style_to_string (AutoStyle);
161 AutoStyle string_to_auto_style (std::string);
183 MeterMaxSignal = 0x0001,
184 MeterMaxPeak = 0x0002,
189 MeterIEC1DIN = 0x0040,
190 MeterIEC1NOR = 0x0080,
191 MeterIEC2BBC = 0x0100,
192 MeterIEC2EBU = 0x0200,
195 MeterPeak0dB = 0x1000
210 AllChannels = 0, ///< Pass through all channel information unmodified
211 FilterChannels, ///< Ignore events on certain channels
212 ForceChannel ///< Force all events to a certain channel
222 RoundDownMaybe = -2, ///< Round down only if necessary
223 RoundDownAlways = -1, ///< Always round down, even if on a division
224 RoundNearest = 0, ///< Round to nearest
225 RoundUpAlways = 1, ///< Always round up, even if on a division
226 RoundUpMaybe = 2 ///< Round up only if necessary
240 Timecode::Time timecode;
241 Timecode::BBT_Time bbt;
248 AnyTime() { type = Frames; frames = 0; }
250 bool operator== (AnyTime const & other) const {
251 if (type != other.type) { return false; }
255 return timecode == other.timecode;
257 return bbt == other.bbt;
259 return frames == other.frames;
261 return seconds == other.seconds;
263 return false; // get rid of warning
266 bool not_zero() const
270 return timecode.hours != 0 || timecode.minutes != 0 ||
271 timecode.seconds != 0 || timecode.frames != 0;
273 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
280 abort(); /* NOTREACHED */
285 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
286 but this has a uint32_t id which Evoral::Range<> does not.
293 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
295 framecnt_t length() { return end - start + 1; }
297 bool operator== (const AudioRange& other) const {
298 return start == other.start && end == other.end && id == other.id;
301 bool equal (const AudioRange& other) const {
302 return start == other.start && end == other.end;
305 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
306 return Evoral::coverage (start, end, s, e);
311 Timecode::BBT_Time start;
312 Timecode::BBT_Time end;
315 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
316 : start (s), end (e), id (i) {}
318 bool operator== (const MusicRange& other) const {
319 return start == other.start && end == other.end && id == other.id;
322 bool equal (const MusicRange& other) const {
323 return start == other.start && end == other.end;
328 Slowest = 6.6dB/sec falloff at update rate of 40ms
329 Slow = 6.8dB/sec falloff at update rate of 40ms
334 MeterFalloffSlowest = 1,
335 MeterFalloffSlow = 2,
336 MeterFalloffSlowish = 3,
337 MeterFalloffModerate = 4,
338 MeterFalloffMedium = 5,
339 MeterFalloffFast = 6,
340 MeterFalloffFaster = 7,
341 MeterFalloffFastest = 8,
347 MeterHoldMedium = 100,
358 enum RegionSelectionAfterSplit {
360 NewlyCreatedLeft = 1, // bit 0
361 NewlyCreatedRight = 2, // bit 1
362 NewlyCreatedBoth = 3,
363 Existing = 4, // bit 2
364 ExistingNewlyCreatedLeft = 5,
365 ExistingNewlyCreatedRight = 6,
366 ExistingNewlyCreatedBoth = 7
381 HardwareMonitoring, ///< JACK does monitoring
382 SoftwareMonitoring, ///< Ardour does monitoring
383 ExternalMonitoring ///< we leave monitoring to the audio hardware
394 MonitoringSilence = 0x1,
395 MonitoringInput = 0x2,
396 MonitoringDisk = 0x4,
400 MeteringInput, ///< meter the input IO, regardless of what is going through the route
401 MeteringRoute ///< meter what is going through the route
404 enum VUMeterStandard {
405 MeteringVUfrench, // 0VU = -2dBu
406 MeteringVUamerican, // 0VU = 0dBu
407 MeteringVUstandard, // 0VU = +4dBu
408 MeteringVUeight // 0VU = +8dBu
419 /** PFL signals come from before pre-fader processors */
420 PFLFromBeforeProcessors,
421 /** PFL signals come pre-fader but after pre-fader processors */
422 PFLFromAfterProcessors
426 /** AFL signals come post-fader and before post-fader processors */
427 AFLFromBeforeProcessors,
428 /** AFL signals come post-fader but after post-fader processors */
429 AFLFromAfterProcessors
449 enum ListenPosition {
454 enum AutoConnectOption {
456 AutoConnectPhysical = 0x1,
457 AutoConnectMaster = 0x2
460 enum TracksAutoNamingRule {
461 UseDefaultNames = 0x1,
462 NameAfterDriver = 0x2
471 int format_data_width (ARDOUR::SampleFormat);
473 enum CDMarkerFormat {
491 typedef Sample PeakDatum;
504 /* These are "synonyms". It is important for JACK to be first
505 both here and in enums.cc, so that the string "JACK" is
506 correctly recognized in older session and preference files.
515 enum ShuttleBehaviour {
525 typedef std::vector<boost::shared_ptr<Source> > SourceList;
535 typedef std::list<framepos_t> AnalysisFeatureList;
537 typedef std::list<boost::shared_ptr<Route> > RouteList;
538 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
541 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
553 struct CleanupReport {
554 std::vector<std::string> paths;
558 enum PositionLockStyle {
563 /** A struct used to describe changes to processors in a route.
564 * This is useful because objects that respond to a change in processors
565 * can optimise what work they do based on details of what has changed.
567 struct RouteProcessorChange {
570 MeterPointChange = 0x1,
574 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
577 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
580 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
583 /** type of change; "GeneralChange" means anything could have changed */
585 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
586 bool meter_visibly_changed;
590 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
591 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
592 uint32_t master_out_channels; /* how many channels for the master bus */
593 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
594 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
605 enum TransportState {
606 /* these values happen to match the constants used by JACK but
607 this equality cannot be assumed.
609 TransportStopped = 0,
610 TransportRolling = 1,
611 TransportLooping = 2,
612 TransportStarting = 3,
616 /* these values happen to match the constants used by JACK but
617 this equality cannot be assumed.
626 struct LatencyRange {
627 uint32_t min; //< samples
628 uint32_t max; //< samples
631 enum BufferingPreset {
638 } // namespace ARDOUR
641 /* these cover types declared above in this header. See enums.cc
644 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
645 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
646 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
647 std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
648 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
649 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
650 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
651 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
652 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
653 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
654 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
655 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
656 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
657 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
658 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
659 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
660 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
661 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
662 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
663 std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
664 std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
666 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
667 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
668 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
669 std::ostream& operator<<(std::ostream& o, const ARDOUR::TracksAutoNamingRule& sf);
670 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
671 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
672 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
673 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
674 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
675 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
676 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
677 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
678 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
679 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
680 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
681 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
682 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
683 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
684 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
685 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
686 std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
689 /* because these operators work on types which can be used when making
690 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
692 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
693 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
694 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
695 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
697 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
698 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
699 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
700 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
703 static inline ARDOUR::framepos_t
704 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
706 return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed);
709 static inline ARDOUR::framepos_t
710 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
712 return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed);
715 /* for now, break the rules and use "using" to make this "global" */
717 using ARDOUR::framepos_t;
720 #endif /* __ardour_types_h__ */