| 1166 | } |
| 1167 | |
| 1168 | void run(const float** const inputs, float** const outputs, const uint32_t frames, |
| 1169 | const MidiEvent* const midiEvents, const uint32_t midiEventCount) override |
| 1170 | { |
| 1171 | const ScopedDenormalDisable sdd; |
| 1172 | |
| 1173 | rack::contextSet(context); |
| 1174 | |
| 1175 | const bool bypassed = context->bypassed; |
| 1176 | |
| 1177 | { |
| 1178 | const TimePosition& timePos(getTimePosition()); |
| 1179 | |
| 1180 | bool reset = timePos.playing && (timePos.frame == 0 || d_isDiffHigherThanLimit(fNextExpectedFrame, timePos.frame, (uint64_t)2)); |
| 1181 | |
| 1182 | // ignore hosts which cannot supply time frame position |
| 1183 | if (context->playing == timePos.playing && timePos.frame == 0 && context->frame == 0) |
| 1184 | reset = false; |
| 1185 | |
| 1186 | context->playing = timePos.playing; |
| 1187 | context->bbtValid = timePos.bbt.valid; |
| 1188 | context->frame = timePos.frame; |
| 1189 | |
| 1190 | if (timePos.bbt.valid) |
| 1191 | { |
| 1192 | const double samplesPerTick = 60.0 * getSampleRate() |
| 1193 | / timePos.bbt.beatsPerMinute |
| 1194 | / timePos.bbt.ticksPerBeat; |
| 1195 | context->bar = timePos.bbt.bar; |
| 1196 | context->beat = timePos.bbt.beat; |
| 1197 | context->beatsPerBar = timePos.bbt.beatsPerBar; |
| 1198 | context->beatType = timePos.bbt.beatType; |
| 1199 | context->barStartTick = timePos.bbt.barStartTick; |
| 1200 | context->beatsPerMinute = timePos.bbt.beatsPerMinute; |
| 1201 | context->tick = timePos.bbt.tick; |
| 1202 | context->ticksPerBeat = timePos.bbt.ticksPerBeat; |
| 1203 | context->ticksPerClock = timePos.bbt.ticksPerBeat / timePos.bbt.beatType; |
| 1204 | context->ticksPerFrame = 1.0 / samplesPerTick; |
| 1205 | context->tickClock = std::fmod(timePos.bbt.tick, context->ticksPerClock); |
| 1206 | #if CARDINAL_VARIANT_MINI && ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS |
| 1207 | fMiniReportValues[kCardinalParameterMiniTimeBar - kCardinalParameterStartMini] = timePos.bbt.bar; |
| 1208 | fMiniReportValues[kCardinalParameterMiniTimeBeat - kCardinalParameterStartMini] = timePos.bbt.beat; |
| 1209 | fMiniReportValues[kCardinalParameterMiniTimeBeatsPerBar - kCardinalParameterStartMini] = timePos.bbt.beatsPerBar; |
| 1210 | fMiniReportValues[kCardinalParameterMiniTimeBeatType - kCardinalParameterStartMini] = timePos.bbt.beatType; |
| 1211 | fMiniReportValues[kCardinalParameterMiniTimeBarStartTick - kCardinalParameterStartMini] = timePos.bbt.barStartTick; |
| 1212 | fMiniReportValues[kCardinalParameterMiniTimeBeatsPerMinute - kCardinalParameterStartMini] = timePos.bbt.beatsPerMinute; |
| 1213 | fMiniReportValues[kCardinalParameterMiniTimeTick - kCardinalParameterStartMini] = timePos.bbt.tick; |
| 1214 | fMiniReportValues[kCardinalParameterMiniTimeTicksPerBeat - kCardinalParameterStartMini] = timePos.bbt.ticksPerBeat; |
| 1215 | #endif |
| 1216 | } |
| 1217 | |
| 1218 | context->reset = reset; |
| 1219 | fNextExpectedFrame = timePos.playing ? timePos.frame + frames : 0; |
| 1220 | |
| 1221 | #if CARDINAL_VARIANT_MINI && ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS |
| 1222 | const int flags = (timePos.playing ? 0x1 : 0x0) |
| 1223 | | (timePos.bbt.valid ? 0x2 : 0x0) |
| 1224 | | (reset ? 0x4 : 0x0); |
| 1225 | fMiniReportValues[kCardinalParameterMiniTimeFlags - kCardinalParameterStartMini] = flags; |
nothing calls this directly
no test coverage detected