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_Visual = 0, /**< Snap to the editor's visual snap
249 * (incoprorating snap prefs and the current zoom scaling)
250 * this defines the behavior for visual mouse drags, for example */
252 SnapToGrid_Scaled = 1, /**< Snap to the selected grid quantization with visual scaling.
253 * Ignores other snap preferences (markers, regions, etc)
254 * this defines the behavior for nudging the playhead to next/prev grid, for example */
256 SnapToGrid_Unscaled = 2, /**< Snap to the selected grid quantization.
257 * If one is selected, and ignore any visual scaling
258 * this is the behavior for automated processes like "snap regions to grid"
259 * but note that midi quantization uses its own mechanism, not the grid */
273 Timecode::Time timecode;
274 Timecode::BBT_Time bbt;
281 AnyTime() { type = Samples; samples = 0; }
283 bool operator== (AnyTime const & other) const {
284 if (type != other.type) { return false; }
288 return timecode == other.timecode;
290 return bbt == other.bbt;
292 return samples == other.samples;
294 return seconds == other.seconds;
296 return false; // get rid of warning
299 bool not_zero() const
303 return timecode.hours != 0 || timecode.minutes != 0 ||
304 timecode.seconds != 0 || timecode.frames != 0;
306 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
313 abort(); /* NOTREACHED */
318 /* used for translating audio samples to an exact musical position using a note divisor.
319 an exact musical position almost never falls exactly on an audio sample, but for sub-sample
320 musical accuracy we need to derive exact musical locations from a sample position
321 the division follows TempoMap::exact_beat_at_sample().
323 -1 musical location is the bar closest to sample
324 0 musical location is the musical position of the sample
325 1 musical location is the BBT beat closest to sample
326 n musical location is the quarter-note division n closest to sample
332 MusicSample (samplepos_t f, int32_t d) : sample (f), division (d) {}
334 void set (samplepos_t f, int32_t d) {sample = f; division = d; }
336 MusicSample operator- (MusicSample other) { return MusicSample (sample - other.sample, 0); }
339 /* XXX: slightly unfortunate that there is this and Evoral::Range<>,
340 but this has a uint32_t id which Evoral::Range<> does not.
347 AudioRange (samplepos_t s, samplepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
349 samplecnt_t length() const { return end - start + 1; }
351 bool operator== (const AudioRange& other) const {
352 return start == other.start && end == other.end && id == other.id;
355 bool equal (const AudioRange& other) const {
356 return start == other.start && end == other.end;
359 Evoral::OverlapType coverage (samplepos_t s, samplepos_t e) const {
360 return Evoral::coverage (start, end, s, e);
365 Timecode::BBT_Time start;
366 Timecode::BBT_Time end;
369 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
370 : start (s), end (e), id (i) {}
372 bool operator== (const MusicRange& other) const {
373 return start == other.start && end == other.end && id == other.id;
376 bool equal (const MusicRange& other) const {
377 return start == other.start && end == other.end;
382 Slowest = 6.6dB/sec falloff at update rate of 40ms
383 Slow = 6.8dB/sec falloff at update rate of 40ms
388 MeterFalloffSlowest = 1,
389 MeterFalloffSlow = 2,
390 MeterFalloffSlowish = 3,
391 MeterFalloffModerate = 4,
392 MeterFalloffMedium = 5,
393 MeterFalloffFast = 6,
394 MeterFalloffFaster = 7,
395 MeterFalloffFastest = 8,
401 MeterHoldMedium = 100,
412 enum RegionSelectionAfterSplit {
414 NewlyCreatedLeft = 1, // bit 0
415 NewlyCreatedRight = 2, // bit 1
416 NewlyCreatedBoth = 3,
417 Existing = 4, // bit 2
418 ExistingNewlyCreatedLeft = 5,
419 ExistingNewlyCreatedRight = 6,
420 ExistingNewlyCreatedBoth = 7
435 HardwareMonitoring, ///< JACK does monitoring
436 SoftwareMonitoring, ///< Ardour does monitoring
437 ExternalMonitoring ///< we leave monitoring to the audio hardware
448 MonitoringSilence = 0x1,
449 MonitoringInput = 0x2,
450 MonitoringDisk = 0x4,
455 MeteringInput, ///< meter the input IO, regardless of what is going through the route
456 MeteringRoute ///< meter what is going through the route
459 enum VUMeterStandard {
460 MeteringVUfrench, // 0VU = -2dBu
461 MeteringVUamerican, // 0VU = 0dBu
462 MeteringVUstandard, // 0VU = +4dBu
463 MeteringVUeight // 0VU = +8dBu
474 /** PFL signals come from before pre-fader processors */
475 PFLFromBeforeProcessors,
476 /** PFL signals come pre-fader but after pre-fader processors */
477 PFLFromAfterProcessors
481 /** AFL signals come post-fader and before post-fader processors */
482 AFLFromBeforeProcessors,
483 /** AFL signals come post-fader but after post-fader processors */
484 AFLFromAfterProcessors
487 enum ClockDeltaMode {
505 enum ListenPosition {
510 enum AutoConnectOption {
512 AutoConnectPhysical = 0x1,
513 AutoConnectMaster = 0x2
516 enum TracksAutoNamingRule {
517 UseDefaultNames = 0x1,
518 NameAfterDriver = 0x2
527 int format_data_width (ARDOUR::SampleFormat);
529 enum CDMarkerFormat {
549 typedef Sample PeakDatum;
562 /* The first two are "synonyms". It is important for JACK to be first
563 both here and in enums.cc, so that the string "JACK" is
564 correctly recognized in older session and preference files.
573 enum TransportRequestSource {
582 enum TransportRequestType {
589 enum ShuttleBehaviour {
599 typedef std::vector<boost::shared_ptr<Source> > SourceList;
609 typedef std::list<samplepos_t> AnalysisFeatureList;
611 typedef std::list<boost::shared_ptr<Route> > RouteList;
612 typedef std::list<boost::shared_ptr<Stripable> > StripableList;
613 typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
614 typedef std::list<boost::weak_ptr <Stripable> > WeakStripableList;
615 typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
616 typedef std::list<boost::shared_ptr<SlavableAutomationControl> > SlavableControlList;
617 typedef std::set <boost::shared_ptr<AutomationControl> > AutomationControlSet;
619 typedef std::list<boost::shared_ptr<VCA> > VCAList;
622 typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
624 enum RegionEquivalence {
640 struct CleanupReport {
641 std::vector<std::string> paths;
645 enum PositionLockStyle {
650 /** A struct used to describe changes to processors in a route.
651 * This is useful because objects that respond to a change in processors
652 * can optimise what work they do based on details of what has changed.
654 struct RouteProcessorChange {
657 MeterPointChange = 0x1,
661 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
664 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
667 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
670 /** type of change; "GeneralChange" means anything could have changed */
672 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
673 bool meter_visibly_changed;
677 uint32_t master_out_channels; /* how many channels for the master bus, 0: no master bus */
688 enum TransportState {
689 /* these values happen to match the constants used by JACK but
690 this equality cannot be assumed.
692 TransportStopped = 0,
693 TransportRolling = 1,
694 TransportLooping = 2,
695 TransportStarting = 3,
699 /* these values happen to match the constants used by JACK but
700 this equality cannot be assumed.
708 /* non-JACK related flags */
715 MidiPortControl = 0x2,
716 MidiPortSelection = 0x4,
717 MidiPortVirtual = 0x8
720 struct LatencyRange {
721 uint32_t min; //< samples
722 uint32_t max; //< samples
725 enum BufferingPreset {
732 enum AutoReturnTarget {
734 RangeSelectionStart = 0x2,
736 RegionSelectionStart = 0x8,
739 enum PlaylistDisposition {
745 enum MidiTrackNameSource {
751 enum MidiTempoMapDisposition {
761 typedef std::vector<CaptureInfo*> CaptureInfos;
763 } // namespace ARDOUR
765 /* for now, break the rules and use "using" to make this "global" */
767 using ARDOUR::samplepos_t;
769 #endif /* __ardour_types_h__ */