Jamba C++ API 7.5.0
Loading...
Searching...
No Matches
SampleRateBasedClock.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018-2019 pongasoft
3 *
4 * Licensed under the Apache License, Version 2.0 or the MIT license,
5 * at your option. You may not use this file except in compliance with
6 * one of these licenses. You may obtain copies of the licenses at:
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 * https://opensource.org/licenses/MIT
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 * License for the specific language governing permissions and limitations under
15 * the License.
16 *
17 * @author Yan Pujante
18 */
19#pragma once
20
21#include <pluginterfaces/base/ftypes.h>
22#include <pluginterfaces/vst/vsttypes.h>
23#include <cmath>
24#include <chrono>
25
26namespace pongasoft {
27namespace VST {
28
29using namespace Steinberg;
30using namespace Steinberg::Vst;
31
36{
37public:
51 {
52 public:
53 explicit RateLimiter(uint32 iRateLimitInSamples = 0) : fRateLimitInSamples{iRateLimitInSamples}, fSampleCount{0}
54 {}
55
60 bool shouldUpdate(uint32 numSamples)
61 {
62 fSampleCount += numSamples;
64 {
66 return true;
67 }
68 return false;
69 }
70
71 private:
74 };
75
76 // Constructor
77 explicit SampleRateBasedClock(SampleRate iSampleRate) : fSampleRate{iSampleRate}
78 {
79
80 }
81
82 // getSampleCountFor: how many samples for iMillis seconds
83 uint32 getSampleCountFor(uint32 iMillis) const
84 {
85 return static_cast<uint32>(ceil(fSampleRate * iMillis / 1000.0));
86 }
87
88 // getSampleCountFor1Bar: how many samples for 1 bar (given the tempo and optional time signature)
89 uint32 getSampleCountFor1Bar(double iTempo, int32 iTimeSigNumerator = 4, int32 iTimeSigDenominator = 4) const
90 {
91 auto oneBarInSeconds = 240.0 / iTempo;
92 if(iTimeSigNumerator != iTimeSigDenominator && iTimeSigDenominator != 0)
93 {
94 oneBarInSeconds *= (static_cast<double>(iTimeSigNumerator) / static_cast<double>(iTimeSigDenominator));
95 }
96 return static_cast<uint32>(ceil(fSampleRate * oneBarInSeconds));
97 }
98
99 // getTimeForSampleCount: inverse of getSampleCountFor
100 uint32 getTimeForSampleCount(uint32 iSampleCount) const
101 {
102 return static_cast<uint32>(ceil(iSampleCount * 1000.0 / fSampleRate));
103 }
104
116 TSamples getNextBarSampleCount(TSamples iCurrentSampleCount, double iTempo, int32 iTimeSigNumerator = 4, int32 iTimeSigDenominator = 4) const
117 {
118 auto sampleCountFor1Bar =
119 static_cast<TSamples>(getSampleCountFor1Bar(iTempo, iTimeSigNumerator, iTimeSigDenominator));
120 auto barMultiples = iCurrentSampleCount / sampleCountFor1Bar;
121 auto barBoundary = barMultiples * sampleCountFor1Bar;
122 if(barBoundary == iCurrentSampleCount)
123 return iCurrentSampleCount;
124 else
125 return barBoundary + sampleCountFor1Bar;
126 }
127
128 // getSampleRate
129 SampleRate getSampleRate() const
130 {
131 return fSampleRate;
132 }
133
134 // setSampleRate
135 void setSampleRate(SampleRate iSampleRate)
136 {
137 fSampleRate = iSampleRate;
138 }
139
140 // getRateLimiter
141 RateLimiter getRateLimiter(uint32 iMillis) const
142 {
143 return RateLimiter{getSampleCountFor(iMillis)};
144 }
145
146private:
147 SampleRate fSampleRate;
148};
149
150}
151}
Keeps track of the time in number of samples processed vs sample rate.
Definition SampleRateBasedClock.h:51
RateLimiter(uint32 iRateLimitInSamples=0)
Definition SampleRateBasedClock.h:53
uint32 fSampleCount
Definition SampleRateBasedClock.h:73
uint32 fRateLimitInSamples
Definition SampleRateBasedClock.h:72
bool shouldUpdate(uint32 numSamples)
Calls this method when a new batch of samples is processed and returns true if the limit (in samples)...
Definition SampleRateBasedClock.h:60
RateLimiter getRateLimiter(uint32 iMillis) const
Definition SampleRateBasedClock.h:141
TSamples getNextBarSampleCount(TSamples iCurrentSampleCount, double iTempo, int32 iTimeSigNumerator=4, int32 iTimeSigDenominator=4) const
Given the current sample count (which can be extracted from ProcessData::processContext->projectTimeS...
Definition SampleRateBasedClock.h:116
SampleRate fSampleRate
Definition SampleRateBasedClock.h:147
uint32 getSampleCountFor1Bar(double iTempo, int32 iTimeSigNumerator=4, int32 iTimeSigDenominator=4) const
Definition SampleRateBasedClock.h:89
uint32 getTimeForSampleCount(uint32 iSampleCount) const
Definition SampleRateBasedClock.h:100
SampleRate getSampleRate() const
Definition SampleRateBasedClock.h:129
uint32 getSampleCountFor(uint32 iMillis) const
Definition SampleRateBasedClock.h:83
void setSampleRate(SampleRate iSampleRate)
Definition SampleRateBasedClock.h:135
SampleRateBasedClock(SampleRate iSampleRate)
Definition SampleRateBasedClock.h:77
Definition Clock.h:24
Definition Clock.h:23