(native) Linux VST support from LinuxDSP
[ardour.git] / libs / ardour / ardour / types.h
1 /*
2     Copyright (C) 2002 Paul Davis
3
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.
8
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.
13
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.
17
18 */
19
20 #ifndef __ardour_types_h__
21 #define __ardour_types_h__
22
23 #include <istream>
24 #include <vector>
25 #include <map>
26 #include <boost/shared_ptr.hpp>
27 #include <sys/types.h>
28 #include <stdint.h>
29
30 #include <inttypes.h>
31 #include <jack/types.h>
32 #include <jack/midiport.h>
33
34 #include "timecode/bbt_time.h"
35 #include "timecode/time.h"
36
37 #include "pbd/id.h"
38
39 #include "ardour/chan_count.h"
40
41 #include <map>
42
43 #if __GNUC__ < 3
44 typedef int intptr_t;
45 #endif
46
47 namespace ARDOUR {
48
49         class Source;
50         class AudioSource;
51         class Route;
52         class Region;
53
54         typedef jack_default_audio_sample_t Sample;
55         typedef float                       pan_t;
56         typedef float                       gain_t;
57         typedef uint32_t                    layer_t;
58         typedef uint64_t                    microseconds_t;
59         typedef jack_nframes_t              pframes_t;
60
61         /* Any position measured in audio frames.
62            Assumed to be non-negative but not enforced.
63         */
64         typedef int64_t framepos_t;
65
66         /* Any distance from a given framepos_t.
67            Maybe positive or negative.
68         */
69         typedef int64_t frameoffset_t;
70
71         /* Any count of audio frames.
72            Assumed to be positive but not enforced.
73         */
74         typedef int64_t framecnt_t;
75
76         static const framepos_t max_framepos = INT64_MAX;
77         static const framecnt_t max_framecnt = INT64_MAX;
78
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<frameoffset_t, frameoffset_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;
83
84         struct IOChange {
85
86                 enum Type {
87                         NoChange = 0,
88                         ConfigurationChanged = 0x1,
89                         ConnectionsChanged = 0x2
90                 } type;
91
92                 IOChange () : type (NoChange) {}
93                 IOChange (Type t) : type (t) {}
94
95                 /** channel count of IO before a ConfigurationChanged, if appropriate */
96                 ARDOUR::ChanCount before;
97                 /** channel count of IO after a ConfigurationChanged, if appropriate */
98                 ARDOUR::ChanCount after;
99         };
100
101         enum OverlapType {
102                 OverlapNone,      // no overlap
103                 OverlapInternal,  // the overlap is 100% with the object
104                 OverlapStart,     // overlap covers start, but ends within
105                 OverlapEnd,       // overlap begins within and covers end
106                 OverlapExternal   // overlap extends to (at least) begin+end
107         };
108
109         ARDOUR::OverlapType coverage (framepos_t sa, framepos_t ea,
110                                       framepos_t sb, framepos_t eb);
111
112         /* policies for inserting/pasting material where overlaps
113            might be an issue.
114         */
115
116         enum InsertMergePolicy {
117                 InsertMergeReject,  // no overlaps allowed
118                 InsertMergeRelax,   // we just don't care about overlaps
119                 InsertMergeReplace, // replace old with new
120                 InsertMergeTruncateExisting, // shorten existing to avoid overlap
121                 InsertMergeTruncateAddition, // shorten new to avoid overlap
122                 InsertMergeExtend   // extend new (or old) to the range of old+new
123         };
124
125         /** See evoral/Parameter.hpp
126          */
127         enum AutomationType {
128                 NullAutomation,
129                 GainAutomation,
130                 PanAzimuthAutomation,
131                 PanElevationAutomation,
132                 PanWidthAutomation,
133                 PanFrontBackAutomation,
134                 PanLFEAutomation,
135                 PluginAutomation,
136                 SoloAutomation,
137                 MuteAutomation,
138                 MidiCCAutomation,
139                 MidiPgmChangeAutomation,
140                 MidiPitchBenderAutomation,
141                 MidiChannelPressureAutomation,
142                 MidiSystemExclusiveAutomation,
143                 FadeInAutomation,
144                 FadeOutAutomation,
145                 EnvelopeAutomation
146         };
147
148         enum AutoState {
149                 Off = 0x0,
150                 Write = 0x1,
151                 Touch = 0x2,
152                 Play = 0x4
153         };
154
155         std::string auto_state_to_string (AutoState);
156         AutoState string_to_auto_state (std::string);
157
158         enum AutoStyle {
159                 Absolute = 0x1,
160                 Trim = 0x2
161         };
162
163         std::string auto_style_to_string (AutoStyle);
164         AutoStyle string_to_auto_style (std::string);
165
166         enum AlignStyle {
167                 CaptureTime,
168                 ExistingMaterial
169         };
170
171         enum AlignChoice {
172                 UseCaptureTime,
173                 UseExistingMaterial,
174                 Automatic
175         };
176
177         enum MeterPoint {
178                 MeterInput,
179                 MeterPreFader,
180                 MeterPostFader,
181                 MeterOutput,
182                 MeterCustom
183         };
184
185         enum TrackMode {
186                 Normal,
187                 NonLayered,
188                 Destructive
189         };
190
191         enum NoteMode {
192                 Sustained,
193                 Percussive
194         };
195
196         enum ChannelMode {
197                 AllChannels = 0, ///< Pass through all channel information unmodified
198                 FilterChannels,  ///< Ignore events on certain channels
199                 ForceChannel     ///< Force all events to a certain channel
200         };
201
202         enum ColorMode {
203                 MeterColors = 0,
204                 ChannelColors,
205                 TrackColor
206         };
207
208         enum TimecodeFormat {
209                 timecode_23976,
210                 timecode_24,
211                 timecode_24976,
212                 timecode_25,
213                 timecode_2997,
214                 timecode_2997drop,
215                 timecode_30,
216                 timecode_30drop,
217                 timecode_5994,
218                 timecode_60
219         };
220
221         struct AnyTime {
222                 enum Type {
223                         Timecode,
224                         BBT,
225                         Frames,
226                         Seconds
227                 };
228
229                 Type type;
230
231                 Timecode::Time     timecode;
232                 Timecode::BBT_Time bbt;
233
234                 union {
235                         framecnt_t     frames;
236                         double         seconds;
237                 };
238
239                 AnyTime() { type = Frames; frames = 0; }
240
241                 bool operator== (AnyTime const & other) const {
242                         if (type != other.type) { return false; }
243
244                         switch (type) {
245                           case Timecode:
246                                 return timecode == other.timecode;
247                           case BBT:
248                                 return bbt == other.bbt;
249                           case Frames:
250                                 return frames == other.frames;
251                           case Seconds:
252                                 return seconds == other.seconds;
253                         }
254                         return false; // get rid of warning
255                 }
256
257                 bool not_zero() const
258                 {
259                         switch (type) {
260                           case Timecode:
261                                 return timecode.hours != 0 || timecode.minutes != 0 ||
262                                        timecode.seconds != 0 || timecode.frames != 0;
263                           case BBT:
264                                 return bbt.bars != 0 || bbt.beats != 0 || bbt.ticks != 0;
265                           case Frames:
266                                 return frames != 0;
267                           case Seconds:
268                                 return seconds != 0;
269                         }
270
271                         /* NOTREACHED */
272                         assert (false);
273                         return false;
274                 }
275         };
276
277         struct AudioRange {
278                 framepos_t start;
279                 framepos_t end;
280                 uint32_t id;
281
282                 AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
283
284                 framecnt_t length() { return end - start + 1; }
285
286                 bool operator== (const AudioRange& other) const {
287                         return start == other.start && end == other.end && id == other.id;
288                 }
289
290                 bool equal (const AudioRange& other) const {
291                         return start == other.start && end == other.end;
292                 }
293
294                 OverlapType coverage (framepos_t s, framepos_t e) const {
295                         return ARDOUR::coverage (start, end, s, e);
296                 }
297         };
298
299         struct MusicRange {
300                 Timecode::BBT_Time start;
301                 Timecode::BBT_Time end;
302                 uint32_t id;
303
304                 MusicRange (Timecode::BBT_Time& s, Timecode::BBT_Time& e, uint32_t i)
305                         : start (s), end (e), id (i) {}
306
307                 bool operator== (const MusicRange& other) const {
308                         return start == other.start && end == other.end && id == other.id;
309                 }
310
311                 bool equal (const MusicRange& other) const {
312                         return start == other.start && end == other.end;
313                 }
314         };
315
316         /*
317             Slowest = 6.6dB/sec falloff at update rate of 40ms
318             Slow    = 6.8dB/sec falloff at update rate of 40ms
319         */
320
321         enum MeterFalloff {
322                 MeterFalloffOff = 0,
323                 MeterFalloffSlowest = 1,
324                 MeterFalloffSlow = 2,
325                 MeterFalloffMedium = 3,
326                 MeterFalloffFast = 4,
327                 MeterFalloffFaster = 5,
328                 MeterFalloffFastest = 6
329         };
330
331         enum MeterHold {
332                 MeterHoldOff = 0,
333                 MeterHoldShort = 40,
334                 MeterHoldMedium = 100,
335                 MeterHoldLong = 200
336         };
337
338         enum EditMode {
339                 Slide,
340                 Splice,
341                 Lock
342         };
343
344         enum RegionPoint {
345                 Start,
346                 End,
347                 SyncPoint
348         };
349
350         enum Placement {
351                 PreFader,
352                 PostFader
353         };
354
355         enum MonitorModel {
356                 HardwareMonitoring,
357                 SoftwareMonitoring,
358                 ExternalMonitoring
359         };
360
361         enum PFLPosition {
362                 /** PFL signals come from before pre-fader processors */
363                 PFLFromBeforeProcessors,
364                 /** PFL signals come pre-fader but after pre-fader processors */
365                 PFLFromAfterProcessors
366         };
367
368         enum AFLPosition {
369                 /** AFL signals come post-fader and before post-fader processors */
370                 AFLFromBeforeProcessors,
371                 /** AFL signals come post-fader but after post-fader processors */
372                 AFLFromAfterProcessors
373         };
374
375         enum DenormalModel {
376                 DenormalNone,
377                 DenormalFTZ,
378                 DenormalDAZ,
379                 DenormalFTZDAZ
380         };
381
382         enum RemoteModel {
383                 UserOrdered,
384                 MixerOrdered,
385                 EditorOrdered
386         };
387
388         enum CrossfadeModel {
389                 FullCrossfade,
390                 ShortCrossfade
391         };
392
393         enum LayerModel {
394                 LaterHigher,
395                 MoveAddHigher,
396                 AddHigher
397         };
398
399         enum ListenPosition {
400                 AfterFaderListen,
401                 PreFaderListen
402         };
403
404         enum AutoConnectOption {
405                 ManualConnect = 0x0,
406                 AutoConnectPhysical = 0x1,
407                 AutoConnectMaster = 0x2
408         };
409
410         struct InterThreadInfo {
411                 InterThreadInfo () : done (false), cancel (false), progress (0), thread (0) {}
412
413                 volatile bool  done;
414                 volatile bool  cancel;
415                 volatile float progress;
416                 pthread_t      thread;
417         };
418
419         enum SampleFormat {
420                 FormatFloat = 0,
421                 FormatInt24,
422                 FormatInt16
423         };
424
425         enum CDMarkerFormat {
426                 CDMarkerNone,
427                 CDMarkerCUE,
428                 CDMarkerTOC
429         };
430
431         enum HeaderFormat {
432                 BWF,
433                 WAVE,
434                 WAVE64,
435                 CAF,
436                 AIFF,
437                 iXML,
438                 RF64
439         };
440
441         struct PeakData {
442                 typedef Sample PeakDatum;
443
444                 PeakDatum min;
445                 PeakDatum max;
446         };
447
448         enum PluginType {
449                 AudioUnit,
450                 LADSPA,
451                 LV2,
452                 VST,
453                 LXVST,
454         };
455
456         enum RunContext {
457                 ButlerContext = 0,
458                 TransportContext,
459                 ExportContext
460         };
461
462         enum SyncSource {
463                 JACK,
464                 MTC,
465                 MIDIClock
466         };
467
468         enum ShuttleBehaviour {
469                 Sprung,
470                 Wheel
471         };
472
473         enum ShuttleUnits {
474                 Percentage,
475                 Semitones
476         };
477
478         typedef std::vector<boost::shared_ptr<Source> > SourceList;
479
480         enum SrcQuality {
481                 SrcBest,
482                 SrcGood,
483                 SrcQuick,
484                 SrcFast,
485                 SrcFastest
486         };
487
488         struct TimeFXRequest : public InterThreadInfo {
489                 TimeFXRequest()
490                         : time_fraction(0), pitch_fraction(0),
491                         quick_seek(false), antialias(false),  opts(0) {}
492                 float time_fraction;
493                 float pitch_fraction;
494                 /* SoundTouch */
495                 bool  quick_seek;
496                 bool  antialias;
497                 /* RubberBand */
498                 int   opts; // really RubberBandStretcher::Options
499         };
500
501         typedef std::list<framepos_t> AnalysisFeatureList;
502
503         typedef std::list<boost::shared_ptr<Route> > RouteList;
504         typedef std::list<boost::weak_ptr  <Route> > WeakRouteList;
505
506         class Bundle;
507         typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
508
509         enum WaveformScale {
510                 Linear,
511                 Logarithmic
512         };
513
514         enum WaveformShape {
515                 Traditional,
516                 Rectified
517         };
518
519         enum QuantizeType {
520                 Plain,
521                 Legato,
522                 Groove
523         };
524
525         struct CleanupReport {
526                 std::vector<std::string> paths;
527                 size_t                   space;
528         };
529
530         enum PositionLockStyle {
531                 AudioTime,
532                 MusicTime
533         };
534
535         /** A struct used to describe changes to processors in a route.
536          *  This is useful because objects that respond to a change in processors
537          *  can optimise what work they do based on details of what has changed.
538         */
539         struct RouteProcessorChange {
540                 enum Type {
541                         GeneralChange = 0x0,
542                         MeterPointChange = 0x1
543                 };
544
545                 RouteProcessorChange () : type (GeneralChange), meter_visibly_changed (true)
546                 {}
547
548                 RouteProcessorChange (Type t) : type (t), meter_visibly_changed (true)
549                 {}
550
551                 RouteProcessorChange (Type t, bool m) : type (t), meter_visibly_changed (m)
552                 {}
553
554                 /** type of change; "GeneralChange" means anything could have changed */
555                 Type type;
556                 /** true if, when a MeterPointChange has occurred, the change is visible to the user */
557                 bool meter_visibly_changed;
558         };
559
560         struct BusProfile {
561                 AutoConnectOption input_ac;      /* override the RC config for input auto-connection */
562                 AutoConnectOption output_ac;     /* override the RC config for output auto-connection */
563                 uint32_t master_out_channels;    /* how many channels for the master bus */
564                 uint32_t requested_physical_in;  /* now many of the available physical inputs to consider usable */
565                 uint32_t requested_physical_out; /* now many of the available physical inputs to consider usable */
566         };
567
568         enum FadeShape {
569                 FadeLinear,
570                 FadeFast,
571                 FadeSlow,
572                 FadeLogA,
573                 FadeLogB
574         };
575
576 } // namespace ARDOUR
577
578
579 /* these cover types declared above in this header. See enums.cc
580    for the definitions.
581 */
582
583 std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
584 std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
585 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
586 std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
587 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
588 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
589 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
590 std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
591 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
592 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
593 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
594 std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeModel& sf);
595 std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
596 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
597 std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
598 std::istream& operator>>(std::istream& o, ARDOUR::TimecodeFormat& sf);
599 std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
600 std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
601 std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
602 std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
603
604 std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
605 std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
606 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
607 std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
608 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
609 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
610 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
611 std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
612 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
613 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
614 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
615 std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeModel& sf);
616 std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
617 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
618 std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
619 std::ostream& operator<<(std::ostream& o, const ARDOUR::TimecodeFormat& sf);
620 std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
621 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
622 std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
623 std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
624
625 static inline ARDOUR::framepos_t
626 session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
627 {
628         return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed);
629 }
630
631 static inline ARDOUR::framepos_t
632 track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed)
633 {
634         return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed);
635 }
636
637 /* for now, break the rules and use "using" to make this "global" */
638
639 using ARDOUR::framepos_t;
640
641
642 #endif /* __ardour_types_h__ */
643