diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-10-18 16:54:01 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-10-18 16:54:01 +0000 |
| commit | a85ab7165a0183696bc03caaefa0c46cb1e639f9 (patch) | |
| tree | 8b14b66b24269e5f99ed3154b1249d0074d28c31 /src/plugins | |
| parent | fa134cf9e16f53bc8baca11370219b8b0c7ded61 (diff) | |
| download | qmmp-a85ab7165a0183696bc03caaefa0c46cb1e639f9.tar.gz qmmp-a85ab7165a0183696bc03caaefa0c46cb1e639f9.tar.bz2 qmmp-a85ab7165a0183696bc03caaefa0c46cb1e639f9.zip | |
fixed cdda regression (Closes issue 391)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1945 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/Input/cdaudio/decoder_cdaudio.cpp | 44 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/decoder_cdaudio.h | 2 |
2 files changed, 31 insertions, 15 deletions
diff --git a/src/plugins/Input/cdaudio/decoder_cdaudio.cpp b/src/plugins/Input/cdaudio/decoder_cdaudio.cpp index 54dc2084f..017bbfe2e 100644 --- a/src/plugins/Input/cdaudio/decoder_cdaudio.cpp +++ b/src/plugins/Input/cdaudio/decoder_cdaudio.cpp @@ -37,7 +37,8 @@ #include <qmmp/recycler.h> #include <qmmp/qmmpsettings.h> -#define CDDA_SECTORS 8 +#define CDDA_SECTORS 4 +#define CDDA_BUFFER_SIZE (CDDA_SECTORS*CDIO_CD_FRAMESIZE_RAW) #include "decoder_cdaudio.h" @@ -67,6 +68,8 @@ DecoderCDAudio::DecoderCDAudio(const QString &url) : Decoder() m_current_sector = -1; m_url = url; m_cdio = 0; + m_buffer_at = 0; + m_buffer = new char[CDDA_BUFFER_SIZE]; } @@ -78,6 +81,7 @@ DecoderCDAudio::~DecoderCDAudio() cdio_destroy(m_cdio); m_cdio = 0; } + delete [] m_buffer; } QList <CDATrack> DecoderCDAudio::generateTrackList(const QString &device) @@ -418,30 +422,40 @@ int DecoderCDAudio::bitrate() qint64 DecoderCDAudio::read(char *audio, qint64 maxSize) { - long len = 0; - lsn_t secorts_to_read = qMin(CDDA_SECTORS, (m_last_sector - m_current_sector + 1)); - if(secorts_to_read * CDIO_CD_FRAMESIZE_RAW > maxSize) + if(!m_buffer_at) { - qWarning("DecoderCDAudio: buffer is too small"); - return 0; - } - if (secorts_to_read <= 0) - len = 0; - else - { - if (cdio_read_audio_sectors(m_cdio, audio, + + lsn_t secorts_to_read = qMin(CDDA_SECTORS, (m_last_sector - m_current_sector + 1)); + + if (secorts_to_read <= 0) + return 0; + + if (cdio_read_audio_sectors(m_cdio, m_buffer, m_current_sector, secorts_to_read) != DRIVER_OP_SUCCESS) - len = -1; + { + m_buffer_at = 0; + return -1; + } else { - len = secorts_to_read * CDIO_CD_FRAMESIZE_RAW; + m_buffer_at = secorts_to_read * CDIO_CD_FRAMESIZE_RAW; m_current_sector += secorts_to_read; } } - return len; + + if(m_buffer_at > 0) + { + long len = qMin(maxSize, m_buffer_at); + memcpy(audio, m_buffer, len); + m_buffer_at -= len; + memmove(m_buffer, m_buffer + len, m_buffer_at); + return len; + } + return 0; } void DecoderCDAudio::seek(qint64 pos) { m_current_sector = m_first_sector + pos * 75 / 1000; + m_buffer_at = 0; } diff --git a/src/plugins/Input/cdaudio/decoder_cdaudio.h b/src/plugins/Input/cdaudio/decoder_cdaudio.h index 582aed033..ec1cdaed1 100644 --- a/src/plugins/Input/cdaudio/decoder_cdaudio.h +++ b/src/plugins/Input/cdaudio/decoder_cdaudio.h @@ -69,6 +69,8 @@ private: QString m_url; int m_bitrate; qint64 m_totalTime; + char *m_buffer; + qint64 m_buffer_at; }; #endif // DECODER_CDAUIDO_H |
