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,
133 MidiPgmChangeAutomation,
134 MidiPitchBenderAutomation,
135 MidiChannelPressureAutomation,
136 MidiSystemExclusiveAutomation,
150 std::string auto_state_to_string (AutoState);
151 AutoState string_to_auto_state (std::string);
158 std::string auto_style_to_string (AutoStyle);
159 AutoStyle string_to_auto_style (std::string);
181 MeterMaxSignal = 0x001,
182 MeterMaxPeak = 0x002,
187 MeterIEC1DIN = 0x040,
188 MeterIEC1NOR = 0x080,
189 MeterIEC2BBC = 0x100,
190 MeterIEC2EBU = 0x200,
207 AllChannels = 0, ///< Pass through all channel information unmodified
208 FilterChannels, ///< Ignore events on certain channels
209 ForceChannel ///< Force all events to a certain channel
229 Timecode::Time timecode;
230 Timecode::BBT_Time bbt;
237 AnyTime() { type = Frames; frames = 0; }
239 bool operator== (AnyTime const & other) const {
240 if (type != other.type) { return false; }
244 return timecode == other.timecode;
246 return bbt == other.bbt;
248 return frames == other.frames;
250 return seconds == other.seconds;
252 return false; // get rid of warning
255 bool not_zero() const
259 return timecode.hours != 0 || timecode.minutes != 0 ||
260 timecode.seconds != 0 || timecode.frames != 0;
262 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
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 CrossfadeModel {
428 enum CrossfadeChoice {
430 ConstantPowerMinus3dB,
431 ConstantPowerMinus6dB,
434 enum ListenPosition {
439 enum AutoConnectOption {
441 AutoConnectPhysical = 0x1,
442 AutoConnectMaster = 0x2
451 enum CDMarkerFormat {
468 typedef Sample PeakDatum;
481 /* These are "synonyms". It is important for JACK to be first
482 both here and in enums.cc, so that the string "JACK" is
483 correctly recognized in older session and preference files.
492 enum ShuttleBehaviour {
502 typedef std::vector<boost::shared_ptr<Source> > SourceList;
512 typedef std::list<framepos_t> AnalysisFeatureList;
514 typedef std::list<boost::shared_ptr<Route> > RouteList;
515 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
518 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
530 struct CleanupReport {
531 std::vector<std::string> paths;
535 enum PositionLockStyle {
540 /** A struct used to describe changes to processors in a route.
541 * This is useful because objects that respond to a change in processors
542 * can optimise what work they do based on details of what has changed.
544 struct RouteProcessorChange {
547 MeterPointChange = 0x1
550 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
553 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
556 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
559 /** type of change; "GeneralChange" means anything could have changed */
561 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
562 bool meter_visibly_changed;
566 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
567 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
568 uint32_t master_out_channels; /* how many channels for the master bus */
569 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
570 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
581 enum TransportState {
582 /* these values happen to match the constants used by JACK but
583 this equality cannot be assumed.
585 TransportStopped = 0,
586 TransportRolling = 1,
587 TransportLooping = 2,
588 TransportStarting = 3,
592 /* these values happen to match the constants used by JACK but
593 this equality cannot be assumed.
602 struct LatencyRange {
603 uint32_t min; //< samples
604 uint32_t max; //< samples
607 } // namespace ARDOUR
610 /* these cover types declared above in this header. See enums.cc
614 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
615 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
616 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
617 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
618 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
619 std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
620 std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
621 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
622 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
623 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
624 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
625 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
626 std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeModel& sf);
627 std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeChoice& sf);
628 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
629 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
630 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
631 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
632 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
633 std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
634 std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
635 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
636 std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
638 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
639 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
640 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
641 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
642 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
643 std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
644 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
645 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
646 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
647 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
648 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
649 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
650 std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeModel& sf);
651 std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeChoice& sf);
652 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
653 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
654 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
655 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
656 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
657 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
658 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
659 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
660 std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
662 static inline ARDOUR::framepos_t
663 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
665 return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed);
668 static inline ARDOUR::framepos_t
669 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
671 return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed);
674 /* for now, break the rules and use "using" to make this "global" */
676 using ARDOUR::framepos_t;
679 #endif /* __ardour_types_h__ */