Audacity  3.0.3
Public Member Functions | Private Attributes | List of all members
LoopingPlaybackPolicy Class Referencefinal

#include <PlaybackSchedule.h>

Inheritance diagram for LoopingPlaybackPolicy:
[legend]
Collaboration diagram for LoopingPlaybackPolicy:
[legend]

Public Member Functions

 ~LoopingPlaybackPolicy () override
 
BufferTimes SuggestedBufferTimes (PlaybackSchedule &schedule) override
 Provide hints for construction of playback RingBuffer objects. More...
 
bool Done (PlaybackSchedule &schedule, unsigned long) override
 Returns true if schedule.GetTrackTime() has reached the end of playback. More...
 
PlaybackSlice GetPlaybackSlice (PlaybackSchedule &schedule, size_t available) override
 Choose length of one fetch of samples from tracks in a call to AudioIO::FillPlayBuffers. More...
 
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. More...
 
void MessageConsumer (PlaybackSchedule &schedule) override
 May be called between AdvancedTrackTime() and RepositionPlayback() More...
 
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 speed. More...
 
bool Looping (const PlaybackSchedule &) const override
 
- Public Member Functions inherited from PlaybackPolicy
virtual ~PlaybackPolicy ()=0
 
virtual void Initialize (PlaybackSchedule &schedule, double rate)
 Called before starting an audio stream. More...
 
virtual void Finalize (PlaybackSchedule &schedule)
 Called after stopping of an audio stream or an unsuccessful start. More...
 
virtual Mixer::WarpOptions MixerWarpOptions (PlaybackSchedule &schedule)
 Options to use when constructing mixers for each playback track. More...
 
virtual bool AllowSeek (PlaybackSchedule &schedule)
 Whether repositioning commands are allowed during playback. More...
 
virtual double OffsetTrackTime (PlaybackSchedule &schedule, double offset)
 Called when the play head needs to jump a certain distance. More...
 
virtual std::chrono::milliseconds SleepInterval (PlaybackSchedule &schedule)
 How long to wait between calls to AudioIO::TrackBufferExchange. More...
 

Private Attributes

size_t mRemaining { 0 }
 
bool mProgress { true }
 
bool mKicked { false }
 

Additional Inherited Members

- Public Types inherited from PlaybackPolicy
using Mixers = std::vector< std::unique_ptr< Mixer > >
 
- Protected Attributes inherited from PlaybackPolicy
double mRate = 0
 

Detailed Description

Definition at line 451 of file PlaybackSchedule.h.

Constructor & Destructor Documentation

◆ ~LoopingPlaybackPolicy()

LoopingPlaybackPolicy::~LoopingPlaybackPolicy ( )
overridedefault

Member Function Documentation

◆ AdvancedTrackTime()

std::pair< double, double > LoopingPlaybackPolicy::AdvancedTrackTime ( PlaybackSchedule schedule,
double  trackTime,
size_t  nSamples 
)
overridevirtual

Compute a new point in a track's timeline from an old point and a real duration.

Needed because playback might be at non-unit speed.

Called one or more times between GetPlaybackSlice and RepositionPlayback, until the sum of the nSamples values equals the most recent playback slice (including any trailing silence).

Returns
a pair, which indicates a discontinuous jump when its members are not equal, or specially the end of playback when the second member is infinite

Reimplemented from PlaybackPolicy.

Definition at line 195 of file PlaybackSchedule.cpp.

197 {
198  mRemaining -= std::min(mRemaining, nSamples);
199  if ( mRemaining == 0 )
200  // Wrap to start
201  return { schedule.mT1, schedule.mT0 };
202 
203  // Defense against cases that might cause loops not to terminate
204  if ( fabs(schedule.mT0 - schedule.mT1) < 1e-9 )
205  return {schedule.mT0, schedule.mT0};
206 
207  auto realDuration = nSamples / mRate;
208  if (schedule.ReversedTime())
209  realDuration *= -1.0;
210 
211  if (schedule.mEnvelope)
212  trackTime =
213  schedule.SolveWarpedLength(trackTime, realDuration);
214  else
215  trackTime += realDuration;
216 
217  return { trackTime, trackTime };
218 }

References PlaybackSchedule::mEnvelope, min(), PlaybackPolicy::mRate, PlaybackSchedule::mT0, PlaybackSchedule::mT1, PlaybackSchedule::ReversedTime(), and PlaybackSchedule::SolveWarpedLength().

Here is the call graph for this function:

◆ Done()

bool LoopingPlaybackPolicy::Done ( PlaybackSchedule schedule,
unsigned long  outputFrames 
)
overridevirtual

Returns true if schedule.GetTrackTime() has reached the end of playback.

Parameters
outputFrameshow many playback frames were taken from RingBuffers

Reimplemented from PlaybackPolicy.

