LMMS
Loading...
Searching...
No Matches
juce_AudioPlayHead.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
26//==============================================================================
39{
40protected:
41 //==============================================================================
42 AudioPlayHead() = default;
43
44public:
45 virtual ~AudioPlayHead() = default;
46
47 //==============================================================================
62
65 {
66 public:
68 FrameRate() = default;
69
72
79 {
80 switch (base)
81 {
82 case 24: return pulldown ? fps23976 : fps24;
83 case 25: return fps25;
84 case 30: return pulldown ? (drop ? fps2997drop : fps2997)
85 : (drop ? fps30drop : fps30);
86 case 60: return drop ? fps60drop : fps60;
87 }
88
89 return fpsUnknown;
90 }
91
93 int getBaseRate() const { return base; }
94
96 bool isDrop() const { return drop; }
97
99 bool isPullDown() const { return pulldown; }
100
102 double getEffectiveRate() const { return pulldown ? (double) base / 1.001 : (double) base; }
103
106
108 JUCE_NODISCARD FrameRate withDrop (bool x = true) const { return with (&FrameRate::drop, x); }
109
111 JUCE_NODISCARD FrameRate withPullDown (bool x = true) const { return with (&FrameRate::pulldown, x); }
112
114 bool operator== (const FrameRate& other) const
115 {
116 const auto tie = [] (const FrameRate& x) { return std::tie (x.base, x.drop, x.pulldown); };
117 return tie (*this) == tie (other);
118 }
119
121 bool operator!= (const FrameRate& other) const { return ! (*this == other); }
122
123 private:
125 {
126 switch (type)
127 {
128 case fps23976: return FrameRate().withBaseRate (24).withPullDown();
129 case fps24: return FrameRate().withBaseRate (24);
130 case fps25: return FrameRate().withBaseRate (25);
131 case fps2997: return FrameRate().withBaseRate (30).withPullDown();
132 case fps30: return FrameRate().withBaseRate (30);
133 case fps2997drop: return FrameRate().withBaseRate (30).withDrop().withPullDown();
134 case fps30drop: return FrameRate().withBaseRate (30).withDrop();
135 case fps60: return FrameRate().withBaseRate (60);
136 case fps60drop: return FrameRate().withBaseRate (60).withDrop();
137 case fpsUnknown: break;
138 }
139
140 return {};
141 }
142
143 template <typename Member, typename Value>
144 FrameRate with (Member&& member, Value&& value) const
145 {
146 auto copy = *this;
147 copy.*member = std::forward<Value> (value);
148 return copy;
149 }
150
151 int base = 0;
152 bool drop = false, pulldown = false;
153 };
154
160 {
162 int numerator = 4;
163
165 int denominator = 4;
166
167 bool operator== (const TimeSignature& other) const
168 {
169 const auto tie = [] (auto& x) { return std::tie (x.numerator, x.denominator); };
170 return tie (*this) == tie (other);
171 }
172
173 bool operator!= (const TimeSignature& other) const
174 {
175 return ! operator== (other);
176 }
177 };
178
184 {
186 double ppqStart = 0;
187
189 double ppqEnd = 0;
190
191 bool operator== (const LoopPoints& other) const
192 {
193 const auto tie = [] (auto& x) { return std::tie (x.ppqStart, x.ppqEnd); };
194 return tie (*this) == tie (other);
195 }
196
197 bool operator!= (const LoopPoints& other) const
198 {
199 return ! operator== (other);
200 }
201 };
202
203 //==============================================================================
211 {
213 double bpm = 120.0;
214
217
220
224 double timeInSeconds = 0;
225
227 double editOriginTime = 0;
228
230 double ppqPosition = 0;
231
241
244
246 bool isPlaying = false;
247
252 bool isRecording = false;
253
258 double ppqLoopStart = 0;
259
264 double ppqLoopEnd = 0;
265
267 bool isLooping = false;
268
269 //==============================================================================
270 bool operator== (const CurrentPositionInfo& other) const noexcept
271 {
272 const auto tie = [] (const CurrentPositionInfo& i)
273 {
274 return std::tie (i.timeInSamples,
275 i.ppqPosition,
276 i.editOriginTime,
277 i.ppqPositionOfLastBarStart,
278 i.frameRate,
279 i.isPlaying,
280 i.isRecording,
281 i.bpm,
282 i.timeSigNumerator,
283 i.timeSigDenominator,
284 i.ppqLoopStart,
285 i.ppqLoopEnd,
286 i.isLooping);
287 };
288
289 return tie (*this) == tie (other);
290 }
291
292 bool operator!= (const CurrentPositionInfo& other) const noexcept
293 {
294 return ! operator== (other);
295 }
296
298 {
299 *this = CurrentPositionInfo{};
300 }
301 };
302
303 //==============================================================================
318 {
319 public:
322
324 void setTimeInSamples (Optional<int64_t> timeInSamplesIn) { setOptional (flagTimeSamples, timeInSamples, timeInSamplesIn); }
325
328
330 void setTimeInSeconds (Optional<double> timeInSecondsIn) { setOptional (flagTimeSeconds, timeInSeconds, timeInSecondsIn); }
331
334
337
340
343
346
349
355
357 void setBarCount (Optional<int64_t> barCountIn) { setOptional (flagBarCount, barCount, barCountIn); }
358
367
370
373
375 void setFrameRate (Optional<FrameRate> frameRateIn) { setOptional (flagFrameRate, frame, frameRateIn); }
376
379
381 void setPpqPosition (Optional<double> ppqPositionIn) { setOptional (flagPpqPosition, positionPpq, ppqPositionIn); }
382
385
387 void setEditOriginTime (Optional<double> editOriginTimeIn) { setOptional (flagOriginTime, originTime, editOriginTimeIn); }
388
391
393 void setHostTimeNs (Optional<uint64_t> hostTimeNsIn) { setOptional (flagHostTimeNs, hostTimeNs, hostTimeNsIn); }
394
396 bool getIsPlaying() const { return getFlag (flagIsPlaying); }
397
399 void setIsPlaying (bool isPlayingIn) { setFlag (flagIsPlaying, isPlayingIn); }
400
405 bool getIsRecording() const { return getFlag (flagIsRecording); }
406
408 void setIsRecording (bool isRecordingIn) { setFlag (flagIsRecording, isRecordingIn); }
409
411 bool getIsLooping() const { return getFlag (flagIsLooping); }
412
414 void setIsLooping (bool isLoopingIn) { setFlag (flagIsLooping, isLoopingIn); }
415
416 bool operator== (const PositionInfo& other) const noexcept
417 {
418 const auto tie = [] (const PositionInfo& i)
419 {
420 return std::make_tuple (i.getTimeInSamples(),
421 i.getTimeInSeconds(),
422 i.getPpqPosition(),
423 i.getEditOriginTime(),
424 i.getPpqPositionOfLastBarStart(),
425 i.getFrameRate(),
426 i.getBarCount(),
427 i.getTimeSignature(),
428 i.getBpm(),
429 i.getLoopPoints(),
430 i.getHostTimeNs(),
431 i.getIsPlaying(),
432 i.getIsRecording(),
433 i.getIsLooping());
434 };
435
436 return tie (*this) == tie (other);
437 }
438
439 bool operator!= (const PositionInfo& other) const noexcept
440 {
441 return ! operator== (other);
442 }
443
444 private:
445 bool getFlag (int64_t flagToCheck) const
446 {
447 return (flagToCheck & flags) != 0;
448 }
449
450 void setFlag (int64_t flagToCheck, bool value)
451 {
452 flags = (value ? flags | flagToCheck : flags & ~flagToCheck);
453 }
454
455 template <typename Value>
456 Optional<Value> getOptional (int64_t flagToCheck, Value value) const
457 {
458 return getFlag (flagToCheck) ? makeOptional (std::move (value)) : nullopt;
459 }
460
461 template <typename Value>
462 void setOptional (int64_t flagToCheck, Value& value, Optional<Value> opt)
463 {
464 if (opt.hasValue())
465 value = *opt;
466
467 setFlag (flagToCheck, opt.hasValue());
468 }
469
470 enum
471 {
479 flagTempo = 1 << 7,
481 flagBarCount = 1 << 9,
482 flagHostTimeNs = 1 << 10,
483 flagIsPlaying = 1 << 11,
486 };
487
491 double timeInSeconds = 0.0;
492 double lastBarStartPpq = 0.0;
493 double positionPpq = 0.0;
494 double originTime = 0.0;
495 double tempoBpm = 0.0;
496 int64_t timeInSamples = 0;
497 int64_t barCount = 0;
498 uint64_t hostTimeNs = 0;
499 int64_t flags = 0;
500 };
501
502 //==============================================================================
515 [[deprecated ("Use getPosition instead. Not all hosts are able to provide all time position information; getPosition differentiates clearly between set and unset fields.")]]
517 {
518 if (const auto pos = getPosition())
519 {
520 result.resetToDefault();
521
522 if (const auto sig = pos->getTimeSignature())
523 {
524 result.timeSigNumerator = sig->numerator;
525 result.timeSigDenominator = sig->denominator;
526 }
527
528 if (const auto loop = pos->getLoopPoints())
529 {
530 result.ppqLoopStart = loop->ppqStart;
531 result.ppqLoopEnd = loop->ppqEnd;
532 }
533
534 if (const auto frame = pos->getFrameRate())
535 result.frameRate = *frame;
536
537 if (const auto timeInSeconds = pos->getTimeInSeconds())
538 result.timeInSeconds = *timeInSeconds;
539
540 if (const auto lastBarStartPpq = pos->getPpqPositionOfLastBarStart())
541 result.ppqPositionOfLastBarStart = *lastBarStartPpq;
542
543 if (const auto ppqPosition = pos->getPpqPosition())
544 result.ppqPosition = *ppqPosition;
545
546 if (const auto originTime = pos->getEditOriginTime())
547 result.editOriginTime = *originTime;
548
549 if (const auto bpm = pos->getBpm())
550 result.bpm = *bpm;
551
552 if (const auto timeInSamples = pos->getTimeInSamples())
553 result.timeInSamples = *timeInSamples;
554
555 result.isPlaying = pos->getIsPlaying();
556 result.isRecording = pos->getIsRecording();
557 result.isLooping = pos->getIsLooping();
558
559 return true;
560 }
561
562 return false;
563 }
564
579
581 virtual bool canControlTransport() { return false; }
582
584 virtual void transportPlay (bool shouldStartPlaying) { ignoreUnused (shouldStartPlaying); }
585
587 virtual void transportRecord (bool shouldStartRecording) { ignoreUnused (shouldStartRecording); }
588
590 virtual void transportRewind() {}
591};
592
593} // namespace juce
#define copy(x)
Definition ADnoteParameters.cpp:1011
goto loop
Definition Spc_Cpu.h:155
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition juce_AudioPlayHead.h:65
static FrameRate fromType(FrameRateType type)
Definition juce_AudioPlayHead.h:124
FrameRate(FrameRateType type)
Definition juce_AudioPlayHead.h:71
int base
Definition juce_AudioPlayHead.h:151
bool isPullDown() const
Definition juce_AudioPlayHead.h:99
JUCE_NODISCARD FrameRate withDrop(bool x=true) const
Definition juce_AudioPlayHead.h:108
FrameRateType getType() const
Definition juce_AudioPlayHead.h:78
JUCE_NODISCARD FrameRate withPullDown(bool x=true) const
Definition juce_AudioPlayHead.h:111
JUCE_NODISCARD FrameRate withBaseRate(int x) const
Definition juce_AudioPlayHead.h:105
bool drop
Definition juce_AudioPlayHead.h:152
bool pulldown
Definition juce_AudioPlayHead.h:152
int getBaseRate() const
Definition juce_AudioPlayHead.h:93
bool isDrop() const
Definition juce_AudioPlayHead.h:96
double getEffectiveRate() const
Definition juce_AudioPlayHead.h:102
FrameRate with(Member &&member, Value &&value) const
Definition juce_AudioPlayHead.h:144
Definition juce_AudioPlayHead.h:318
double timeInSeconds
Definition juce_AudioPlayHead.h:491
void setBpm(Optional< double > bpmIn)
Definition juce_AudioPlayHead.h:336
@ flagPpqPosition
Definition juce_AudioPlayHead.h:477
@ flagLoopPoints
Definition juce_AudioPlayHead.h:473
@ flagIsLooping
Definition juce_AudioPlayHead.h:485
@ flagTimeSamples
Definition juce_AudioPlayHead.h:480
@ flagTimeSeconds
Definition juce_AudioPlayHead.h:475
@ flagBarCount
Definition juce_AudioPlayHead.h:481
@ flagHostTimeNs
Definition juce_AudioPlayHead.h:482
@ flagOriginTime
Definition juce_AudioPlayHead.h:478
@ flagIsRecording
Definition juce_AudioPlayHead.h:484
@ flagTempo
Definition juce_AudioPlayHead.h:479
@ flagIsPlaying
Definition juce_AudioPlayHead.h:483
@ flagLastBarStartPpq
Definition juce_AudioPlayHead.h:476
@ flagTimeSignature
Definition juce_AudioPlayHead.h:472
@ flagFrameRate
Definition juce_AudioPlayHead.h:474
void setOptional(int64_t flagToCheck, Value &value, Optional< Value > opt)
Definition juce_AudioPlayHead.h:462
int64_t barCount
Definition juce_AudioPlayHead.h:497
double originTime
Definition juce_AudioPlayHead.h:494
void setIsRecording(bool isRecordingIn)
Definition juce_AudioPlayHead.h:408
void setTimeInSamples(Optional< int64_t > timeInSamplesIn)
Definition juce_AudioPlayHead.h:324
bool getIsRecording() const
Definition juce_AudioPlayHead.h:405
Optional< double > getBpm() const
Definition juce_AudioPlayHead.h:333
double lastBarStartPpq
Definition juce_AudioPlayHead.h:492
double tempoBpm
Definition juce_AudioPlayHead.h:495
Optional< int64_t > getTimeInSamples() const
Definition juce_AudioPlayHead.h:321
void setHostTimeNs(Optional< uint64_t > hostTimeNsIn)
Definition juce_AudioPlayHead.h:393
void setLoopPoints(Optional< LoopPoints > loopPointsIn)
Definition juce_AudioPlayHead.h:348
Optional< double > getPpqPositionOfLastBarStart() const
Definition juce_AudioPlayHead.h:366
void setPpqPositionOfLastBarStart(Optional< double > positionIn)
Definition juce_AudioPlayHead.h:369
bool getFlag(int64_t flagToCheck) const
Definition juce_AudioPlayHead.h:445
void setBarCount(Optional< int64_t > barCountIn)
Definition juce_AudioPlayHead.h:357
uint64_t hostTimeNs
Definition juce_AudioPlayHead.h:498
LoopPoints loopPoints
Definition juce_AudioPlayHead.h:489
void setPpqPosition(Optional< double > ppqPositionIn)
Definition juce_AudioPlayHead.h:381
void setFlag(int64_t flagToCheck, bool value)
Definition juce_AudioPlayHead.h:450
TimeSignature timeSignature
Definition juce_AudioPlayHead.h:488
void setTimeInSeconds(Optional< double > timeInSecondsIn)
Definition juce_AudioPlayHead.h:330
int64_t flags
Definition juce_AudioPlayHead.h:499
Optional< uint64_t > getHostTimeNs() const
Definition juce_AudioPlayHead.h:390
int64_t timeInSamples
Definition juce_AudioPlayHead.h:496
Optional< double > getPpqPosition() const
Definition juce_AudioPlayHead.h:378
void setIsLooping(bool isLoopingIn)
Definition juce_AudioPlayHead.h:414
Optional< TimeSignature > getTimeSignature() const
Definition juce_AudioPlayHead.h:339
FrameRate frame
Definition juce_AudioPlayHead.h:490
Optional< LoopPoints > getLoopPoints() const
Definition juce_AudioPlayHead.h:345
Optional< double > getTimeInSeconds() const
Definition juce_AudioPlayHead.h:327
bool getIsPlaying() const
Definition juce_AudioPlayHead.h:396
void setTimeSignature(Optional< TimeSignature > timeSignatureIn)
Definition juce_AudioPlayHead.h:342
double positionPpq
Definition juce_AudioPlayHead.h:493
void setFrameRate(Optional< FrameRate > frameRateIn)
Definition juce_AudioPlayHead.h:375
void setEditOriginTime(Optional< double > editOriginTimeIn)
Definition juce_AudioPlayHead.h:387
void setIsPlaying(bool isPlayingIn)
Definition juce_AudioPlayHead.h:399
Optional< Value > getOptional(int64_t flagToCheck, Value value) const
Definition juce_AudioPlayHead.h:456
Optional< double > getEditOriginTime() const
Definition juce_AudioPlayHead.h:384
Optional< int64_t > getBarCount() const
Definition juce_AudioPlayHead.h:354
Optional< FrameRate > getFrameRate() const
Definition juce_AudioPlayHead.h:372
bool getIsLooping() const
Definition juce_AudioPlayHead.h:411
virtual Optional< PositionInfo > getPosition() const =0
virtual bool canControlTransport()
Definition juce_AudioPlayHead.h:581
FrameRateType
Definition juce_AudioPlayHead.h:50
@ fps24
Definition juce_AudioPlayHead.h:52
@ fps60drop
Definition juce_AudioPlayHead.h:59
@ fps23976
Definition juce_AudioPlayHead.h:51
@ fps2997
Definition juce_AudioPlayHead.h:54
@ fpsUnknown
Definition juce_AudioPlayHead.h:60
@ fps25
Definition juce_AudioPlayHead.h:53
@ fps30drop
Definition juce_AudioPlayHead.h:57
@ fps2997drop
Definition juce_AudioPlayHead.h:56
@ fps30
Definition juce_AudioPlayHead.h:55
@ fps60
Definition juce_AudioPlayHead.h:58
virtual void transportPlay(bool shouldStartPlaying)
Definition juce_AudioPlayHead.h:584
AudioPlayHead()=default
virtual void transportRecord(bool shouldStartRecording)
Definition juce_AudioPlayHead.h:587
bool getCurrentPosition(CurrentPositionInfo &result)
Definition juce_AudioPlayHead.h:516
virtual ~AudioPlayHead()=default
virtual void transportRewind()
Definition juce_AudioPlayHead.h:590
Definition juce_Optional.h:74
bool hasValue() const noexcept
Definition juce_Optional.h:219
Definition juce_Value.h:51
register unsigned i
Definition inflate.c:1575
unsigned x[BMAX+1]
Definition inflate.c:1586
static PuglViewHint int value
Definition pugl.h:1708
#define JUCE_NODISCARD
Definition juce_CompilerSupport.h:108
#define JUCE_API
Definition juce_StandardHeader.h:152
Definition carla_juce.cpp:31
JUCE_END_IGNORE_WARNINGS_MSVC Optional< std::decay_t< Value > > makeOptional(Value &&v)
Definition juce_Optional.h:298
static auto tie(const AudioDeviceManager::AudioDeviceSetup &s)
Definition juce_AudioDeviceManager.cpp:41
long long int64
Definition juce_MathsFunctions.h:54
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
constexpr Nullopt nullopt
Definition juce_Optional.h:48
Definition juce_AudioPlayHead.h:211
int timeSigDenominator
Definition juce_AudioPlayHead.h:219
double ppqPositionOfLastBarStart
Definition juce_AudioPlayHead.h:240
double ppqLoopEnd
Definition juce_AudioPlayHead.h:264
void resetToDefault()
Definition juce_AudioPlayHead.h:297
int timeSigNumerator
Definition juce_AudioPlayHead.h:216
double ppqLoopStart
Definition juce_AudioPlayHead.h:258
bool isPlaying
Definition juce_AudioPlayHead.h:246
double ppqPosition
Definition juce_AudioPlayHead.h:230
FrameRate frameRate
Definition juce_AudioPlayHead.h:243
double bpm
Definition juce_AudioPlayHead.h:213
bool isLooping
Definition juce_AudioPlayHead.h:267
int64 timeInSamples
Definition juce_AudioPlayHead.h:222
double editOriginTime
Definition juce_AudioPlayHead.h:227
double timeInSeconds
Definition juce_AudioPlayHead.h:224
bool isRecording
Definition juce_AudioPlayHead.h:252
Definition juce_AudioPlayHead.h:184
double ppqEnd
Definition juce_AudioPlayHead.h:189
double ppqStart
Definition juce_AudioPlayHead.h:186
Definition juce_AudioPlayHead.h:160
int numerator
Definition juce_AudioPlayHead.h:162
int denominator
Definition juce_AudioPlayHead.h:165
int result
Definition process.c:1455