| 550 | |
| 551 | |
| 552 | void Engine::stepBlock(int frames) { |
| 553 | // Start timer before locking |
| 554 | double startTime = system::getTime(); |
| 555 | |
| 556 | std::lock_guard<std::mutex> stepLock(internal->blockMutex); |
| 557 | SharedLock<SharedMutex> lock(internal->mutex); |
| 558 | // Configure thread |
| 559 | system::resetFpuFlags(); |
| 560 | |
| 561 | internal->blockFrame = internal->frame; |
| 562 | internal->blockTime = system::getTime(); |
| 563 | internal->blockFrames = frames; |
| 564 | |
| 565 | // Update expander pointers |
| 566 | for (Module* module : internal->modules) { |
| 567 | Engine_updateExpander_NoLock(this, module, 0); |
| 568 | Engine_updateExpander_NoLock(this, module, 1); |
| 569 | } |
| 570 | |
| 571 | // Launch workers |
| 572 | Engine_relaunchWorkers(this, settings::threadCount); |
| 573 | |
| 574 | // Step individual frames |
| 575 | for (int i = 0; i < frames; i++) { |
| 576 | Engine_stepFrame(this); |
| 577 | } |
| 578 | |
| 579 | yieldWorkers(); |
| 580 | |
| 581 | internal->block++; |
| 582 | |
| 583 | // Stop timer |
| 584 | double endTime = system::getTime(); |
| 585 | double meter = (endTime - startTime) / (frames * internal->sampleTime); |
| 586 | internal->meterTotal += meter; |
| 587 | internal->meterMax = std::fmax(internal->meterMax, meter); |
| 588 | internal->meterCount++; |
| 589 | |
| 590 | // Update meter values |
| 591 | const double meterUpdateDuration = 1.0; |
| 592 | if (startTime - internal->meterLastTime >= meterUpdateDuration) { |
| 593 | internal->meterLastAverage = internal->meterTotal / internal->meterCount; |
| 594 | internal->meterLastMax = internal->meterMax; |
| 595 | internal->meterLastTime = startTime; |
| 596 | internal->meterCount = 0; |
| 597 | internal->meterTotal = 0.0; |
| 598 | internal->meterMax = 0.0; |
| 599 | } |
| 600 | } |
| 601 | |
| 602 | |
| 603 | void Engine::setMasterModule(Module* module) { |
no test coverage detected