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,
205 AllChannels = 0, ///< Pass through all channel information unmodified
206 FilterChannels, ///< Ignore events on certain channels
207 ForceChannel ///< Force all events to a certain channel
227 Timecode::Time timecode;
228 Timecode::BBT_Time bbt;
235 AnyTime() { type = Frames; frames = 0; }
237 bool operator== (AnyTime const & other) const {
238 if (type != other.type) { return false; }
242 return timecode == other.timecode;
244 return bbt == other.bbt;
246 return frames == other.frames;
248 return seconds == other.seconds;
250 return false; // get rid of warning
253 bool not_zero() const
257 return timecode.hours != 0 || timecode.minutes != 0 ||
258 timecode.seconds != 0 || timecode.frames != 0;
260 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
273 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
274 but this has a uint32_t id which Evoral::Range<> does not.
281 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
283 framecnt_t length() { return end - start + 1; }
285 bool operator== (const AudioRange& other) const {
286 return start == other.start && end == other.end && id == other.id;
289 bool equal (const AudioRange& other) const {
290 return start == other.start && end == other.end;
293 Evoral::OverlapType coverage (framepos_t s, framepos_t e) const {
294 return Evoral::coverage (start, end, s, e);
299 Timecode::BBT_Time start;
300 Timecode::BBT_Time end;
303 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
304 : start (s), end (e), id (i) {}
306 bool operator== (const MusicRange& other) const {
307 return start == other.start && end == other.end && id == other.id;
310 bool equal (const MusicRange& other) const {
311 return start == other.start && end == other.end;
316 Slowest = 6.6dB/sec falloff at update rate of 40ms
317 Slow = 6.8dB/sec falloff at update rate of 40ms
322 MeterFalloffSlowest = 1,
323 MeterFalloffSlow = 2,
324 MeterFalloffSlowish = 3,
325 MeterFalloffModerate = 4,
326 MeterFalloffMedium = 5,
327 MeterFalloffFast = 6,
328 MeterFalloffFaster = 7,
329 MeterFalloffFastest = 8,
335 MeterHoldMedium = 100,
356 enum RouteSortOrderKey {
362 HardwareMonitoring, ///< JACK does monitoring
363 SoftwareMonitoring, ///< Ardour does monitoring
364 ExternalMonitoring ///< we leave monitoring to the audio hardware
375 MonitoringSilence = 0x1,
376 MonitoringInput = 0x2,
377 MonitoringDisk = 0x4,
381 MeteringInput, ///< meter the input IO, regardless of what is going through the route
382 MeteringRoute ///< meter what is going through the route
385 enum VUMeterStandard {
386 MeteringVUfrench, // 0VU = -2dBu
387 MeteringVUamerican, // 0VU = 0dBu
388 MeteringVUstandard, // 0VU = +4dBu
389 MeteringVUeight // 0VU = +8dBu
400 /** PFL signals come from before pre-fader processors */
401 PFLFromBeforeProcessors,
402 /** PFL signals come pre-fader but after pre-fader processors */
403 PFLFromAfterProcessors
407 /** AFL signals come post-fader and before post-fader processors */
408 AFLFromBeforeProcessors,
409 /** AFL signals come post-fader but after post-fader processors */
410 AFLFromAfterProcessors
426 enum CrossfadeModel {
431 enum CrossfadeChoice {
433 ConstantPowerMinus3dB,
434 ConstantPowerMinus6dB,
437 enum ListenPosition {
442 enum AutoConnectOption {
444 AutoConnectPhysical = 0x1,
445 AutoConnectMaster = 0x2
454 enum CDMarkerFormat {
471 typedef Sample PeakDatum;
492 /* These are "synonyms". It is important for JACK to be first
493 both here and in enums.cc, so that the string "JACK" is
494 correctly recognized in older session and preference files.
503 enum ShuttleBehaviour {
513 typedef std::vector<boost::shared_ptr<Source> > SourceList;
523 typedef std::list<framepos_t> AnalysisFeatureList;
525 typedef std::list<boost::shared_ptr<Route> > RouteList;
526 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
529 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
541 struct CleanupReport {
542 std::vector<std::string> paths;
546 enum PositionLockStyle {
551 /** A struct used to describe changes to processors in a route.
552 * This is useful because objects that respond to a change in processors
553 * can optimise what work they do based on details of what has changed.
555 struct RouteProcessorChange {
558 MeterPointChange = 0x1
561 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
564 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
567 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
570 /** type of change; "GeneralChange" means anything could have changed */
572 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
573 bool meter_visibly_changed;
577 AutoConnectOption input_ac; /* override the RC config for input auto-connection */
578 AutoConnectOption output_ac; /* override the RC config for output auto-connection */
579 uint32_t master_out_channels; /* how many channels for the master bus */
580 uint32_t requested_physical_in; /* now many of the available physical inputs to consider usable */
581 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
592 enum TransportState {
593 /* these values happen to match the constants used by JACK but
594 this equality cannot be assumed.
596 TransportStopped = 0,
597 TransportRolling = 1,
598 TransportLooping = 2,
599 TransportStarting = 3,
603 /* these values happen to match the constants used by JACK but
604 this equality cannot be assumed.
613 struct LatencyRange {
614 uint32_t min; //< samples
615 uint32_t max; //< samples
618 /* PLATFORM SPECIFIC #ifdef's here */
620 /** Define the native thread type used on the platform */
621 typedef pthread_t AudioBackendNativeThread;
622 static inline bool self_thread_equal (AudioBackendNativeThread thr) {
623 return pthread_equal (thr, pthread_self());
626 /* PLATFORM SPECIFIC #endif's here */
628 } // namespace ARDOUR
631 /* these cover types declared above in this header. See enums.cc
635 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
636 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
637 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
638 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
639 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
640 std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf);
641 std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf);
642 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
643 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
644 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
645 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
646 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
647 std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeModel& sf);
648 std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeChoice& sf);
649 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
650 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
651 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
652 std::istream& operator>>(std::istream& o, Timecode::TimecodeFormat& sf);
653 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
654 std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
655 std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
656 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
658 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
659 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
660 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
661 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
662 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
663 std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf);
664 std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf);
665 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
666 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
667 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
668 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
669 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
670 std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeModel& sf);
671 std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeChoice& sf);
672 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
673 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
674 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
675 std::ostream& operator<<(std::ostream& o, const Timecode::TimecodeFormat& sf);
676 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
677 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
678 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
679 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
681 static inline ARDOUR::framepos_t
682 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
684 return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed);
687 static inline ARDOUR::framepos_t
688 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
690 return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed);
693 /* for now, break the rules and use "using" to make this "global" */
695 using ARDOUR::framepos_t;
698 #endif /* __ardour_types_h__ */