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,
198 std::string auto_state_to_string (AutoState);
199 AutoState string_to_auto_state (std::string);
206 std::string auto_style_to_string (AutoStyle);
207 AutoStyle string_to_auto_style (std::string);
229 MeterMaxSignal = 0x0001,
230 MeterMaxPeak = 0x0002,
235 MeterIEC1DIN = 0x0040,
236 MeterIEC1NOR = 0x0080,
237 MeterIEC2BBC = 0x0100,
238 MeterIEC2EBU = 0x0200,
241 MeterPeak0dB = 0x1000,
257 AllChannels = 0, ///< Pass through all channel information unmodified
258 FilterChannels, ///< Ignore events on certain channels
259 ForceChannel ///< Force all events to a certain channel
269 RoundDownMaybe = -2, ///< Round down only if necessary
270 RoundDownAlways = -1, ///< Always round down, even if on a division
271 RoundNearest = 0, ///< Round to nearest
272 RoundUpAlways = 1, ///< Always round up, even if on a division
273 RoundUpMaybe = 2 ///< Round up only if necessary
287 Timecode::Time timecode;
288 Timecode::BBT_Time bbt;
295 AnyTime() { type = Frames; frames = 0; }
297 bool operator== (AnyTime const & other) const {
298 if (type != other.type) { return false; }
302 return timecode == other.timecode;
304 return bbt == other.bbt;
306 return frames == other.frames;
308 return seconds == other.seconds;
310 return false; // get rid of warning
313 bool not_zero() const
317 return timecode.hours != 0 || timecode.minutes != 0 ||
318 timecode.seconds != 0 || timecode.frames != 0;
320 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
327 abort(); /* NOTREACHED */
332 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
333 but this has a uint32_t id which Evoral::Range<> does not.
340 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
342 framecnt_t length() { return end - start + 1; }
344 bool operator== (const AudioRange& other) const {
345 return start == other.start && end == other.end && id == other.id;
348 bool equal (const AudioRange& other) const {
349 return start == other.start && end == other.end;
352 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
353 return Evoral::coverage (start, end, s, e);
358 Timecode::BBT_Time start;
359 Timecode::BBT_Time end;
362 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
363 : start (s), end (e), id (i) {}
365 bool operator== (const MusicRange& other) const {
366 return start == other.start && end == other.end && id == other.id;
369 bool equal (const MusicRange& other) const {
370 return start == other.start && end == other.end;
375 Slowest = 6.6dB/sec falloff at update rate of 40ms
376 Slow = 6.8dB/sec falloff at update rate of 40ms
381 MeterFalloffSlowest = 1,
382 MeterFalloffSlow = 2,
383 MeterFalloffSlowish = 3,
384 MeterFalloffModerate = 4,
385 MeterFalloffMedium = 5,
386 MeterFalloffFast = 6,
387 MeterFalloffFaster = 7,
388 MeterFalloffFastest = 8,
394 MeterHoldMedium = 100,
405 enum RegionSelectionAfterSplit {
407 NewlyCreatedLeft = 1, // bit 0
408 NewlyCreatedRight = 2, // bit 1
409 NewlyCreatedBoth = 3,
410 Existing = 4, // bit 2
411 ExistingNewlyCreatedLeft = 5,
412 ExistingNewlyCreatedRight = 6,
413 ExistingNewlyCreatedBoth = 7
428 HardwareMonitoring, ///< JACK does monitoring
429 SoftwareMonitoring, ///< Ardour does monitoring
430 ExternalMonitoring ///< we leave monitoring to the audio hardware
441 MonitoringSilence = 0x1,
442 MonitoringInput = 0x2,
443 MonitoringDisk = 0x4,
447 MeteringInput, ///< meter the input IO, regardless of what is going through the route
448 MeteringRoute ///< meter what is going through the route
451 enum VUMeterStandard {
452 MeteringVUfrench, // 0VU = -2dBu
453 MeteringVUamerican, // 0VU = 0dBu
454 MeteringVUstandard, // 0VU = +4dBu
455 MeteringVUeight // 0VU = +8dBu
466 /** PFL signals come from before pre-fader processors */
467 PFLFromBeforeProcessors,
468 /** PFL signals come pre-fader but after pre-fader processors */
469 PFLFromAfterProcessors
473 /** AFL signals come post-fader and before post-fader processors */
474 AFLFromBeforeProcessors,
475 /** AFL signals come post-fader but after post-fader processors */
476 AFLFromAfterProcessors
496 enum ListenPosition {
501 enum AutoConnectOption {
503 AutoConnectPhysical = 0x1,
504 AutoConnectMaster = 0x2
507 enum TracksAutoNamingRule {
508 UseDefaultNames = 0x1,
509 NameAfterDriver = 0x2
518 int format_data_width (ARDOUR::SampleFormat);
520 enum CDMarkerFormat {
540 typedef Sample PeakDatum;
553 /* These are "synonyms". It is important for JACK to be first
554 both here and in enums.cc, so that the string "JACK" is
555 correctly recognized in older session and preference files.
564 enum ShuttleBehaviour {
574 typedef std::vector<boost::shared_ptr<Source> > SourceList;
584 typedef std::list<framepos_t> AnalysisFeatureList;
586 typedef std::list<boost::shared_ptr<Route> > RouteList;
587 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
590 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
602 struct CleanupReport {
603 std::vector<std::string> paths;
607 enum PositionLockStyle {
612 /** A struct used to describe changes to processors in a route.
613 * This is useful because objects that respond to a change in processors
614 * can optimise what work they do based on details of what has changed.
616 struct RouteProcessorChange {
619 MeterPointChange = 0x1,
623 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
626 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
629 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
632 /** type of change; "GeneralChange" means anything could have changed */
634 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
635 bool meter_visibly_changed;
639 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
640 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
641 uint32_t master_out_channels; /* how many channels for the master bus */
642 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
643 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
654 enum TransportState {
655 /* these values happen to match the constants used by JACK but
656 this equality cannot be assumed.
658 TransportStopped = 0,
659 TransportRolling = 1,
660 TransportLooping = 2,
661 TransportStarting = 3,
665 /* these values happen to match the constants used by JACK but
666 this equality cannot be assumed.
675 struct LatencyRange {
676 uint32_t min; //< samples
677 uint32_t max; //< samples
680 enum BufferingPreset {
687 enum AutoReturnTarget {
689 RangeSelectionStart = 0x2,
691 RegionSelectionStart = 0x8,
694 enum PlaylistDisposition {
700 } // namespace ARDOUR
703 /* these cover types declared above in this header. See enums.cc
706 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
707 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
708 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
709 std::istream& operator>>(std::istream& o, ARDOUR::TracksAutoNamingRule& sf);
710 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
711 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
712 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
713 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
714 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
715 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
716 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
717 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
718 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
719 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
720 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
721 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
722 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
723 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
724 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
725 std::istream& operator>>(std::istream& o, ARDOUR::RegionSelectionAfterSplit& sf);
726 std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
727 std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
728 std::istream& operator>>(std::istream& o, ARDOUR::MeterType& sf);
730 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
731 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
732 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
733 std::ostream& operator<<(std::ostream& o, const ARDOUR::TracksAutoNamingRule& sf);
734 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
735 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
736 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
737 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
738 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
739 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
740 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
741 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
742 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
743 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
744 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
745 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
746 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
747 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
748 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
749 std::ostream& operator<<(std::ostream& o, const ARDOUR::RegionSelectionAfterSplit& sf);
750 std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
751 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
752 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterType& sf);
754 /* because these operators work on types which can be used when making
755 a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.
757 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
758 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
759 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
760 LIBARDOUR_API std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
762 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
763 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
764 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
765 LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
768 static inline ARDOUR::framepos_t
769 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
771 long double result = (long double) session_frame * (long double) speed;
773 if (result >= (long double) ARDOUR::max_framepos) {
774 return ARDOUR::max_framepos;
775 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
776 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
782 static inline ARDOUR::framepos_t
783 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
785 /* NB - do we need a check for speed == 0 ??? */
786 long double result = (long double) track_frame / (long double) speed;
788 if (result >= (long double) ARDOUR::max_framepos) {
789 return ARDOUR::max_framepos;
790 } else if (result <= (long double) (ARDOUR::max_framepos) * (ARDOUR::framepos_t)(-1)) {
791 return (ARDOUR::max_framepos * (ARDOUR::framepos_t)(-1));
797 /* for now, break the rules and use "using" to make this "global" */
799 using ARDOUR::framepos_t;
802 #endif /* __ardour_types_h__ */