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
230 Timecode::Time timecode;
231 Timecode::BBT_Time bbt;
238 AnyTime() { type = Frames; frames = 0; }
240 bool operator== (AnyTime const & other) const {
241 if (type != other.type) { return false; }
245 return timecode == other.timecode;
247 return bbt == other.bbt;
249 return frames == other.frames;
251 return seconds == other.seconds;
253 return false; // get rid of warning
256 bool not_zero() const
260 return timecode.hours != 0 || timecode.minutes != 0 ||
261 timecode.seconds != 0 || timecode.frames != 0;
263 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
270 abort(); /* NOTREACHED */
275 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
276 but this has a uint32_t id which Evoral::Range<> does not.
283 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
285 framecnt_t length() { return end - start + 1; }
287 bool operator== (const AudioRange& other) const {
288 return start == other.start && end == other.end && id == other.id;
291 bool equal (const AudioRange& other) const {
292 return start == other.start && end == other.end;
295 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
296 return Evoral::coverage (start, end, s, e);
301 Timecode::BBT_Time start;
302 Timecode::BBT_Time end;
305 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
306 : start (s), end (e), id (i) {}
308 bool operator== (const MusicRange& other) const {
309 return start == other.start && end == other.end && id == other.id;
312 bool equal (const MusicRange& other) const {
313 return start == other.start && end == other.end;
318 Slowest = 6.6dB/sec falloff at update rate of 40ms
319 Slow = 6.8dB/sec falloff at update rate of 40ms
324 MeterFalloffSlowest = 1,
325 MeterFalloffSlow = 2,
326 MeterFalloffSlowish = 3,
327 MeterFalloffModerate = 4,
328 MeterFalloffMedium = 5,
329 MeterFalloffFast = 6,
330 MeterFalloffFaster = 7,
331 MeterFalloffFastest = 8,
337 MeterHoldMedium = 100,
360 HardwareMonitoring, ///< JACK does monitoring
361 SoftwareMonitoring, ///< Ardour does monitoring
362 ExternalMonitoring ///< we leave monitoring to the audio hardware
373 MonitoringSilence = 0x1,
374 MonitoringInput = 0x2,
375 MonitoringDisk = 0x4,
379 MeteringInput, ///< meter the input IO, regardless of what is going through the route
380 MeteringRoute ///< meter what is going through the route
383 enum VUMeterStandard {
384 MeteringVUfrench, // 0VU = -2dBu
385 MeteringVUamerican, // 0VU = 0dBu
386 MeteringVUstandard, // 0VU = +4dBu
387 MeteringVUeight // 0VU = +8dBu
398 /** PFL signals come from before pre-fader processors */
399 PFLFromBeforeProcessors,
400 /** PFL signals come pre-fader but after pre-fader processors */
401 PFLFromAfterProcessors
405 /** AFL signals come post-fader and before post-fader processors */
406 AFLFromBeforeProcessors,
407 /** AFL signals come post-fader but after post-fader processors */
408 AFLFromAfterProcessors
423 enum ListenPosition {
428 enum AutoConnectOption {
430 AutoConnectPhysical = 0x1,
431 AutoConnectMaster = 0x2
440 enum CDMarkerFormat {
457 typedef Sample PeakDatum;
470 /* These are "synonyms". It is important for JACK to be first
471 both here and in enums.cc, so that the string "JACK" is
472 correctly recognized in older session and preference files.
481 enum ShuttleBehaviour {
491 typedef std::vector<boost::shared_ptr<Source> > SourceList;
501 typedef std::list<framepos_t> AnalysisFeatureList;
503 typedef std::list<boost::shared_ptr<Route> > RouteList;
504 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
507 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
519 struct CleanupReport {
520 std::vector<std::string> paths;
524 enum PositionLockStyle {
529 /** A struct used to describe changes to processors in a route.
530 * This is useful because objects that respond to a change in processors
531 * can optimise what work they do based on details of what has changed.
533 struct RouteProcessorChange {
536 MeterPointChange = 0x1
539 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
542 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
545 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
548 /** type of change; "GeneralChange" means anything could have changed */
550 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
551 bool meter_visibly_changed;
555 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
556 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
557 uint32_t master_out_channels; /* how many channels for the master bus */
558 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
559 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
570 enum TransportState {
571 /* these values happen to match the constants used by JACK but
572 this equality cannot be assumed.
574 TransportStopped = 0,
575 TransportRolling = 1,
576 TransportLooping = 2,
577 TransportStarting = 3,
581 /* these values happen to match the constants used by JACK but
582 this equality cannot be assumed.
591 struct LatencyRange {
592 uint32_t min; //< samples
593 uint32_t max; //< samples
596 } // namespace ARDOUR
599 /* these cover types declared above in this header. See enums.cc
603 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
604 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
605 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
606 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
607 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
608 std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
609 std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
610 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
611 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
612 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
613 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
614 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
615 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
616 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
617 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
618 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
619 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
620 std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
621 std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
622 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
623 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
625 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
626 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
627 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
628 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
629 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
630 std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
631 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
632 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
633 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
634 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
635 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
636 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
637 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
638 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
639 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
640 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
641 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
642 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
643 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
644 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
645 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
647 static inline ARDOUR::framepos_t
648 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
650 return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed);
653 static inline ARDOUR::framepos_t
654 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
656 return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed);
659 /* for now, break the rules and use "using" to make this "global" */
661 using ARDOUR::framepos_t;
664 #endif /* __ardour_types_h__ */