#include "tools/bpmcalculator.h" #include #include #include constexpr microsec MICROSECONDS_IN_MINUTE = 60000000; BPMCalculator::BPMCalculator(const std::shared_ptr& music) : _music(music), _previous_click_offset(0) {} void BPMCalculator::setMusic(const std::shared_ptr& music) { _music = music; } void BPMCalculator::startListening(const microsec &offset) { _deltas.clear(); _previous_click_offset = 0; _music->setOffset(offset); _music->play(); } void BPMCalculator::stopListening() { _music->stop(); } void BPMCalculator::click() { const microsec click_offset = _music->fetchOffset(); if (_previous_click_offset == 0) { _previous_click_offset = click_offset; return; } const microsec delta = click_offset - _previous_click_offset; _deltas.emplace_back(delta); _previous_click_offset = click_offset; } int BPMCalculator::getCurrentApproximation() const { const microsec sum = std::accumulate(_deltas.begin(), _deltas.end(), 0); return (sum == 0) ? 0. : static_cast(static_cast(MICROSECONDS_IN_MINUTE) / (static_cast(sum) / static_cast(_deltas.size()))); }