1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-02 08:59:28 +02:00

Scrubbing calculation now needs clock precision greater than sample rate

This commit is contained in:
Paul Licameli 2018-08-29 14:56:15 -04:00
parent 919571e79f
commit d050afb658

View File

@ -776,28 +776,29 @@ private:
sampleCount mSilence; sampleCount mSilence;
}; };
using Clock = std::chrono::steady_clock;
struct Duration { struct Duration {
Duration (ScrubState &queue_) : queue(queue_) Duration (ScrubState &queue_) : queue(queue_)
{ {
do { do {
clockTime = ::wxGetLocalTimeMillis(); clockTime = Clock::now();
duration = static_cast<long long>( using Seconds = std::chrono::duration<double>;
queue.mRate * const auto elapsed = std::chrono::duration_cast<Seconds>(
(clockTime - queue.mLastScrubTimeMillis).ToDouble() clockTime - queue.mLastScrubTime);
/ 1000.0 duration = static_cast<long long>( queue.mRate * elapsed.count() );
);
} while( duration <= 0 && (::wxMilliSleep(1), true) ); } while( duration <= 0 && (::wxMilliSleep(1), true) );
} }
~Duration () ~Duration ()
{ {
if(!cancelled) if(!cancelled)
queue.mLastScrubTimeMillis = clockTime; queue.mLastScrubTime = clockTime;
} }
void Cancel() { cancelled = true; } void Cancel() { cancelled = true; }
ScrubState &queue; ScrubState &queue;
wxLongLong clockTime; Clock::time_point clockTime;
sampleCount duration; sampleCount duration;
bool cancelled { false }; bool cancelled { false };
}; };
@ -807,7 +808,7 @@ private:
std::atomic<bool> mStopped { false }; std::atomic<bool> mStopped { false };
Data mData; Data mData;
const double mRate; const double mRate;
wxLongLong mLastScrubTimeMillis{ ::wxGetLocalTimeMillis() }; Clock::time_point mLastScrubTime { Clock::now() };
struct Message { struct Message {
Message() = default; Message() = default;
Message(const Message&) = default; Message(const Message&) = default;