aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/cue/decoder_cue.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-09-20 14:26:40 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-09-20 14:26:40 +0000
commit5b5f8803d3d95d65699dad5b1e02015683e39c08 (patch)
treeec60e6b2038acee028b71a2a0b423cea936364d2 /src/plugins/Input/cue/decoder_cue.cpp
parentb6ba1017f793b83e099c863fa7c42745361ffef9 (diff)
downloadqmmp-5b5f8803d3d95d65699dad5b1e02015683e39c08.tar.gz
qmmp-5b5f8803d3d95d65699dad5b1e02015683e39c08.tar.bz2
qmmp-5b5f8803d3d95d65699dad5b1e02015683e39c08.zip
removed noise between cue tracks
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1237 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/cue/decoder_cue.cpp')
-rw-r--r--src/plugins/Input/cue/decoder_cue.cpp97
1 files changed, 80 insertions, 17 deletions
diff --git a/src/plugins/Input/cue/decoder_cue.cpp b/src/plugins/Input/cue/decoder_cue.cpp
index cf06438e9..ec2349bac 100644
--- a/src/plugins/Input/cue/decoder_cue.cpp
+++ b/src/plugins/Input/cue/decoder_cue.cpp
@@ -37,6 +37,9 @@ DecoderCUE::DecoderCUE(const QString &url)
{
m_path = url;
m_decoder = 0;
+ m_parser = 0;
+ m_track = 0;
+ m_buf = 0;
}
DecoderCUE::~DecoderCUE()
@@ -44,6 +47,12 @@ DecoderCUE::~DecoderCUE()
if(m_decoder)
delete m_decoder;
m_decoder = 0;
+ if(m_parser)
+ delete m_parser;
+ m_parser = 0;
+ if(m_buf)
+ delete [] m_buf;
+ m_buf = 0;
}
bool DecoderCUE::initialize()
@@ -51,14 +60,14 @@ bool DecoderCUE::initialize()
QString p = QUrl(m_path).path();
p.replace(QString(QUrl::toPercentEncoding("#")), "#");
p.replace(QString(QUrl::toPercentEncoding("%")), "%");
- CUEParser parser(p);
- if (parser.count() == 0)
+ m_parser = new CUEParser(p);
+ if (m_parser->count() == 0)
{
qWarning("DecoderCUE: invalid cue file");
return FALSE;
}
- int track = m_path.section("#", -1).toInt();
- m_path = parser.filePath(track);
+ m_track = m_path.section("#", -1).toInt();
+ m_path = m_parser->filePath(m_track);
if (!QFile::exists(m_path))
{
qWarning("DecoderCUE: file \"%s\" doesn't exist", qPrintable(m_path));
@@ -70,8 +79,8 @@ bool DecoderCUE::initialize()
qWarning("DecoderCUE: unsupported file format");
return FALSE;
}
- m_length = parser.length(track);
- m_offset = parser.offset(track);
+ m_length = m_parser->length(m_track);
+ m_offset = m_parser->offset(m_track);
m_decoder = df->create(m_path, new QFile(m_path));
if(!m_decoder->initialize())
@@ -84,12 +93,14 @@ bool DecoderCUE::initialize()
configure(m_decoder->audioParameters().sampleRate(),
m_decoder->audioParameters().channels(),
m_decoder->audioParameters().bits());
- offset_in_bytes = audioParameters().sampleRate() *
+ length_in_bytes = audioParameters().sampleRate() *
audioParameters().channels() *
audioParameters().bits() * m_length/8000;
m_totalBytes = 0;
- StateHandler::instance()->dispatch(parser.info(track)->metaData());
+ m_sz = audioParameters().bits() * audioParameters().channels()/8;
+
+ StateHandler::instance()->dispatch(m_parser->info(m_track)->metaData());
return TRUE;
}
@@ -108,20 +119,72 @@ void DecoderCUE::seek(qint64 pos)
qint64 DecoderCUE::read(char *data, qint64 size)
{
- qint64 len = m_decoder->read(data, size);
- m_totalBytes += len;
- if(len > offset_in_bytes - m_totalBytes)
+ 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 = m_decoder->read(data, size);
+
+ if(len <= 0) //end of file
+ return 0;
+
+ if(len + m_totalBytes <= length_in_bytes)
{
- len = offset_in_bytes - m_totalBytes;
- int sample_size = audioParameters().bits() * audioParameters().channels()/8;
- len = (len / sample_size) * sample_size;
+ m_totalBytes += len;
+ return len;
}
- if(len < 0)
- len = 0;
- 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;
}
int DecoderCUE::bitrate()
{
return m_decoder->bitrate();
}
+
+const QString DecoderCUE::nextURL()
+{
+ if(m_track +1 <= m_parser->count())
+ return m_parser->trackURL(m_track + 1);
+ else
+ return QString();
+}
+
+void DecoderCUE::next()
+{
+ if(m_track +1 <= m_parser->count())
+ {
+ m_track++;
+ m_length = m_parser->length(m_track);
+ m_offset = m_parser->offset(m_track);
+ length_in_bytes = audioParameters().sampleRate() *
+ audioParameters().channels() *
+ audioParameters().bits() * m_length/8000;
+ StateHandler::instance()->dispatch(m_parser->info(m_track)->metaData());
+ m_totalBytes = 0;
+ }
+}