Definition at line 160 of file PlaybackSchedule.cpp.

161 {
162  return false;
163 }

◆ GetPlaybackSlice()

PlaybackSlice LoopingPlaybackPolicy::GetPlaybackSlice ( PlaybackSchedule schedule,
size_t  available 
)
overridevirtual

Choose length of one fetch of samples from tracks in a call to AudioIO::FillPlayBuffers.

Parameters
availableupper bound for the length of the fetch

Reimplemented from PlaybackPolicy.

Definition at line 166 of file PlaybackSchedule.cpp.

168 {
169  // How many samples to produce for each channel.
170  const auto realTimeRemaining = std::max(0.0, schedule.RealTimeRemaining());
171  auto frames = available;
172  auto toProduce = frames;
173  double deltat = frames / mRate;
174 
175  mRemaining = realTimeRemaining * mRate;
176  if (deltat > realTimeRemaining)
177  {
178  toProduce = frames = mRemaining;
179  schedule.RealTimeAdvance( realTimeRemaining );
180  }
181  else
182  schedule.RealTimeAdvance( deltat );
183 
184  // Don't fall into an infinite loop, if loop-playing a selection
185  // that is so short, it has no samples: detect that case
186  if (frames == 0) {
187  bool progress = (schedule.mWarpedTime != 0.0);
188  if (!progress)
189  // Cause FillPlayBuffers to make progress, filling all available with 0
190  frames = available, toProduce = 0;
191  }
192  return { available, frames, toProduce };
193 }

References PlaybackPolicy::mRate, PlaybackSchedule::mWarpedTime, PlaybackSchedule::RealTimeAdvance(), and PlaybackSchedule::RealTimeRemaining().

Here is the call graph for this function:

◆ Looping()

bool LoopingPlaybackPolicy::Looping ( const PlaybackSchedule schedule) const
overridevirtual

be removed

Reimplemented from PlaybackPolicy.

Definition at line 273 of file PlaybackSchedule.cpp.

274 {
275  return true;
276 }

◆ MessageConsumer()

void LoopingPlaybackPolicy::MessageConsumer ( PlaybackSchedule schedule)
overridevirtual

May be called between AdvancedTrackTime() and RepositionPlayback()

Receive notifications from the main thread of changes of parameters affecting the policy

Default implementation ignores all messages

Reimplemented from PlaybackPolicy.

Definition at line 220 of file PlaybackSchedule.cpp.

221 {
222  // This executes in the TrackBufferExchange thread
223  auto data = schedule.mMessageChannel.Read();
224  if (data.mT0 >= data.mT1)
225  // Ignore empty region
226  return;
227 
228  auto mine = std::tie(schedule.mT0, schedule.mT1);
229  auto theirs = std::tie(data.mT0, data.mT1);
230  if (mine != theirs) {
231  mine = theirs;
232  schedule.mWarpedLength = schedule.RealDuration(schedule.mT1);
233  auto newTime = std::clamp(
234  schedule.mTimeQueue.GetLastTime(), schedule.mT0, schedule.mT1);
235  if (newTime == schedule.mT1)
236  newTime = schedule.mT0;
237 
238  // So that the play head will redraw in the right place:
239  schedule.mTimeQueue.SetLastTime(newTime);
240 
241  // Setup for the next visit to RepositionPlayback:
242  schedule.RealTimeInit(newTime);
243  const auto realTimeRemaining = std::max(0.0, schedule.RealTimeRemaining());
244  mRemaining = realTimeRemaining * mRate;
245  mKicked = true;
246  }
247 }

References PlaybackSchedule::TimeQueue::GetLastTime(), PlaybackSchedule::mMessageChannel, PlaybackPolicy::mRate, PlaybackSchedule::mT0, PlaybackSchedule::mT1, PlaybackSchedule::mTimeQueue, PlaybackSchedule::mWarpedLength, PlaybackSchedule::RealDuration(), PlaybackSchedule::RealTimeInit(), PlaybackSchedule::RealTimeRemaining(), and PlaybackSchedule::TimeQueue::SetLastTime().

Here is the call graph for this function:

◆ RepositionPlayback()

bool LoopingPlaybackPolicy::RepositionPlayback ( PlaybackSchedule schedule,
const Mixers playbackMixers,
size_t  frames,
size_t  available 
)
overridevirtual

AudioIO::FillPlayBuffers calls this to update its cursors into tracks for changes of position or speed.

Returns
if true, AudioIO::FillPlayBuffers stops producing samples even if space remains
Parameters
frameshow many samples were just now buffered for play
availablehow many more samples may be buffered

Reimplemented from PlaybackPolicy.

Definition at line 249 of file PlaybackSchedule.cpp.

