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__
27 #include <boost/shared_ptr.hpp>
28 #include <sys/types.h>
34 #include "temporal/bbt_time.h"
35 #include "temporal/time.h"
36 #include "temporal/types.h"
40 #include "evoral/Range.hpp"
42 #include "ardour/chan_count.h"
43 #include "ardour/plugin_types.h"
47 using Temporal::max_samplepos;
48 using Temporal::max_samplecnt;
62 class AutomationControl;
63 class SlavableAutomationControl;
68 typedef uint32_t layer_t;
69 typedef uint64_t microseconds_t;
70 typedef uint32_t pframes_t;
72 /* rebind Temporal position types into ARDOUR namespace */
73 typedef Temporal::samplecnt_t samplecnt_t;
74 typedef Temporal::samplepos_t samplepos_t;
75 typedef Temporal::sampleoffset_t sampleoffset_t;
77 static const layer_t max_layer = UINT32_MAX;
79 // a set of (time) intervals: first of pair is the offset of the start within the region, second is the offset of the end
80 typedef std::list<std::pair<sampleoffset_t, sampleoffset_t> > AudioIntervalResult;
81 // associate a set of intervals with regions (e.g. for silence detection)
82 typedef std::map<boost::shared_ptr<ARDOUR::Region>,AudioIntervalResult> AudioIntervalMap;
84 typedef std::list<boost::shared_ptr<Region> > RegionList;
90 ConfigurationChanged = 0x1,
91 ConnectionsChanged = 0x2
94 IOChange () : type (NoChange) {}
95 IOChange (Type t) : type (t) {}
97 /** channel count of IO before a ConfigurationChanged, if appropriate */
98 ARDOUR::ChanCount before;
99 /** channel count of IO after a ConfigurationChanged, if appropriate */
100 ARDOUR::ChanCount after;
103 /* policies for inserting/pasting material where overlaps
107 enum InsertMergePolicy {
108 InsertMergeReject, ///< no overlaps allowed
109 InsertMergeRelax, ///< we just don't care about overlaps
110 InsertMergeReplace, ///< replace old with new
111 InsertMergeTruncateExisting, ///< shorten existing to avoid overlap
112 InsertMergeTruncateAddition, ///< shorten new to avoid overlap
113 InsertMergeExtend ///< extend new (or old) to the range of old+new
116 /** See evoral/Parameter.hpp
118 * When you add things here, you REALLY SHOULD add a case clause to
119 * the constructor of ParameterDescriptor, unless the Controllables
120 * that the enum refers to are completely standard (0-1.0 range, 0.0 as
121 * normal, non-toggled, non-enumerated). Anything else needs to be
122 * added there so that things that try to represent them can do so
123 * with as much information as possible.
125 enum AutomationType {
128 PanAzimuthAutomation,
129 PanElevationAutomation,
131 PanFrontBackAutomation,
134 PluginPropertyAutomation,
136 SoloIsolateAutomation,
140 MidiPgmChangeAutomation,
141 MidiPitchBenderAutomation,
142 MidiChannelPressureAutomation,
143 MidiNotePressureAutomation,
144 MidiSystemExclusiveAutomation,
152 MonitoringAutomation,
156 /* used only by Controllable Descriptor to access send parameters */
159 SendEnableAutomation,
160 SendAzimuthAutomation,
171 std::string auto_state_to_string (AutoState);
172 AutoState string_to_auto_state (std::string);
194 DiskIOPreFader, /* after the trim control, but before other processors */
195 DiskIOPostFader, /* before the main outs, after other processors */
196 DiskIOCustom, /* up to the user. Caveat Emptor! */
200 MeterMaxSignal = 0x0001,
201 MeterMaxPeak = 0x0002,
206 MeterIEC1DIN = 0x0040,
207 MeterIEC1NOR = 0x0080,
208 MeterIEC2BBC = 0x0100,
209 MeterIEC2EBU = 0x0200,
212 MeterPeak0dB = 0x1000,
228 AllChannels = 0, ///< Pass through all channel information unmodified
229 FilterChannels, ///< Ignore events on certain channels
230 ForceChannel ///< Force all events to a certain channel
240 RoundDownMaybe = -2, ///< Round down only if necessary
241 RoundDownAlways = -1, ///< Always round down, even if on a division
242 RoundNearest = 0, ///< Round to nearest
243 RoundUpAlways = 1, ///< Always round up, even if on a division
244 RoundUpMaybe = 2 ///< Round up only if necessary
248 SnapToAny = 0, ///< Snaps to the closest of ( snap prefs, grid quantization )
249 SnapToGrid = 1, ///< Prefer snapping to the closest grid quantization, if a Grid selection is enabled
263 Timecode::Time timecode;
264 Timecode::BBT_Time bbt;
271 AnyTime() { type = Samples; samples = 0; }
273 bool operator== (AnyTime const & other) const {
274 if (type != other.type) { return false; }
278 return timecode == other.timecode;
280 return bbt == other.bbt;
282 return samples == other.samples;
284 return seconds == other.seconds;
286 return false; // get rid of warning
289 bool not_zero() const
293 return timecode.hours != 0 || timecode.minutes != 0 ||
294 timecode.seconds != 0 || timecode.frames != 0;
296 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
303 abort(); /* NOTREACHED */
308 /* used for translating audio samples to an exact musical position using a note divisor.
309 an exact musical position almost never falls exactly on an audio sample, but for sub-sample
310 musical accuracy we need to derive exact musical locations from a sample position
311 the division follows TempoMap::exact_beat_at_sample().
313 -1 musical location is the bar closest to sample
314 0 musical location is the musical position of the sample
315 1 musical location is the BBT beat closest to sample
316 n musical location is the quarter-note division n closest to sample
322 MusicSample (samplepos_t f, int32_t d) : sample (f), division (d) {}
324 void set (samplepos_t f, int32_t d) {sample = f; division = d; }
326 MusicSample operator- (MusicSample other) { return MusicSample (sample - other.sample, 0); }
329 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
330 but this has a uint32_t id which Evoral::Range<> does not.
337 AudioRange (samplepos_t s, samplepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
339 samplecnt_t length() const { return end - start + 1; }
341 bool operator== (const AudioRange& other) const {
342 return start == other.start && end == other.end && id == other.id;
345 bool equal (const AudioRange& other) const {
346 return start == other.start && end == other.end;
349 Evoral::OverlapType coverage (samplepos_t s, samplepos_t e) const {
350 return Evoral::coverage (start, end, s, e);
355 Timecode::BBT_Time start;
356 Timecode::BBT_Time end;
359 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
360 : start (s), end (e), id (i) {}
362 bool operator== (const MusicRange& other) const {
363 return start == other.start && end == other.end && id == other.id;
366 bool equal (const MusicRange& other) const {
367 return start == other.start && end == other.end;
372 Slowest = 6.6dB/sec falloff at update rate of 40ms
373 Slow = 6.8dB/sec falloff at update rate of 40ms
378 MeterFalloffSlowest = 1,
379 MeterFalloffSlow = 2,
380 MeterFalloffSlowish = 3,
381 MeterFalloffModerate = 4,
382 MeterFalloffMedium = 5,
383 MeterFalloffFast = 6,
384 MeterFalloffFaster = 7,
385 MeterFalloffFastest = 8,
391 MeterHoldMedium = 100,
402 enum RegionSelectionAfterSplit {
404 NewlyCreatedLeft = 1, // bit 0
405 NewlyCreatedRight = 2, // bit 1
406 NewlyCreatedBoth = 3,
407 Existing = 4, // bit 2
408 ExistingNewlyCreatedLeft = 5,
409 ExistingNewlyCreatedRight = 6,
410 ExistingNewlyCreatedBoth = 7
425 HardwareMonitoring, ///< JACK does monitoring
426 SoftwareMonitoring, ///< Ardour does monitoring
427 ExternalMonitoring ///< we leave monitoring to the audio hardware
438 MonitoringSilence = 0x1,
439 MonitoringInput = 0x2,
440 MonitoringDisk = 0x4,
445 MeteringInput, ///< meter the input IO, regardless of what is going through the route
446 MeteringRoute ///< meter what is going through the route
449 enum VUMeterStandard {
450 MeteringVUfrench, // 0VU = -2dBu
451 MeteringVUamerican, // 0VU = 0dBu
452 MeteringVUstandard, // 0VU = +4dBu
453 MeteringVUeight // 0VU = +8dBu
464 /** PFL signals come from before pre-fader processors */
465 PFLFromBeforeProcessors,
466 /** PFL signals come pre-fader but after pre-fader processors */
467 PFLFromAfterProcessors
471 /** AFL signals come post-fader and before post-fader processors */
472 AFLFromBeforeProcessors,
473 /** AFL signals come post-fader but after post-fader processors */
474 AFLFromAfterProcessors
477 enum ClockDeltaMode {
495 enum ListenPosition {
500 enum AutoConnectOption {
502 AutoConnectPhysical = 0x1,
503 AutoConnectMaster = 0x2
506 enum TracksAutoNamingRule {
507 UseDefaultNames = 0x1,
508 NameAfterDriver = 0x2
517 int format_data_width (ARDOUR::SampleFormat);
519 enum CDMarkerFormat {
539 typedef Sample PeakDatum;
552 /* These are "synonyms". It is important for JACK to be first
553 both here and in enums.cc, so that the string "JACK" is
554 correctly recognized in older session and preference files.
563 enum ShuttleBehaviour {
573 typedef std::vector<boost::shared_ptr<Source> > SourceList;
583 typedef std::list<samplepos_t> AnalysisFeatureList;
585 typedef std::list<boost::shared_ptr<Route> > RouteList;
586 typedef std::list<boost::shared_ptr<Stripable> > StripableList;
587 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
588 typedef std::list<boost::weak_ptr <Stripable> > WeakStripableList;
589 typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
590 typedef std::list<boost::shared_ptr<SlavableAutomationControl> > SlavableControlList;
591 typedef std::set <boost::shared_ptr<AutomationControl> > AutomationControlSet;
593 typedef std::list<boost::shared_ptr<VCA> > VCAList;
596 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
608 struct CleanupReport {
609 std::vector<std::string> paths;
613 enum PositionLockStyle {
618 /** A struct used to describe changes to processors in a route.
619 * This is useful because objects that respond to a change in processors
620 * can optimise what work they do based on details of what has changed.
622 struct RouteProcessorChange {
625 MeterPointChange = 0x1,
629 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
632 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
635 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
638 /** type of change; "GeneralChange" means anything could have changed */
640 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
641 bool meter_visibly_changed;
645 uint32_t master_out_channels; /* how many channels for the master bus, 0: no master bus */
656 enum TransportState {
657 /* these values happen to match the constants used by JACK but
658 this equality cannot be assumed.
660 TransportStopped = 0,
661 TransportRolling = 1,
662 TransportLooping = 2,
663 TransportStarting = 3,
667 /* these values happen to match the constants used by JACK but
668 this equality cannot be assumed.
676 /* non-JACK related flags */
683 MidiPortControl = 0x2,
684 MidiPortSelection = 0x4,
685 MidiPortVirtual = 0x8
688 struct LatencyRange {
689 uint32_t min; //< samples
690 uint32_t max; //< samples
693 enum BufferingPreset {
700 enum AutoReturnTarget {
702 RangeSelectionStart = 0x2,
704 RegionSelectionStart = 0x8,
707 enum PlaylistDisposition {
713 enum MidiTrackNameSource {
719 enum MidiTempoMapDisposition {
729 typedef std::vector<CaptureInfo*> CaptureInfos;
731 } // namespace ARDOUR
733 /* for now, break the rules and use "using" to make this "global" */
735 using ARDOUR::samplepos_t;
737 #endif /* __ardour_types_h__ */