aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/wavpack
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-09-21 11:52:18 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-09-21 11:52:18 +0000
commita126a37b7325604710a28c84fdd79a70bf0faa8b (patch)
tree14d2a2fdaa3e96531ba131bd7fb61c6faa095b70 /src/plugins/Input/wavpack
parent668e1355e513e77f2398052ba8ea8ce61d7e1861 (diff)
downloadqmmp-a126a37b7325604710a28c84fdd79a70bf0faa8b.tar.gz
qmmp-a126a37b7325604710a28c84fdd79a70bf0faa8b.tar.bz2
qmmp-a126a37b7325604710a28c84fdd79a70bf0faa8b.zip
wavpack plugin: optimization, fixed memory leak
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@5573 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/wavpack')
-rw-r--r--src/plugins/Input/wavpack/decoder_wavpack.cpp83
-rw-r--r--src/plugins/Input/wavpack/decoder_wavpack.h10
2 files changed, 25 insertions, 68 deletions
diff --git a/src/plugins/Input/wavpack/decoder_wavpack.cpp b/src/plugins/Input/wavpack/decoder_wavpack.cpp
index 7d870cbe1..9f04e830c 100644
--- a/src/plugins/Input/wavpack/decoder_wavpack.cpp
+++ b/src/plugins/Input/wavpack/decoder_wavpack.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2014 by Ilya Kotov *
+ * Copyright (C) 2008-2015 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -18,7 +18,6 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
-
#include <QObject>
#include <QIODevice>
#include <QFile>
@@ -40,14 +39,12 @@ DecoderWavPack::DecoderWavPack(const QString &path)
m_totalTime = 0.0;
m_chan = 0;
m_context = 0;
- m_freq = 0;
m_parser = 0;
m_output_buf = 0;
m_parser = 0;
- length_in_bytes = 0;
+ m_length_in_bytes = 0;
m_totalBytes = 0;
- m_sz = 0;
- m_buf = 0;
+ m_frame_size = 0;
m_offset = 0;
m_bps = 0;
}
@@ -106,7 +103,7 @@ bool DecoderWavPack::initialize()
}
m_chan = WavpackGetNumChannels(m_context);
- m_freq = WavpackGetSampleRate (m_context);
+ uint32_t freq = WavpackGetSampleRate (m_context);
m_bps = WavpackGetBitsPerSample (m_context);
ChannelMap chmap = findChannelMap(m_chan);
@@ -121,29 +118,29 @@ bool DecoderWavPack::initialize()
switch(m_bps)
{
case 8:
- configure(m_freq, chmap, Qmmp::PCM_S8);
+ configure(freq, chmap, Qmmp::PCM_S8);
break;
case 16:
- configure(m_freq, chmap, Qmmp::PCM_S16LE);
+ configure(freq, chmap, Qmmp::PCM_S16LE);
break;
case 24:
case 32:
- configure(m_freq, chmap, Qmmp::PCM_S32LE);
+ configure(freq, chmap, Qmmp::PCM_S32LE);
}
if(!m_parser)
- m_totalTime = (qint64) WavpackGetNumSamples(m_context) * 1000 / m_freq;
+ m_totalTime = (qint64) WavpackGetNumSamples(m_context) * 1000 / freq;
else
{
m_length = m_parser->length(m_track);
m_offset = m_parser->offset(m_track);
- length_in_bytes = audioParameters().sampleRate() *
+ m_length_in_bytes = audioParameters().sampleRate() *
audioParameters().channels() *
audioParameters().sampleSize() * m_length/1000;
setReplayGainInfo(m_parser->replayGain(m_track));
seek(0);
}
m_totalBytes = 0;
- m_sz = audioParameters().sampleSize() * audioParameters().channels();
+ m_frame_size = audioParameters().sampleSize() * audioParameters().channels();
qDebug("DecoderWavPack: initialize succes");
return true;
}
@@ -165,16 +162,12 @@ qint64 DecoderWavPack::totalTime()
void DecoderWavPack::deinit()
{
m_chan = 0;
- m_freq = 0;
if (m_context)
WavpackCloseFile (m_context);
m_context = 0;
if(m_parser)
delete m_parser;
m_parser = 0;
- if(m_buf)
- delete m_buf;
- m_buf = 0;
}
void DecoderWavPack::seek(qint64 time)
@@ -184,53 +177,21 @@ void DecoderWavPack::seek(qint64 time)
audioParameters().sampleSize() * time/1000;
if(m_parser)
time += m_offset;
- WavpackSeekSample (m_context, time * m_freq / 1000);
+ WavpackSeekSample (m_context, time * audioParameters().sampleRate() / 1000);
}
qint64 DecoderWavPack::read(char *data, qint64 size)
{
if(m_parser)
{
- if(length_in_bytes - m_totalBytes < m_sz) //end of cue track
- return 0;
-
- qint64 len = 0;
-
- if(m_buf) //read remaining data first
- {
- len = qMin(m_buf_size, size);
- memmove(data, m_buf, len);
- if(size >= m_buf_size)
- {
- delete[] m_buf;
- m_buf = 0;
- m_buf_size = 0;
- }
- else
- memmove(m_buf, m_buf + len, size - len);
- }
- else
- len = wavpack_decode (data, size);
-
- if(len <= 0) //end of file
+ if(m_length_in_bytes - m_totalBytes < m_frame_size) //end of cue track
return 0;
- if(len + m_totalBytes <= length_in_bytes)
- {
- m_totalBytes += len;
- return len;
- }
-
- qint64 len2 = qMax(qint64(0), length_in_bytes - m_totalBytes);
- len2 = (len2 / m_sz) * m_sz; //returned size must contain integer number of samples
- m_totalBytes += len2;
- //save data of the next track
- if(m_buf)
- delete[] m_buf;
- m_buf_size = len - len2;
- m_buf = new char[m_buf_size];
- memmove(m_buf, data + len2, m_buf_size);
- return len2;
+ //returned size must contain integer number of frames
+ size = qMin(size, (m_length_in_bytes - m_totalBytes) / m_frame_size * m_frame_size);
+ size = wavpack_decode(data, size);
+ m_totalBytes += size;
+ return size;
}
return wavpack_decode(data, size);
}
@@ -250,7 +211,7 @@ void DecoderWavPack::next()
m_track++;
m_offset = m_parser->length(m_track);
m_length = m_parser->length(m_track);
- length_in_bytes = audioParameters().sampleRate() *
+ m_length_in_bytes = audioParameters().sampleRate() *
audioParameters().channels() *
audioParameters().sampleSize() * m_length/1000;
addMetaData(m_parser->info(m_track)->metaData());
@@ -273,19 +234,19 @@ qint64 DecoderWavPack::wavpack_decode(char *data, qint64 size)
case 8:
for (i = 0; i < len * m_chan; ++i)
data8[i] = m_output_buf[i];
- return len * m_chan;
+ return len * m_chan;
case 16:
for (i = 0; i < len * m_chan; ++i)
data16[i] = m_output_buf[i];
- return len * m_chan * 2;
+ return len * m_chan * 2;
case 24:
for (i = 0; i < len * m_chan; ++i)
data32[i] = m_output_buf[i] << 8;
- return len * m_chan * 4;
+ return len * m_chan * 4;
case 32:
for (i = 0; i < len * m_chan; ++i)
data32[i] = m_output_buf[i];
- return len * m_chan * 4;
+ return len * m_chan * 4;
}
return 0;
}
diff --git a/src/plugins/Input/wavpack/decoder_wavpack.h b/src/plugins/Input/wavpack/decoder_wavpack.h
index fcae8c298..1eddee0db 100644
--- a/src/plugins/Input/wavpack/decoder_wavpack.h
+++ b/src/plugins/Input/wavpack/decoder_wavpack.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2014 by Ilya Kotov *
+ * Copyright (C) 2008-2015 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -51,9 +51,8 @@ private:
WavpackContext *m_context;
int32_t *m_output_buf; // output buffer
int m_chan;
- quint32 m_freq;
qint64 m_totalTime;
- qint64 length_in_bytes;
+ qint64 m_length_in_bytes;
qint64 m_totalBytes;
qint64 m_offset;
qint64 m_length;
@@ -61,10 +60,7 @@ private:
CUEParser *m_parser;
int m_track;
int m_bps;
- char *m_buf; //buffer for remainig data
- qint64 m_buf_size;
- qint64 m_sz; //sample size
-
+ qint64 m_frame_size; //frame size
};
#endif // DECODER_WAVPACK_H