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,
151 std::string auto_state_to_string (AutoState);
152 AutoState string_to_auto_state (std::string);
159 std::string auto_style_to_string (AutoStyle);
160 AutoStyle string_to_auto_style (std::string);
182 MeterMaxSignal = 0x001,
183 MeterMaxPeak = 0x002,
188 MeterIEC1DIN = 0x040,
189 MeterIEC1NOR = 0x080,
190 MeterIEC2BBC = 0x100,
191 MeterIEC2EBU = 0x200,
208 AllChannels = 0, ///< Pass through all channel information unmodified
209 FilterChannels, ///< Ignore events on certain channels
210 ForceChannel ///< Force all events to a certain channel
220 RoundDownAlways = -1, ///< Always round down, even if on a division
221 RoundNearest = 0, ///< Round to nearest
222 RoundUpAlways = 1 ///< Always round up, even if on a division
236 Timecode::Time timecode;
237 Timecode::BBT_Time bbt;
244 AnyTime() { type = Frames; frames = 0; }
246 bool operator== (AnyTime const & other) const {
247 if (type != other.type) { return false; }
251 return timecode == other.timecode;
253 return bbt == other.bbt;
255 return frames == other.frames;
257 return seconds == other.seconds;
259 return false; // get rid of warning
262 bool not_zero() const
266 return timecode.hours != 0 || timecode.minutes != 0 ||
267 timecode.seconds != 0 || timecode.frames != 0;
269 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
276 abort(); /* NOTREACHED */
281 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
282 but this has a uint32_t id which Evoral::Range<> does not.
289 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
291 framecnt_t length() { return end - start + 1; }
293 bool operator== (const AudioRange& other) const {
294 return start == other.start && end == other.end && id == other.id;
297 bool equal (const AudioRange& other) const {
298 return start == other.start && end == other.end;
301 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
302 return Evoral::coverage (start, end, s, e);
307 Timecode::BBT_Time start;
308 Timecode::BBT_Time end;
311 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
312 : start (s), end (e), id (i) {}
314 bool operator== (const MusicRange& other) const {
315 return start == other.start && end == other.end && id == other.id;
318 bool equal (const MusicRange& other) const {
319 return start == other.start && end == other.end;
324 Slowest = 6.6dB/sec falloff at update rate of 40ms
325 Slow = 6.8dB/sec falloff at update rate of 40ms
330 MeterFalloffSlowest = 1,
331 MeterFalloffSlow = 2,
332 MeterFalloffSlowish = 3,
333 MeterFalloffModerate = 4,
334 MeterFalloffMedium = 5,
335 MeterFalloffFast = 6,
336 MeterFalloffFaster = 7,
337 MeterFalloffFastest = 8,
343 MeterHoldMedium = 100,
366 HardwareMonitoring, ///< JACK does monitoring
367 SoftwareMonitoring, ///< Ardour does monitoring
368 ExternalMonitoring ///< we leave monitoring to the audio hardware
379 MonitoringSilence = 0x1,
380 MonitoringInput = 0x2,
381 MonitoringDisk = 0x4,
385 MeteringInput, ///< meter the input IO, regardless of what is going through the route
386 MeteringRoute ///< meter what is going through the route
389 enum VUMeterStandard {
390 MeteringVUfrench, // 0VU = -2dBu
391 MeteringVUamerican, // 0VU = 0dBu
392 MeteringVUstandard, // 0VU = +4dBu
393 MeteringVUeight // 0VU = +8dBu
404 /** PFL signals come from before pre-fader processors */
405 PFLFromBeforeProcessors,
406 /** PFL signals come pre-fader but after pre-fader processors */
407 PFLFromAfterProcessors
411 /** AFL signals come post-fader and before post-fader processors */
412 AFLFromBeforeProcessors,
413 /** AFL signals come post-fader but after post-fader processors */
414 AFLFromAfterProcessors
429 enum ListenPosition {
434 enum AutoConnectOption {
436 AutoConnectPhysical = 0x1,
437 AutoConnectMaster = 0x2
446 enum CDMarkerFormat {
463 typedef Sample PeakDatum;
476 /* These are "synonyms". It is important for JACK to be first
477 both here and in enums.cc, so that the string "JACK" is
478 correctly recognized in older session and preference files.
487 enum ShuttleBehaviour {
497 typedef std::vector<boost::shared_ptr<Source> > SourceList;
507 typedef std::list<framepos_t> AnalysisFeatureList;
509 typedef std::list<boost::shared_ptr<Route> > RouteList;
510 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
513 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
525 struct CleanupReport {
526 std::vector<std::string> paths;
530 enum PositionLockStyle {
535 /** A struct used to describe changes to processors in a route.
536 * This is useful because objects that respond to a change in processors
537 * can optimise what work they do based on details of what has changed.
539 struct RouteProcessorChange {
542 MeterPointChange = 0x1
545 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
548 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
551 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
554 /** type of change; "GeneralChange" means anything could have changed */
556 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
557 bool meter_visibly_changed;
561 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
562 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
563 uint32_t master_out_channels; /* how many channels for the master bus */
564 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
565 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
576 enum TransportState {
577 /* these values happen to match the constants used by JACK but
578 this equality cannot be assumed.
580 TransportStopped = 0,
581 TransportRolling = 1,
582 TransportLooping = 2,
583 TransportStarting = 3,
587 /* these values happen to match the constants used by JACK but
588 this equality cannot be assumed.
597 struct LatencyRange {
598 uint32_t min; //< samples
599 uint32_t max; //< samples
602 } // namespace ARDOUR
605 /* these cover types declared above in this header. See enums.cc
609 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
610 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
611 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
612 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
613 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
614 std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
615 std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
616 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
617 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
618 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
619 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
620 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
621 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
622 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
623 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
624 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
625 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
626 std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
627 std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
628 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
629 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
631 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
632 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
633 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
634 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
635 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
636 std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
637 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
638 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
639 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
640 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
641 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
642 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
643 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
644 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
645 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
646 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
647 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
648 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
649 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
650 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
651 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
653 static inline ARDOUR::framepos_t
654 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
656 return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed);
659 static inline ARDOUR::framepos_t
660 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
662 return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed);
665 /* for now, break the rules and use "using" to make this "global" */
667 using ARDOUR::framepos_t;
670 #endif /* __ardour_types_h__ */