17 double trackEndTime,
double loopEndTime,
18 bool loopEnabled,
bool variableSpeed )
20 , mTrackEndTime{ trackEndTime }
21 , mLoopEndTime{ loopEndTime }
22 , mLoopEnabled{ loopEnabled }
23 , mVariableSpeed{ variableSpeed }
58 using namespace std::chrono;
59 return { 0.05s, 0.05s, 0.25s };
89 auto frames = available;
90 auto toProduce = frames;
93 if (deltat > realTimeRemaining) {
95 auto realTime = realTimeRemaining;
100 const double extraRealTime =
102 extra =
std::min( extraRealTime, deltat - realTimeRemaining );
116 frames = available, toProduce = 0;
118 return { available, frames, toProduce };
131 return { schedule.
mT1, schedule.
mT0 };
134 if ( fabs(schedule.
mT0 - schedule.
mT1) < 1e-9 )
135 return {schedule.
mT0, schedule.
mT0};
139 realDuration *= -1.0;
145 trackTime += realDuration;
147 return { trackTime, trackTime };
152 size_t frames,
size_t available )
157 bool speedChange =
false;
163 bool empty = (data.mT0 >= data.mT1);
168 constexpr auto allowance = 0.5;
184 auto theirs = std::tie(data.mT0, data.mT1);
190 schedule.
mT1 = data.mT1;
201 newTime = std::clamp(newTime, schedule.
mT0, schedule.
mT1);
205 newTime = schedule.
mT0;
214 else if (speedChange)
230 for (
auto &pMixer : playbackMixers)
231 pMixer->SetTimesAndSpeed(
239 for (
auto &pMixer : playbackMixers) {
242 pMixer->Reposition(time,
true);
257 region.GetStart(), region.GetEnd(), region.Active()
constexpr size_t TimeQueueGrainSize
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
PlaybackSlice GetPlaybackSlice(PlaybackSchedule &schedule, size_t available) override
Choose length of one fetch of samples from tracks in a call to AudioIO::FillPlayBuffers.
BufferTimes SuggestedBufferTimes(PlaybackSchedule &schedule) override
Provide hints for construction of playback RingBuffer objects.
bool RepositionPlayback(PlaybackSchedule &schedule, const Mixers &playbackMixers, size_t frames, size_t available) override
AudioIO::FillPlayBuffers calls this to update its cursors into tracks for changes of position or spee...
const double mTrackEndTime
void Initialize(PlaybackSchedule &schedule, double rate) override
Called before starting an audio stream.
MessageBuffer< SlotData > mMessageChannel
Observer::Subscription mSpeedSubscription
bool RevertToOldDefault(const PlaybackSchedule &schedule) const
Mixer::WarpOptions MixerWarpOptions(PlaybackSchedule &schedule) override
Options to use when constructing mixers for each playback track.
AudacityProject & mProject
~DefaultPlaybackPolicy() override
std::pair< double, double > AdvancedTrackTime(PlaybackSchedule &schedule, double trackTime, size_t nSamples) override
Compute a new point in a track's timeline from an old point and a real duration.
Observer::Subscription mRegionSubscription
bool Looping(const PlaybackSchedule &) const override
DefaultPlaybackPolicy(AudacityProject &project, double trackEndTime, double loopEndTime, bool loopEnabled, bool variableSpeed)
bool Done(PlaybackSchedule &schedule, unsigned long) override
Returns true if schedule.GetSequenceTime() has reached the end of playback.
MixerOptions::Warp WarpOptions
Subscription Subscribe(Callback callback)
Connect a callback to the Publisher; later-connected are called earlier.
virtual std::pair< double, double > AdvancedTrackTime(PlaybackSchedule &schedule, double trackTime, size_t nSamples)
Compute a new point in a track's timeline from an old point and a real duration.
std::vector< std::unique_ptr< Mixer > > Mixers
virtual Mixer::WarpOptions MixerWarpOptions(PlaybackSchedule &schedule)
Options to use when constructing mixers for each playback track.
virtual void Initialize(PlaybackSchedule &schedule, double rate)
Called before starting an audio stream.
virtual bool RepositionPlayback(PlaybackSchedule &schedule, const Mixers &playbackMixers, size_t frames, size_t available)
AudioIO::FillPlayBuffers calls this to update its cursors into tracks for changes of position or spee...
double GetLastTime() const
Return the last time saved by Producer.
void SetLastTime(double time)
double GetPlaySpeed() const
static ProjectAudioIO & Get(AudacityProject &project)
static ViewInfo & Get(AudacityProject &project)
Positions or offsets within audio files need a wide type.
Immutable structure is an argument to Mixer's constructor.
double RealTimeRemaining() const
double mT0
Playback starts at offset of mT0, which is measured in seconds.
double mT1
Playback ends at offset of mT1, which is measured in seconds. Note that mT1 may be less than mT0 duri...
double SolveWarpedLength(double t0, double length) const
Compute how much unwarped time must have elapsed if length seconds of warped time has elapsed,...
bool ReversedTime() const
True if the end time is before the start time.
const BoundedEnvelope * mEnvelope
double RealDuration(double trackTime1) const
void RealTimeInit(double trackTime)
void RealTimeAdvance(double increment)
class AUDIO_IO_API PlaybackSchedule::TimeQueue mTimeQueue
double GetSequenceTime() const
Get current track time value, unadjusted.
Describes an amount of contiguous (but maybe time-warped) data to be extracted from tracks to play.