SampleBuffer: always sanitize start and end frame settings
An end frame variable always has to be greater than a start frame in order to prevent crashes due to negative frame counts being calculated in getSampleFragment() otherwise. Closes #629.
This commit is contained in:
@@ -22,9 +22,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _SAMPLE_BUFFER_H
|
||||
#define _SAMPLE_BUFFER_H
|
||||
#ifndef SAMPLE_BUFFER_H
|
||||
#define SAMPLE_BUFFER_H
|
||||
|
||||
#include <QtCore/QMutex>
|
||||
#include <QtCore/QObject>
|
||||
@@ -99,29 +98,18 @@ public:
|
||||
return m_audioFile;
|
||||
}
|
||||
|
||||
inline f_cnt_t startFrame() const
|
||||
f_cnt_t startFrame() const
|
||||
{
|
||||
return m_startFrame;
|
||||
}
|
||||
|
||||
inline f_cnt_t endFrame() const
|
||||
f_cnt_t endFrame() const
|
||||
{
|
||||
return m_endFrame;
|
||||
}
|
||||
|
||||
void setLoopStartFrame( f_cnt_t _start )
|
||||
{
|
||||
m_varLock.lock();
|
||||
m_loopStartFrame = _start;
|
||||
m_varLock.unlock();
|
||||
}
|
||||
|
||||
void setLoopEndFrame( f_cnt_t _end )
|
||||
{
|
||||
m_varLock.lock();
|
||||
m_loopEndFrame = _end;
|
||||
m_varLock.unlock();
|
||||
}
|
||||
void setLoopStartFrame( f_cnt_t start );
|
||||
void setLoopEndFrame( f_cnt_t end );
|
||||
|
||||
inline f_cnt_t frames() const
|
||||
{
|
||||
@@ -223,13 +211,16 @@ public:
|
||||
public slots:
|
||||
void setAudioFile( const QString & _audio_file );
|
||||
void loadFromBase64( const QString & _data );
|
||||
void setStartFrame( const f_cnt_t _s );
|
||||
void setEndFrame( const f_cnt_t _e );
|
||||
void setStartFrame( f_cnt_t start );
|
||||
void setEndFrame( f_cnt_t end );
|
||||
void setAmplification( float _a );
|
||||
void setReversed( bool _on );
|
||||
|
||||
|
||||
private:
|
||||
/*! Ensures that all settings are sane like end frame > start frame etc. */
|
||||
void sanitizeSettings();
|
||||
|
||||
void update( bool _keep_settings = false );
|
||||
|
||||
void convertIntToFloat ( int_sample_t * & _ibuf, f_cnt_t _frames, int _channels);
|
||||
@@ -273,5 +264,4 @@ signals:
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -154,6 +154,25 @@ SampleBuffer::~SampleBuffer()
|
||||
|
||||
|
||||
|
||||
void SampleBuffer::sanitizeSettings()
|
||||
{
|
||||
m_varLock.lock();
|
||||
|
||||
if( m_startFrame >= m_endFrame )
|
||||
{
|
||||
m_endFrame = m_startFrame+1;
|
||||
}
|
||||
|
||||
if( m_loopStartFrame >= m_loopEndFrame )
|
||||
{
|
||||
m_loopEndFrame = m_loopStartFrame+1;
|
||||
}
|
||||
|
||||
m_varLock.unlock();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void SampleBuffer::update( bool _keep_settings )
|
||||
{
|
||||
@@ -828,6 +847,27 @@ void SampleBuffer::visualize( QPainter & _p, const QRect & _dr,
|
||||
|
||||
|
||||
|
||||
void SampleBuffer::setLoopStartFrame( f_cnt_t start )
|
||||
{
|
||||
m_varLock.lock();
|
||||
m_loopStartFrame = start;
|
||||
m_varLock.unlock();
|
||||
|
||||
sanitizeSettings();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SampleBuffer::setLoopEndFrame( f_cnt_t end )
|
||||
{
|
||||
m_varLock.lock();
|
||||
m_loopEndFrame = end;
|
||||
m_varLock.unlock();
|
||||
|
||||
sanitizeSettings();
|
||||
}
|
||||
|
||||
|
||||
|
||||
QString SampleBuffer::openAudioFile() const
|
||||
{
|
||||
@@ -1240,21 +1280,25 @@ void SampleBuffer::loadFromBase64( const QString & _data )
|
||||
|
||||
|
||||
|
||||
void SampleBuffer::setStartFrame( const f_cnt_t _s )
|
||||
void SampleBuffer::setStartFrame( f_cnt_t start )
|
||||
{
|
||||
m_varLock.lock();
|
||||
m_loopStartFrame = m_startFrame = _s;
|
||||
m_loopStartFrame = m_startFrame = start;
|
||||
m_varLock.unlock();
|
||||
|
||||
sanitizeSettings();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void SampleBuffer::setEndFrame( const f_cnt_t _e )
|
||||
void SampleBuffer::setEndFrame( f_cnt_t end )
|
||||
{
|
||||
m_varLock.lock();
|
||||
m_loopEndFrame = m_endFrame = _e;
|
||||
m_loopEndFrame = m_endFrame = end;
|
||||
m_varLock.unlock();
|
||||
|
||||
sanitizeSettings();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user