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:
parent
919571e79f
commit
d050afb658
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user