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 = 0x001,
184 MeterMaxPeak = 0x002,
189 MeterIEC1DIN = 0x040,
190 MeterIEC1NOR = 0x080,
191 MeterIEC2BBC = 0x100,
192 MeterIEC2EBU = 0x200,
209 AllChannels = 0, ///< Pass through all channel information unmodified
210 FilterChannels, ///< Ignore events on certain channels
211 ForceChannel ///< Force all events to a certain channel
221 RoundDownMaybe = -2, ///< Round down only if necessary
222 RoundDownAlways = -1, ///< Always round down, even if on a division
223 RoundNearest = 0, ///< Round to nearest
224 RoundUpAlways = 1, ///< Always round up, even if on a division
225 RoundUpMaybe = 2 ///< Round up only if necessary
239 Timecode::Time timecode;
240 Timecode::BBT_Time bbt;
247 AnyTime() { type = Frames; frames = 0; }
249 bool operator== (AnyTime const & other) const {
250 if (type != other.type) { return false; }
254 return timecode == other.timecode;
256 return bbt == other.bbt;
258 return frames == other.frames;
260 return seconds == other.seconds;
262 return false; // get rid of warning
265 bool not_zero() const
269 return timecode.hours != 0 || timecode.minutes != 0 ||
270 timecode.seconds != 0 || timecode.frames != 0;
272 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
279 abort(); /* NOTREACHED */
284 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
285 but this has a uint32_t id which Evoral::Range<> does not.
292 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
294 framecnt_t length() { return end - start + 1; }
296 bool operator== (const AudioRange& other) const {
297 return start == other.start && end == other.end && id == other.id;
300 bool equal (const AudioRange& other) const {
301 return start == other.start && end == other.end;
304 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
305 return Evoral::coverage (start, end, s, e);
310 Timecode::BBT_Time start;
311 Timecode::BBT_Time end;
314 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
315 : start (s), end (e), id (i) {}
317 bool operator== (const MusicRange& other) const {
318 return start == other.start && end == other.end && id == other.id;
321 bool equal (const MusicRange& other) const {
322 return start == other.start && end == other.end;
327 Slowest = 6.6dB/sec falloff at update rate of 40ms
328 Slow = 6.8dB/sec falloff at update rate of 40ms
333 MeterFalloffSlowest = 1,
334 MeterFalloffSlow = 2,
335 MeterFalloffSlowish = 3,
336 MeterFalloffModerate = 4,
337 MeterFalloffMedium = 5,
338 MeterFalloffFast = 6,
339 MeterFalloffFaster = 7,
340 MeterFalloffFastest = 8,
346 MeterHoldMedium = 100,
357 enum RegionSelectionAfterSplit {
359 NewlyCreatedLeft = 1, // bit 0
360 NewlyCreatedRight = 2, // bit 1
361 NewlyCreatedBoth = 3,
362 Existing = 4, // bit 2
363 ExistingNewlyCreatedLeft = 5,
364 ExistingNewlyCreatedRight = 6,
365 ExistingNewlyCreatedBoth = 7
380 HardwareMonitoring, ///< JACK does monitoring
381 SoftwareMonitoring, ///< Ardour does monitoring
382 ExternalMonitoring ///< we leave monitoring to the audio hardware
393 MonitoringSilence = 0x1,
394 MonitoringInput = 0x2,
395 MonitoringDisk = 0x4,
399 MeteringInput, ///< meter the input IO, regardless of what is going through the route
400 MeteringRoute ///< meter what is going through the route
403 enum VUMeterStandard {
404 MeteringVUfrench, // 0VU = -2dBu
405 MeteringVUamerican, // 0VU = 0dBu
406 MeteringVUstandard, // 0VU = +4dBu
407 MeteringVUeight // 0VU = +8dBu
418 /** PFL signals come from before pre-fader processors */
419 PFLFromBeforeProcessors,
420 /** PFL signals come pre-fader but after pre-fader processors */
421 PFLFromAfterProcessors
425 /** AFL signals come post-fader and before post-fader processors */
426 AFLFromBeforeProcessors,
427 /** AFL signals come post-fader but after post-fader processors */
428 AFLFromAfterProcessors
443 enum ListenPosition {
448 enum AutoConnectOption {
450 AutoConnectPhysical = 0x1,
451 AutoConnectMaster = 0x2
460 int format_data_width (ARDOUR::SampleFormat);
462 enum CDMarkerFormat {
480 typedef Sample PeakDatum;
493 /* These are "synonyms". It is important for JACK to be first
494 both here and in enums.cc, so that the string "JACK" is
495 correctly recognized in older session and preference files.
504 enum ShuttleBehaviour {
514 typedef std::vector<boost::shared_ptr<Source> > SourceList;
524 typedef std::list<framepos_t> AnalysisFeatureList;
526 typedef std::list<boost::shared_ptr<Route> > RouteList;
527 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
530 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
542 struct CleanupReport {
543 std::vector<std::string> paths;
547 enum PositionLockStyle {
552 /** A struct used to describe changes to processors in a route.
553 * This is useful because objects that respond to a change in processors
554 * can optimise what work they do based on details of what has changed.
556 struct RouteProcessorChange {
559 MeterPointChange = 0x1
562 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
565 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
568 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
571 /** type of change; "GeneralChange" means anything could have changed */
573 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
574 bool meter_visibly_changed;
578 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
579 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
580 uint32_t master_out_channels; /* how many channels for the master bus */
581 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
582 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
593 enum TransportState {
594 /* these values happen to match the constants used by JACK but
595 this equality cannot be assumed.
597 TransportStopped = 0,
598 TransportRolling = 1,
599 TransportLooping = 2,
600 TransportStarting = 3,
604 /* these values happen to match the constants used by JACK but
605 this equality cannot be assumed.
614 struct LatencyRange {
615 uint32_t min; //< samples
616 uint32_t max; //< samples
619 } // namespace ARDOUR
622 /* these cover types declared above in this header. See enums.cc
625 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
626 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
627 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
628 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
629 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
630 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
631 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
632 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
633 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
634 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
635 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
636 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
637 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
638 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
639 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
640 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
641 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
642 std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
644 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
645 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
646 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
647 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
648 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
649 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
650 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
651 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
652 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
653 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
654 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
655 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
656 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
657 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
658 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
659 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
660 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
661 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
664 /* because these operators work on types which can be used when making
665 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
667 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
668 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
669 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
670 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
672 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
673 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
674 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
675 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
678 static inline ARDOUR::framepos_t
679 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
681 return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed);
684 static inline ARDOUR::framepos_t
685 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
687 return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed);
690 /* for now, break the rules and use "using" to make this "global" */
692 using ARDOUR::framepos_t;
695 #endif /* __ardour_types_h__ */