Added pause playback feature with fades for smoothing

This commit is contained in:
xenakios
2017-12-14 22:17:45 +02:00
parent 6ad663da47
commit dc86913533
4 changed files with 51 additions and 4 deletions

View File

@ -164,6 +164,11 @@ void StretchAudioSource::setLoopXFadeLength(double lenseconds)
void StretchAudioSource::getNextAudioBlock(const AudioSourceChannelInfo & bufferToFill)
{
ScopedLock locker(m_cs);
if (m_pause_state == 2)
{
bufferToFill.buffer->clear(bufferToFill.startSample,bufferToFill.numSamples);
return;
}
if (m_stretchoutringbuf.available() > 0)
m_output_has_begun = true;
bool freezing = m_freezing;
@ -341,8 +346,17 @@ void StretchAudioSource::getNextAudioBlock(const AudioSourceChannelInfo & buffer
}
}
//if (m_inputfile->hasEnded())
m_output_counter += bufferToFill.numSamples;
if (m_pause_state == 1)
{
bufferToFill.buffer->applyGainRamp(bufferToFill.startSample, bufferToFill.numSamples, 1.0f, 0.0f);
m_pause_state = 2;
}
if (m_pause_state == 3)
{
bufferToFill.buffer->applyGainRamp(bufferToFill.startSample, bufferToFill.numSamples, 0.0f, 1.0f);
m_pause_state = 0;
}
m_output_counter += bufferToFill.numSamples;
}
void StretchAudioSource::setNextReadPosition(int64 /*newPosition*/)
@ -538,6 +552,30 @@ void StretchAudioSource::setFFTSize(int size)
}
}
void StretchAudioSource::setPaused(bool b)
{
if (b == true && m_pause_state>0)
return;
if (b == false && m_pause_state == 0)
return;
ScopedLock locker(m_cs);
if (b == true && m_pause_state == 0)
{
m_pause_state = 1;
return;
}
if (b == false && m_pause_state == 2)
{
m_pause_state = 3;
return;
}
}
bool StretchAudioSource::isPaused() const
{
return m_pause_state > 0;
}
void StretchAudioSource::seekPercent(double pos)
{
ScopedLock locker(m_cs);

View File

@ -69,6 +69,9 @@ public:
void setFreezing(bool b) { m_freezing = b; }
bool isFreezing() { return m_freezing; }
void setPaused(bool b);
bool isPaused() const;
void seekPercent(double pos);
double getOutputDurationSecondsForRange(Range<double> range, int fftsize);
@ -122,6 +125,8 @@ private:
double m_seekpos = 0.0;
bool m_freezing = false;
int m_pause_state = 0;
Range<double> m_playrange{ 0.0,1.0 };
bool m_stream_end_reached = false;
@ -148,6 +153,7 @@ private:
int requested_fft_size = 0;
File requested_file;
} m_xfadetask;
int m_pause_fade_counter = 0;
};
class MultiStretchAudioSource final : public PositionableAudioSource