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"
58 typedef uint32_t layer_t;
59 typedef uint64_t microseconds_t;
60 typedef uint32_t pframes_t;
62 /* Any position measured in audio frames.
63 Assumed to be non-negative but not enforced.
65 typedef int64_t framepos_t;
67 /* Any distance from a given framepos_t.
68 Maybe positive or negative.
70 typedef int64_t frameoffset_t;
72 /* Any count of audio frames.
73 Assumed to be positive but not enforced.
75 typedef int64_t framecnt_t;
77 static const framepos_t max_framepos = INT64_MAX;
78 static const framecnt_t max_framecnt = INT64_MAX;
79 static const layer_t max_layer = UINT32_MAX;
81 // a set of (time) intervals: first of pair is the offset of the start within the region, second is the offset of the end
82 typedef std::list<std::pair<frameoffset_t, frameoffset_t> > AudioIntervalResult;
83 // associate a set of intervals with regions (e.g. for silence detection)
84 typedef std::map<boost::shared_ptr<ARDOUR::Region>,AudioIntervalResult> AudioIntervalMap;
86 typedef std::list<boost::shared_ptr<Region> > RegionList;
92 ConfigurationChanged = 0x1,
93 ConnectionsChanged = 0x2
96 IOChange () : type (NoChange) {}
97 IOChange (Type t) : type (t) {}
99 /** channel count of IO before a ConfigurationChanged, if appropriate */
100 ARDOUR::ChanCount before;
101 /** channel count of IO after a ConfigurationChanged, if appropriate */
102 ARDOUR::ChanCount after;
105 /* policies for inserting/pasting material where overlaps
109 enum InsertMergePolicy {
110 InsertMergeReject, // no overlaps allowed
111 InsertMergeRelax, // we just don't care about overlaps
112 InsertMergeReplace, // replace old with new
113 InsertMergeTruncateExisting, // shorten existing to avoid overlap
114 InsertMergeTruncateAddition, // shorten new to avoid overlap
115 InsertMergeExtend // extend new (or old) to the range of old+new
118 /** See evoral/Parameter.hpp
120 enum AutomationType {
123 PanAzimuthAutomation,
124 PanElevationAutomation,
126 PanFrontBackAutomation,
132 MidiPgmChangeAutomation,
133 MidiPitchBenderAutomation,
134 MidiChannelPressureAutomation,
135 MidiSystemExclusiveAutomation,
149 std::string auto_state_to_string (AutoState);
150 AutoState string_to_auto_state (std::string);
157 std::string auto_style_to_string (AutoStyle);
158 AutoStyle string_to_auto_style (std::string);
180 MeterMaxSignal = 0x001,
181 MeterMaxPeak = 0x002,
186 MeterIEC1DIN = 0x040,
187 MeterIEC1NOR = 0x080,
188 MeterIEC2BBC = 0x100,
189 MeterIEC2EBU = 0x200,
206 AllChannels = 0, ///< Pass through all channel information unmodified
207 FilterChannels, ///< Ignore events on certain channels
208 ForceChannel ///< Force all events to a certain channel
228 Timecode::Time timecode;
229 Timecode::BBT_Time bbt;
236 AnyTime() { type = Frames; frames = 0; }
238 bool operator== (AnyTime const & other) const {
239 if (type != other.type) { return false; }
243 return timecode == other.timecode;
245 return bbt == other.bbt;
247 return frames == other.frames;
249 return seconds == other.seconds;
251 return false; // get rid of warning
254 bool not_zero() const
258 return timecode.hours != 0 || timecode.minutes != 0 ||
259 timecode.seconds != 0 || timecode.frames != 0;
261 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
274 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
275 but this has a uint32_t id which Evoral::Range<> does not.
282 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
284 framecnt_t length() { return end - start + 1; }
286 bool operator== (const AudioRange& other) const {
287 return start == other.start && end == other.end && id == other.id;
290 bool equal (const AudioRange& other) const {
291 return start == other.start && end == other.end;
294 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
295 return Evoral::coverage (start, end, s, e);
300 Timecode::BBT_Time start;
301 Timecode::BBT_Time end;
304 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
305 : start (s), end (e), id (i) {}
307 bool operator== (const MusicRange& other) const {
308 return start == other.start && end == other.end && id == other.id;
311 bool equal (const MusicRange& other) const {
312 return start == other.start && end == other.end;
317 Slowest = 6.6dB/sec falloff at update rate of 40ms
318 Slow = 6.8dB/sec falloff at update rate of 40ms
323 MeterFalloffSlowest = 1,
324 MeterFalloffSlow = 2,
325 MeterFalloffSlowish = 3,
326 MeterFalloffModerate = 4,
327 MeterFalloffMedium = 5,
328 MeterFalloffFast = 6,
329 MeterFalloffFaster = 7,
330 MeterFalloffFastest = 8,
336 MeterHoldMedium = 100,
358 HardwareMonitoring, ///< JACK does monitoring
359 SoftwareMonitoring, ///< Ardour does monitoring
360 ExternalMonitoring ///< we leave monitoring to the audio hardware
371 MonitoringSilence = 0x1,
372 MonitoringInput = 0x2,
373 MonitoringDisk = 0x4,
377 MeteringInput, ///< meter the input IO, regardless of what is going through the route
378 MeteringRoute ///< meter what is going through the route
381 enum VUMeterStandard {
382 MeteringVUfrench, // 0VU = -2dBu
383 MeteringVUamerican, // 0VU = 0dBu
384 MeteringVUstandard, // 0VU = +4dBu
385 MeteringVUeight // 0VU = +8dBu
396 /** PFL signals come from before pre-fader processors */
397 PFLFromBeforeProcessors,
398 /** PFL signals come pre-fader but after pre-fader processors */
399 PFLFromAfterProcessors
403 /** AFL signals come post-fader and before post-fader processors */
404 AFLFromBeforeProcessors,
405 /** AFL signals come post-fader but after post-fader processors */
406 AFLFromAfterProcessors
421 enum CrossfadeModel {
426 enum CrossfadeChoice {
428 ConstantPowerMinus3dB,
429 ConstantPowerMinus6dB,
432 enum ListenPosition {
437 enum AutoConnectOption {
439 AutoConnectPhysical = 0x1,
440 AutoConnectMaster = 0x2
449 enum CDMarkerFormat {
466 typedef Sample PeakDatum;
487 /* These are "synonyms". It is important for JACK to be first
488 both here and in enums.cc, so that the string "JACK" is
489 correctly recognized in older session and preference files.
498 enum ShuttleBehaviour {
508 typedef std::vector<boost::shared_ptr<Source> > SourceList;
518 typedef std::list<framepos_t> AnalysisFeatureList;
520 typedef std::list<boost::shared_ptr<Route> > RouteList;
521 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
524 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
536 struct CleanupReport {
537 std::vector<std::string> paths;
541 enum PositionLockStyle {
546 /** A struct used to describe changes to processors in a route.
547 * This is useful because objects that respond to a change in processors
548 * can optimise what work they do based on details of what has changed.
550 struct RouteProcessorChange {
553 MeterPointChange = 0x1
556 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
559 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
562 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
565 /** type of change; "GeneralChange" means anything could have changed */
567 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
568 bool meter_visibly_changed;
572 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
573 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
574 uint32_t master_out_channels; /* how many channels for the master bus */
575 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
576 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
587 enum TransportState {
588 /* these values happen to match the constants used by JACK but
589 this equality cannot be assumed.
591 TransportStopped = 0,
592 TransportRolling = 1,
593 TransportLooping = 2,
594 TransportStarting = 3,
598 /* these values happen to match the constants used by JACK but
599 this equality cannot be assumed.
608 struct LatencyRange {
609 uint32_t min; //< samples
610 uint32_t max; //< samples
613 } // namespace ARDOUR
616 /* these cover types declared above in this header. See enums.cc
620 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
621 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
622 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
623 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
624 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
625 std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
626 std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
627 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
628 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
629 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
630 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
631 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
632 std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeModel& sf);
633 std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeChoice& sf);
634 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
635 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
636 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
637 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
638 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
639 std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
640 std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
641 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
643 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
644 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
645 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
646 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
647 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
648 std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
649 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
650 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
651 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
652 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
653 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
654 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
655 std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeModel& sf);
656 std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeChoice& sf);
657 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
658 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
659 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
660 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
661 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
662 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
663 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
664 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
666 static inline ARDOUR::framepos_t
667 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
669 return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed);
672 static inline ARDOUR::framepos_t
673 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
675 return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed);
678 /* for now, break the rules and use "using" to make this "global" */
680 using ARDOUR::framepos_t;
683 #endif /* __ardour_types_h__ */