aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-07-22 15:55:23 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-07-22 15:55:23 +0000
commit153b4256c6d5f33b3d31bf9353e7cfd279d63997 (patch)
tree30a483c1d390f70b4f5aa9c60686d69a00403631 /src/plugins/Input
parent7ec5b791cbf171a60f75c731b7c035d536ecce95 (diff)
downloadqmmp-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/Input')
-rw-r--r--src/plugins/Input/CMakeLists.txt4
-rw-r--r--src/plugins/Input/Input.pro2
-rw-r--r--src/plugins/Input/cdaudio/decoder_cdaudio.cpp177
-rw-r--r--src/plugins/Input/cdaudio/decoder_cdaudio.h21
-rw-r--r--src/plugins/Input/cue/decoder_cue.cpp1
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();