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,
166 std::string auto_state_to_string (AutoState);
167 AutoState string_to_auto_state (std::string);
174 std::string auto_style_to_string (AutoStyle);
175 AutoStyle string_to_auto_style (std::string);
197 MeterMaxSignal = 0x0001,
198 MeterMaxPeak = 0x0002,
203 MeterIEC1DIN = 0x0040,
204 MeterIEC1NOR = 0x0080,
205 MeterIEC2BBC = 0x0100,
206 MeterIEC2EBU = 0x0200,
209 MeterPeak0dB = 0x1000,
225 AllChannels = 0, ///< Pass through all channel information unmodified
226 FilterChannels, ///< Ignore events on certain channels
227 ForceChannel ///< Force all events to a certain channel
237 RoundDownMaybe = -2, ///< Round down only if necessary
238 RoundDownAlways = -1, ///< Always round down, even if on a division
239 RoundNearest = 0, ///< Round to nearest
240 RoundUpAlways = 1, ///< Always round up, even if on a division
241 RoundUpMaybe = 2 ///< Round up only if necessary
255 Timecode::Time timecode;
256 Timecode::BBT_Time bbt;
263 AnyTime() { type = Frames; frames = 0; }
265 bool operator== (AnyTime const & other) const {
266 if (type != other.type) { return false; }
270 return timecode == other.timecode;
272 return bbt == other.bbt;
274 return frames == other.frames;
276 return seconds == other.seconds;
278 return false; // get rid of warning
281 bool not_zero() const
285 return timecode.hours != 0 || timecode.minutes != 0 ||
286 timecode.seconds != 0 || timecode.frames != 0;
288 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
295 abort(); /* NOTREACHED */
300 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
301 but this has a uint32_t id which Evoral::Range<> does not.
308 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
310 framecnt_t length() { return end - start + 1; }
312 bool operator== (const AudioRange& other) const {
313 return start == other.start && end == other.end && id == other.id;
316 bool equal (const AudioRange& other) const {
317 return start == other.start && end == other.end;
320 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
321 return Evoral::coverage (start, end, s, e);
326 Timecode::BBT_Time start;
327 Timecode::BBT_Time end;
330 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
331 : start (s), end (e), id (i) {}
333 bool operator== (const MusicRange& other) const {
334 return start == other.start && end == other.end && id == other.id;
337 bool equal (const MusicRange& other) const {
338 return start == other.start && end == other.end;
343 Slowest = 6.6dB/sec falloff at update rate of 40ms
344 Slow = 6.8dB/sec falloff at update rate of 40ms
349 MeterFalloffSlowest = 1,
350 MeterFalloffSlow = 2,
351 MeterFalloffSlowish = 3,
352 MeterFalloffModerate = 4,
353 MeterFalloffMedium = 5,
354 MeterFalloffFast = 6,
355 MeterFalloffFaster = 7,
356 MeterFalloffFastest = 8,
362 MeterHoldMedium = 100,
373 enum RegionSelectionAfterSplit {
375 NewlyCreatedLeft = 1, // bit 0
376 NewlyCreatedRight = 2, // bit 1
377 NewlyCreatedBoth = 3,
378 Existing = 4, // bit 2
379 ExistingNewlyCreatedLeft = 5,
380 ExistingNewlyCreatedRight = 6,
381 ExistingNewlyCreatedBoth = 7
396 HardwareMonitoring, ///< JACK does monitoring
397 SoftwareMonitoring, ///< Ardour does monitoring
398 ExternalMonitoring ///< we leave monitoring to the audio hardware
409 MonitoringSilence = 0x1,
410 MonitoringInput = 0x2,
411 MonitoringDisk = 0x4,
415 MeteringInput, ///< meter the input IO, regardless of what is going through the route
416 MeteringRoute ///< meter what is going through the route
419 enum VUMeterStandard {
420 MeteringVUfrench, // 0VU = -2dBu
421 MeteringVUamerican, // 0VU = 0dBu
422 MeteringVUstandard, // 0VU = +4dBu
423 MeteringVUeight // 0VU = +8dBu
434 /** PFL signals come from before pre-fader processors */
435 PFLFromBeforeProcessors,
436 /** PFL signals come pre-fader but after pre-fader processors */
437 PFLFromAfterProcessors
441 /** AFL signals come post-fader and before post-fader processors */
442 AFLFromBeforeProcessors,
443 /** AFL signals come post-fader but after post-fader processors */
444 AFLFromAfterProcessors
464 enum ListenPosition {
469 enum AutoConnectOption {
471 AutoConnectPhysical = 0x1,
472 AutoConnectMaster = 0x2
475 enum TracksAutoNamingRule {
476 UseDefaultNames = 0x1,
477 NameAfterDriver = 0x2
486 int format_data_width (ARDOUR::SampleFormat);
488 enum CDMarkerFormat {
508 typedef Sample PeakDatum;
521 /* These are "synonyms". It is important for JACK to be first
522 both here and in enums.cc, so that the string "JACK" is
523 correctly recognized in older session and preference files.
532 enum ShuttleBehaviour {
542 typedef std::vector<boost::shared_ptr<Source> > SourceList;
552 typedef std::list<framepos_t> AnalysisFeatureList;
554 typedef std::list<boost::shared_ptr<Route> > RouteList;
555 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
558 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
570 struct CleanupReport {
571 std::vector<std::string> paths;
575 enum PositionLockStyle {
580 /** A struct used to describe changes to processors in a route.
581 * This is useful because objects that respond to a change in processors
582 * can optimise what work they do based on details of what has changed.
584 struct RouteProcessorChange {
587 MeterPointChange = 0x1,
591 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
594 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
597 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
600 /** type of change; "GeneralChange" means anything could have changed */
602 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
603 bool meter_visibly_changed;
607 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
608 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
609 uint32_t master_out_channels; /* how many channels for the master bus */
610 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
611 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
622 enum TransportState {
623 /* these values happen to match the constants used by JACK but
624 this equality cannot be assumed.
626 TransportStopped = 0,
627 TransportRolling = 1,
628 TransportLooping = 2,
629 TransportStarting = 3,
633 /* these values happen to match the constants used by JACK but
634 this equality cannot be assumed.
643 struct LatencyRange {
644 uint32_t min; //< samples
645 uint32_t max; //< samples
648 enum BufferingPreset {
655 enum AutoReturnTarget {
657 RangeSelectionStart = 0x2,
659 RegionSelectionStart = 0x8,
662 enum PlaylistDisposition {
668 } // namespace ARDOUR
671 /* these cover types declared above in this header. See enums.cc
674 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
675 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
676 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
677 std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
678 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
679 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
680 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
681 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
682 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
683 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
684 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
685 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
686 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
687 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
688 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
689 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
690 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
691 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
692 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
693 std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
694 std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
695 std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
696 std::istream& operator>>(std::istream& o, ARDOUR::MeterType& sf);
698 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
699 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
700 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
701 std::ostream& operator<<(std::ostream& o, const ARDOUR::TracksAutoNamingRule& sf);
702 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
703 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
704 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
705 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
706 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
707 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
708 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
709 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
710 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
711 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
712 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
713 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
714 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
715 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
716 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
717 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
718 std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
719 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
720 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
722 /* because these operators work on types which can be used when making
723 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
725 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
726 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
727 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
728 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
730 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
731 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
732 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
733 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
736 static inline ARDOUR::framepos_t
737 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
739 long double result = (long double) session_frame * (long double) speed;
741 if (result >= (long double) ARDOUR::max_framepos) {
742 return ARDOUR::max_framepos;
743 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
744 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
750 static inline ARDOUR::framepos_t
751 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
753 /* NB - do we need a check for speed == 0 ??? */
754 long double result = (long double) track_frame / (long double) speed;
756 if (result >= (long double) ARDOUR::max_framepos) {
757 return ARDOUR::max_framepos;
758 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
759 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
765 /* for now, break the rules and use "using" to make this "global" */
767 using ARDOUR::framepos_t;
770 #endif /* __ardour_types_h__ */