| 1390 | } |
| 1391 | |
| 1392 | v3_result process(v3_process_data* const data) |
| 1393 | { |
| 1394 | DISTRHO_SAFE_ASSERT_RETURN(data->symbolic_sample_size == V3_SAMPLE_32, V3_INVALID_ARG); |
| 1395 | // d_debug("process %i", data->symbolic_sample_size); |
| 1396 | |
| 1397 | // activate plugin if not done yet |
| 1398 | if (! fPlugin.isActive()) |
| 1399 | fPlugin.activate(); |
| 1400 | |
| 1401 | #if DISTRHO_PLUGIN_WANT_TIMEPOS |
| 1402 | if (v3_process_context* const ctx = data->ctx) |
| 1403 | { |
| 1404 | fTimePosition.playing = ctx->state & V3_PROCESS_CTX_PLAYING; |
| 1405 | |
| 1406 | // ticksPerBeat is not possible with VST3 |
| 1407 | fTimePosition.bbt.ticksPerBeat = 1920.0; |
| 1408 | |
| 1409 | if (ctx->state & V3_PROCESS_CTX_PROJECT_TIME_VALID) |
| 1410 | fTimePosition.frame = ctx->project_time_in_samples; |
| 1411 | else if (ctx->state & V3_PROCESS_CTX_CONT_TIME_VALID) |
| 1412 | fTimePosition.frame = ctx->continuous_time_in_samples; |
| 1413 | |
| 1414 | if (ctx->state & V3_PROCESS_CTX_TEMPO_VALID) |
| 1415 | fTimePosition.bbt.beatsPerMinute = ctx->bpm; |
| 1416 | else |
| 1417 | fTimePosition.bbt.beatsPerMinute = 120.0; |
| 1418 | |
| 1419 | if ((ctx->state & (V3_PROCESS_CTX_PROJECT_TIME_VALID|V3_PROCESS_CTX_TIME_SIG_VALID)) == (V3_PROCESS_CTX_PROJECT_TIME_VALID|V3_PROCESS_CTX_TIME_SIG_VALID)) |
| 1420 | { |
| 1421 | const double ppqPos = std::abs(ctx->project_time_quarters); |
| 1422 | const int ppqPerBar = ctx->time_sig_numerator * 4 / ctx->time_sig_denom; |
| 1423 | const double barBeats = (std::fmod(ppqPos, ppqPerBar) / ppqPerBar) * ctx->time_sig_numerator; |
| 1424 | const double rest = std::fmod(barBeats, 1.0); |
| 1425 | |
| 1426 | fTimePosition.bbt.valid = true; |
| 1427 | fTimePosition.bbt.bar = static_cast<int32_t>(ppqPos) / ppqPerBar + 1; |
| 1428 | fTimePosition.bbt.beat = static_cast<int32_t>(barBeats - rest) + 1; |
| 1429 | fTimePosition.bbt.tick = rest * fTimePosition.bbt.ticksPerBeat; |
| 1430 | fTimePosition.bbt.beatsPerBar = ctx->time_sig_numerator; |
| 1431 | fTimePosition.bbt.beatType = ctx->time_sig_denom; |
| 1432 | |
| 1433 | if (ctx->project_time_quarters < 0.0) |
| 1434 | { |
| 1435 | --fTimePosition.bbt.bar; |
| 1436 | fTimePosition.bbt.beat = ctx->time_sig_numerator - fTimePosition.bbt.beat + 1; |
| 1437 | fTimePosition.bbt.tick = fTimePosition.bbt.ticksPerBeat - fTimePosition.bbt.tick - 1; |
| 1438 | } |
| 1439 | } |
| 1440 | else |
| 1441 | { |
| 1442 | fTimePosition.bbt.valid = false; |
| 1443 | fTimePosition.bbt.bar = 1; |
| 1444 | fTimePosition.bbt.beat = 1; |
| 1445 | fTimePosition.bbt.tick = 0.0; |
| 1446 | fTimePosition.bbt.beatsPerBar = 4.0f; |
| 1447 | fTimePosition.bbt.beatType = 4.0f; |
| 1448 | } |
| 1449 |
nothing calls this directly
no test coverage detected