251 {
252  // msmeyer: If playing looped, check if we are at the end of the buffer
253  // and if yes, restart from the beginning.
254  if (mRemaining <= 0)
255  {
256  for (auto &pMixer : playbackMixers)
257  pMixer->SetTimesAndSpeed( schedule.mT0, schedule.mT1, 1.0, mKicked );
258  schedule.RealTimeRestart();
259  }
260  else if (mKicked)
261  {
262  const auto time = schedule.mTimeQueue.GetLastTime();
263  for (auto &pMixer : playbackMixers) {
264  // So that the mixer will fetch the next samples from the right place:
265  pMixer->SetTimesAndSpeed( schedule.mT0, schedule.mT1, 1.0 );
266  pMixer->Reposition(time, true);
267  }
268  }
269  mKicked = false; // Ow! Stop it! Mo-o-o-om!
270  return false;
271 }

References PlaybackSchedule::TimeQueue::GetLastTime(), PlaybackSchedule::mT0, PlaybackSchedule::mT1, PlaybackSchedule::mTimeQueue, and PlaybackSchedule::RealTimeRestart().

Here is the call graph for this function:

◆ SuggestedBufferTimes()

PlaybackPolicy::BufferTimes LoopingPlaybackPolicy::SuggestedBufferTimes ( PlaybackSchedule schedule)
overridevirtual

Provide hints for construction of playback RingBuffer objects.

Reimplemented from PlaybackPolicy.

Definition at line 153 of file PlaybackSchedule.cpp.

154 {
155  // Shorter times than in the default policy so that responses to changes of
156  // selection don't lag too much
157  return { 0.5, 0.5, 1.0 };
158 }

Member Data Documentation

◆ mKicked

bool LoopingPlaybackPolicy::mKicked { false }
private

Definition at line 476 of file PlaybackSchedule.h.

◆ mProgress

bool LoopingPlaybackPolicy::mProgress { true }
private

Definition at line 475 of file PlaybackSchedule.h.

◆ mRemaining

size_t LoopingPlaybackPolicy::mRemaining { 0 }
private

Definition at line 474 of file PlaybackSchedule.h.


The documentation for this class was generated from the following files:
PlaybackSchedule::TimeQueue::SetLastTime
void SetLastTime(double time)
Definition: PlaybackSchedule.cpp:443
PlaybackSchedule::mT1
double mT1
Playback ends at offset of mT1, which is measured in seconds. Note that mT1 may be less than mT0 duri...
Definition: PlaybackSchedule.h:273
PlaybackSchedule::mT0
double mT0
Playback starts at offset of mT0, which is measured in seconds.
Definition: PlaybackSchedule.h:271
PlaybackSchedule::mWarpedTime
double mWarpedTime
Definition: PlaybackSchedule.h:283
PlaybackSchedule::mMessageChannel
MessageBuffer< SlotData > mMessageChannel
Definition: PlaybackSchedule.h:372
PlaybackSchedule::mTimeQueue
class PlaybackSchedule::TimeQueue mTimeQueue
PlaybackSchedule::ReversedTime
bool ReversedTime() const
True if the end time is before the start time.
Definition: PlaybackSchedule.h:402
min
int min(int a, int b)
Definition: CompareAudioCommand.cpp:106
PlaybackSchedule::RealTimeAdvance
void RealTimeAdvance(double increment)
Definition: PlaybackSchedule.cpp:354
PlaybackSchedule::TimeQueue::GetLastTime
double GetLastTime() const
Return the last time saved by Producer.
Definition: PlaybackSchedule.cpp:438
PlaybackSchedule::RealTimeInit
void RealTimeInit(double trackTime)
Definition: PlaybackSchedule.cpp:359
PlaybackSchedule::mWarpedLength
double mWarpedLength
Definition: PlaybackSchedule.h:288
LoopingPlaybackPolicy::mRemaining
size_t mRemaining
Definition: PlaybackSchedule.h:474
PlaybackPolicy::mRate
double mRate
Definition: PlaybackSchedule.h:265
PlaybackSchedule::SolveWarpedLength
double SolveWarpedLength(double t0, double length) const
Compute how much unwarped time must have elapsed if length seconds of warped time has elapsed,...
Definition: PlaybackSchedule.cpp:336
LoopingPlaybackPolicy::mKicked
bool mKicked
Definition: PlaybackSchedule.h:476
PlaybackSchedule::mEnvelope
const BoundedEnvelope * mEnvelope
Definition: PlaybackSchedule.h:298
PlaybackSchedule::RealTimeRestart
void RealTimeRestart()
Definition: PlaybackSchedule.cpp:364
PlaybackSchedule::RealTimeRemaining
double RealTimeRemaining() const
Definition: PlaybackSchedule.cpp:349
PlaybackSchedule::RealDuration
double RealDuration(double trackTime1) const
Definition: PlaybackSchedule.cpp:344