diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-22 15:55:23 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-22 15:55:23 +0000 |
| commit | 153b4256c6d5f33b3d31bf9353e7cfd279d63997 (patch) | |
| tree | 30a483c1d390f70b4f5aa9c60686d69a00403631 /src/plugins | |
| parent | 7ec5b791cbf171a60f75c731b7c035d536ecce95 (diff) | |
| download | qmmp-153b4256c6d5f33b3d31bf9353e7cfd279d63997.tar.gz qmmp-153b4256c6d5f33b3d31bf9353e7cfd279d63997.tar.bz2 qmmp-153b4256c6d5f33b3d31bf9353e7cfd279d63997.zip | |
ported cd audio plugin
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1065 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/Input/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/plugins/Input/Input.pro | 2 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/decoder_cdaudio.cpp | 177 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/decoder_cdaudio.h | 21 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decoder_cue.cpp | 1 |
5 files changed, 38 insertions, 167 deletions
diff --git a/src/plugins/Input/CMakeLists.txt b/src/plugins/Input/CMakeLists.txt index 756e224bd..a62066aea 100644 --- a/src/plugins/Input/CMakeLists.txt +++ b/src/plugins/Input/CMakeLists.txt @@ -53,7 +53,7 @@ add_subdirectory(aac) ENDIF(USE_AAC) IF(USE_CUE) -#add_subdirectory(cue) +add_subdirectory(cue) ENDIF(USE_CUE) IF(USE_MPLAYER) @@ -61,5 +61,5 @@ add_subdirectory(mplayer) ENDIF(USE_MPLAYER) IF(USE_CDA) -#add_subdirectory(cdaudio) +add_subdirectory(cdaudio) ENDIF(USE_CDA) diff --git a/src/plugins/Input/Input.pro b/src/plugins/Input/Input.pro index 5962f3698..ad543d13e 100644 --- a/src/plugins/Input/Input.pro +++ b/src/plugins/Input/Input.pro @@ -48,7 +48,7 @@ contains(CONFIG, MPLAYER_PLUGIN){ } contains(CONFIG, CDAUDIO_PLUGIN){ - #SUBDIRS += cdaudio + SUBDIRS += cdaudio message(***************************) message(* CD Audio plugin enabled *) message(***************************) diff --git a/src/plugins/Input/cdaudio/decoder_cdaudio.cpp b/src/plugins/Input/cdaudio/decoder_cdaudio.cpp index 51f0aaf97..9c14445a0 100644 --- a/src/plugins/Input/cdaudio/decoder_cdaudio.cpp +++ b/src/plugins/Input/cdaudio/decoder_cdaudio.cpp @@ -31,7 +31,6 @@ #include <cdio/cd_types.h> #include <cdio/logging.h> -#include <qmmp/constants.h> #include <qmmp/buffer.h> #include <qmmp/output.h> #include <qmmp/recycler.h> @@ -60,17 +59,8 @@ static void log_handler (cdio_log_level_t level, const char message[]) DecoderCDAudio::DecoderCDAudio(QObject *parent, DecoderFactory *d, const QString &url, Output *o) : Decoder(parent, d, o) { - m_inited = FALSE; - m_user_stop = FALSE; - m_output_buf = 0; - m_output_bytes = 0; - m_output_at = 0; - m_bks = 0; - m_done = FALSE; - m_finish = FALSE; m_bitrate = 0; - m_seekTime = -1.0; - m_totalTime = 0.0; + m_totalTime = 0; m_first_sector = -1; m_last_sector = -1; m_current_sector = -1; @@ -81,10 +71,12 @@ DecoderCDAudio::DecoderCDAudio(QObject *parent, DecoderFactory *d, const QString DecoderCDAudio::~DecoderCDAudio() { - deinit(); - if (m_output_buf) - delete [] m_output_buf; - m_output_buf = 0; + m_bitrate = 0; + if (m_cdio) + { + cdio_destroy(m_cdio); + m_cdio = 0; + } } QList <CDATrack> DecoderCDAudio::generateTrackList(const QString &device) @@ -194,59 +186,13 @@ qint64 DecoderCDAudio::calculateTrackLength(lsn_t startlsn, lsn_t endlsn) return ((endlsn - startlsn + 1) * 1000) / 75; } -void DecoderCDAudio::stop() -{ - m_user_stop = TRUE; -} - - -void DecoderCDAudio::flush(bool final) -{ - ulong min = final ? 0 : m_bks; - - while ((! m_done && ! m_finish) && m_output_bytes > min) - { - output()->recycler()->mutex()->lock (); - - while ((! m_done && ! m_finish) && output()->recycler()->full()) - { - mutex()->unlock(); - output()->recycler()->cond()->wait(output()->recycler()->mutex()); - mutex()->lock (); - m_done = m_user_stop; - } - - if (m_user_stop || m_finish) - { - m_inited = FALSE; - m_done = TRUE; - } - else - { - m_output_bytes -= produceSound(m_output_buf, m_output_bytes, m_bitrate, 2); - m_output_at = m_output_bytes; - } - - if (output()->recycler()->full()) - output()->recycler()->cond()->wakeOne(); - - output()->recycler()->mutex()->unlock(); - } -} - - bool DecoderCDAudio::initialize() { - m_bks = Buffer::size(); - m_inited = m_user_stop = m_done = m_finish = FALSE; m_bitrate = 0; - m_seekTime = -1.0; - m_totalTime = 0.0; + m_totalTime = 0; //extract track from url int track_number = m_url.section("#", -1).toInt(); track_number = qMax(track_number, 1); - if (!m_output_buf) //output buffer - m_output_buf = new char[globalBufferSize]; QList <CDATrack> tracks = DecoderCDAudio::generateTrackList(QUrl(m_url).path()); //generate track list if (tracks.isEmpty()) { @@ -313,7 +259,7 @@ bool DecoderCDAudio::initialize() m_current_sector = tracks[track_at].first_sector; m_last_sector = tracks[track_at].last_sector; stateHandler()->dispatch(tracks[track_at].info.metaData()); //send metadata - m_inited = TRUE; + //m_inited = TRUE; qDebug("DecoderCDAudio: initialize succes"); return TRUE; } @@ -321,105 +267,40 @@ bool DecoderCDAudio::initialize() qint64 DecoderCDAudio::totalTime() { - if (! m_inited) - return 0; - return m_totalTime; } - -void DecoderCDAudio::seek(qint64 pos) +int DecoderCDAudio::bitrate() { - m_seekTime = pos; + return m_bitrate; } - -void DecoderCDAudio::deinit() -{ - m_inited = m_user_stop = m_done = m_finish = FALSE; - m_bitrate = 0; - if (m_cdio) - { - cdio_destroy(m_cdio); - m_cdio = 0; - } -} - -void DecoderCDAudio::run() +qint64 DecoderCDAudio::readAudio(char *audio, qint64 maxSize) { long len = 0; - mutex()->lock (); - if (!m_inited) + lsn_t secorts_to_read = qMin(CDDA_SECTORS, (m_last_sector - m_current_sector + 1)); + if(secorts_to_read * CDIO_CD_FRAMESIZE_RAW > maxSize) { - mutex()->unlock(); - return; + qWarning("DecoderCDAudio: buffer is too small"); + return 0; } - mutex()->unlock(); - - while (!m_done && !m_finish) + if (secorts_to_read <= 0) + len = 0; + else { - mutex()->lock (); - - if (m_seekTime >= 0.0) - { - m_current_sector = m_first_sector + m_seekTime * 75 / 1000; - m_seekTime = -1.0; - } - - lsn_t secorts_to_read = qMin(CDDA_SECTORS, (m_last_sector - m_current_sector + 1)); - if (secorts_to_read <= 0) - len = 0; + if (cdio_read_audio_sectors(m_cdio, audio, + m_current_sector, secorts_to_read) != DRIVER_OP_SUCCESS) + len = -1; else { - if (cdio_read_audio_sectors(m_cdio, m_output_buf + m_output_at, - m_current_sector, secorts_to_read) != DRIVER_OP_SUCCESS) - len = -1; - else - { - len = secorts_to_read * CDIO_CD_FRAMESIZE_RAW; - m_current_sector += secorts_to_read; - } - } - if (len > 0) - { - m_output_at += len; - m_output_bytes += len; - - if (output()) - flush(); - } - else if (len == 0) - { - flush(TRUE); - - if (output()) - { - output()->recycler()->mutex()->lock (); - // end of stream - while (! output()->recycler()->empty() && ! m_user_stop) - { - output()->recycler()->cond()->wakeOne(); - mutex()->unlock(); - output()->recycler()->cond()->wait(output()->recycler()->mutex()); - mutex()->lock (); - } - output()->recycler()->mutex()->unlock(); - } - m_done = TRUE; - m_finish = !m_user_stop; - } - else - { - qWarning("DecoderCDAudio: Error while decoding stream, disk to be corrupted"); - m_finish = TRUE; + len = secorts_to_read * CDIO_CD_FRAMESIZE_RAW; + m_current_sector += secorts_to_read; } - mutex()->unlock(); } - mutex()->lock (); - - if (m_finish) - finish(); + return len; +} - mutex()->unlock(); - deinit(); +void DecoderCDAudio::seekAudio(qint64 pos) +{ + m_current_sector = m_first_sector + pos * 75 / 1000; } diff --git a/src/plugins/Input/cdaudio/decoder_cdaudio.h b/src/plugins/Input/cdaudio/decoder_cdaudio.h index 78ab8d62d..0b1980570 100644 --- a/src/plugins/Input/cdaudio/decoder_cdaudio.h +++ b/src/plugins/Input/cdaudio/decoder_cdaudio.h @@ -49,32 +49,23 @@ public: static QList <CDATrack> generateTrackList(const QString &device = QString()); static qint64 calculateTrackLength(lsn_t startlsn, lsn_t endlsn); - // Standard Decoder API + // Standard Decoder API bool initialize(); qint64 totalTime(); - void seek(qint64); - void stop(); + int bitrate(); private: - // thread run function - void run(); - // helper functions - void flush(bool = FALSE); - void deinit(); + qint64 readAudio(char *audio, qint64 maxSize); + void seekAudio(qint64 time); // libcdio variables lsn_t m_first_sector; lsn_t m_last_sector; lsn_t m_current_sector; CdIo_t *m_cdio; - // output buffer - char *m_output_buf; - ulong m_output_bytes, m_output_at; //other variables - bool m_inited, m_user_stop, m_done, m_finish; QString m_url; - unsigned int m_bks; - quint64 m_bitrate; - qint64 m_totalTime, m_seekTime; + int m_bitrate; + qint64 m_totalTime; }; #endif // DECODER_CDAUIDO_H diff --git a/src/plugins/Input/cue/decoder_cue.cpp b/src/plugins/Input/cue/decoder_cue.cpp index b9da9a6df..a3942f100 100644 --- a/src/plugins/Input/cue/decoder_cue.cpp +++ b/src/plugins/Input/cue/decoder_cue.cpp @@ -122,7 +122,6 @@ bool DecoderCUE::initialize() connect(stateHandler(), SIGNAL(aboutToFinish()), SLOT(proccessFinish())); //prepare decoder and ouput objects m_decoder->initialize(); - qDebug("%lld == %lld", m_offset, m_length); m_decoder->setFragment(m_offset, m_length); //send metadata QMap<Qmmp::MetaData, QString> metaData = parser.info(track)->metaData(); |
