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:
Tobias Doerffel
2014-04-30 11:31:32 +02:00
parent e9073c88bc
commit 09fb597af4
2 changed files with 59 additions and 25 deletions

View File

@@ -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

View File

@@ -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();
}