diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-22 14:04:43 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-22 14:04:43 +0000 |
| commit | 7ec5b791cbf171a60f75c731b7c035d536ecce95 (patch) | |
| tree | 5c3fad7f31751a254284f0cab15a5ed68cf540e3 /src | |
| parent | 37fd73456298ddc324eade8e61774e1c7fc70650 (diff) | |
| download | qmmp-7ec5b791cbf171a60f75c731b7c035d536ecce95.tar.gz qmmp-7ec5b791cbf171a60f75c731b7c035d536ecce95.tar.bz2 qmmp-7ec5b791cbf171a60f75c731b7c035d536ecce95.zip | |
ported aac plugin
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1064 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/Input/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/plugins/Input/Input.pro | 2 | ||||
| -rw-r--r-- | src/plugins/Input/aac/decoder_aac.cpp | 201 | ||||
| -rw-r--r-- | src/plugins/Input/aac/decoder_aac.h | 44 |
4 files changed, 38 insertions, 213 deletions
diff --git a/src/plugins/Input/CMakeLists.txt b/src/plugins/Input/CMakeLists.txt index 3c2c97cfb..756e224bd 100644 --- a/src/plugins/Input/CMakeLists.txt +++ b/src/plugins/Input/CMakeLists.txt @@ -49,7 +49,7 @@ add_subdirectory(modplug) ENDIF(USE_MODPLUG) IF(USE_AAC) -#add_subdirectory(aac) +add_subdirectory(aac) ENDIF(USE_AAC) IF(USE_CUE) @@ -57,7 +57,7 @@ IF(USE_CUE) ENDIF(USE_CUE) IF(USE_MPLAYER) -#add_subdirectory(mplayer) +add_subdirectory(mplayer) ENDIF(USE_MPLAYER) IF(USE_CDA) diff --git a/src/plugins/Input/Input.pro b/src/plugins/Input/Input.pro index 5ba975d6d..5962f3698 100644 --- a/src/plugins/Input/Input.pro +++ b/src/plugins/Input/Input.pro @@ -34,7 +34,7 @@ contains(CONFIG, FFMPEG_PLUGIN){ } contains(CONFIG, AAC_PLUGIN){ - #SUBDIRS += aac + SUBDIRS += aac message(**********************) message(* AAC plugin enabled *) message(**********************) diff --git a/src/plugins/Input/aac/decoder_aac.cpp b/src/plugins/Input/aac/decoder_aac.cpp index 43ba3964e..065ea6b43 100644 --- a/src/plugins/Input/aac/decoder_aac.cpp +++ b/src/plugins/Input/aac/decoder_aac.cpp @@ -23,7 +23,6 @@ #include <QIODevice> #include <QtGlobal> -#include <qmmp/constants.h> #include <qmmp/buffer.h> #include <qmmp/output.h> #include <qmmp/recycler.h> @@ -38,21 +37,8 @@ DecoderAAC::DecoderAAC(QObject *parent, DecoderFactory *d, QIODevice *i, Output *o) : Decoder(parent, d, i, 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_len = 0; - m_freq = 0; m_bitrate = 0; - m_seekTime = -1.0; - m_totalTime = 0.0; - m_chan = 0; - m_output_size = 0; + m_totalTime = 0; m_data = 0; m_input_buf = 0; m_input_at = 0; @@ -61,7 +47,6 @@ DecoderAAC::DecoderAAC(QObject *parent, DecoderFactory *d, QIODevice *i, Output DecoderAAC::~DecoderAAC() { - deinit(); if (data()) { if (data()->handle) @@ -69,71 +54,16 @@ DecoderAAC::~DecoderAAC() delete data(); m_data = 0; } - if (m_output_buf) - delete [] m_output_buf; if (m_input_buf) delete [] m_input_buf; - m_output_buf = 0; m_input_buf = 0; + m_bitrate = 0; } - -void DecoderAAC::stop() -{ - m_user_stop = TRUE; -} - - -void DecoderAAC::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, m_chan); - m_output_size += m_bks; - m_output_at = m_output_bytes; - } - - if (output()->recycler()->full()) - { - output()->recycler()->cond()->wakeOne(); - } - - output()->recycler()->mutex()->unlock(); - } -} - - bool DecoderAAC::initialize() { - m_bks = Buffer::size(); - m_inited = m_user_stop = m_done = m_finish = FALSE; - m_len = m_freq = m_bitrate = 0; - //chan = 0; - m_output_size = 0; - m_seekTime = -1.0; - m_totalTime = 0.0; - + m_bitrate = 0; + m_totalTime = 0; if (!input()) { @@ -142,11 +72,6 @@ bool DecoderAAC::initialize() } if (!m_input_buf) m_input_buf = new char[AAC_BUFFER_SIZE]; - - if (!m_output_buf) - m_output_buf = new char[globalBufferSize]; - m_output_at = 0; - m_output_bytes = 0; m_input_at = 0; if (!input()->isOpen()) @@ -195,14 +120,21 @@ bool DecoderAAC::initialize() m_input_at -= tag_size; m_input_at += input()->read((char *)(m_input_buf + m_input_at), AAC_BUFFER_SIZE - m_input_at); } - int res = NeAACDecInit (data()->handle, (unsigned char*) m_input_buf, m_input_at, &m_freq, &m_chan); + #ifdef FAAD_MODIFIED + uint32_t freq = 0; + uint8_t m_chan = 0; + #else + unsigned long freq = 0; + unsigned char chan = 0; + #endif + int res = NeAACDecInit (data()->handle, (unsigned char*) m_input_buf, m_input_at, &freq, &chan); if (res < 0) { qWarning("DecoderAAC: NeAACDecInit() failed"); return FALSE; } - if (!m_freq || !m_chan) + if (!freq || !chan) { qWarning("DecoderAAC: invalid sound parameters"); return FALSE; @@ -210,17 +142,16 @@ bool DecoderAAC::initialize() memmove(m_input_buf, m_input_buf + res, m_input_at - res); m_input_at -= res; - configure(m_freq, m_chan, 16); - m_inited = TRUE; + configure(freq, chan, 16); qDebug("DecoderAAC: initialize succes"); return TRUE; } -qint64 DecoderAAC::aac_decode(void *out) +qint64 DecoderAAC::readAudio(char *audio, qint64 maxSize) { NeAACDecFrameInfo frame_info; qint64 size = 0, to_read, read; - out = 0; + void *out = 0; bool eof = FALSE; while (size <= 0 && !eof) @@ -237,8 +168,8 @@ qint64 DecoderAAC::aac_decode(void *out) memmove(m_input_buf, m_input_buf + frame_info.bytesconsumed, m_input_at - frame_info.bytesconsumed); m_input_at -= frame_info.bytesconsumed; - if ((size = frame_info.samples * 2) > 0) - memcpy((void *) (m_output_buf + m_output_at), out, size); + if ((size = frame_info.samples * 2) > 0 && size <= maxSize) + memcpy((void *) (audio), out, size); if (frame_info.error > 0) { m_input_at = 0; @@ -250,101 +181,17 @@ qint64 DecoderAAC::aac_decode(void *out) qint64 DecoderAAC::totalTime() { - if (!m_inited) - return 0; - return m_totalTime; } - -void DecoderAAC::seek(qint64 pos) -{ - m_seekTime = pos; -} - - -void DecoderAAC::deinit() +int DecoderAAC::bitrate() { - m_inited = m_user_stop = m_done = m_finish = FALSE; - m_len = m_freq = m_bitrate = 0; - m_chan = 0; - m_output_size = 0; + return m_bitrate; } -void DecoderAAC::run() +void DecoderAAC::seekAudio(qint64 pos) { - mutex()->lock (); - if (!m_inited) - { - mutex()->unlock(); - return; - } - mutex()->unlock(); - - while (!m_done && !m_finish) - { - mutex()->lock (); - // decode - - if (m_seekTime >= 0 && m_totalTime) - { - input()->seek(m_seekTime * input()->size() / m_totalTime); - NeAACDecPostSeekReset (data()->handle, 0); - m_input_at = 0; - m_seekTime = -1.0; - } - - m_len = aac_decode(m_prebuf2); - - if (m_len > 0) - { - //qDebug("flush"); - //bitrate = vbrUpd * data()->info.sample_freq / 1152; - m_output_at += m_len; - m_output_bytes += m_len; - - if (output()) - flush(); - - } - else if (m_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; - if (!m_user_stop) - { - m_finish = TRUE; - } - } - else - { - // error in read - qWarning("DecoderAAC: Error while decoding stream, file appears to be corrupted"); - m_finish = TRUE; - } - - mutex()->unlock(); - } - mutex()->lock (); - - if (m_finish) - finish(); - - mutex()->unlock(); - deinit(); + input()->seek(pos * input()->size() / m_totalTime); + NeAACDecPostSeekReset (data()->handle, 0); + m_input_at = 0; } diff --git a/src/plugins/Input/aac/decoder_aac.h b/src/plugins/Input/aac/decoder_aac.h index 328cfc3c4..17e152efa 100644 --- a/src/plugins/Input/aac/decoder_aac.h +++ b/src/plugins/Input/aac/decoder_aac.h @@ -38,48 +38,26 @@ public: DecoderAAC(QObject *, DecoderFactory *, QIODevice *, Output *); virtual ~DecoderAAC(); - // Standard Decoder API - bool initialize(); - qint64 totalTime(); - void seek(qint64); - void stop(); struct aac_data *data() { return m_data; } - + // Standard Decoder API + bool initialize(); + qint64 totalTime(); + int bitrate(); private: - // thread run function - void run(); + qint64 readAudio(char *audio, qint64 maxSize); + void seekAudio(qint64 time); struct aac_data *m_data; - // helper functions - void flush(bool = FALSE); - void deinit(); - qint64 aac_decode(void *out); - - bool m_inited, m_user_stop; - - // output buffer - char *m_output_buf, *m_input_buf; - void *m_prebuf2; - unsigned long m_output_bytes; - -#ifdef FAAD_MODIFIED - uint32_t m_freq; - uint8_t m_chan; -#else - unsigned long m_freq; - unsigned char m_chan; -#endif - unsigned int m_bks; - bool m_done, m_finish; - unsigned long m_len, m_bitrate, m_input_at, m_output_at; - unsigned long m_output_size; - double m_frameSize; //frame size in bytes - qint64 m_totalTime, m_seekTime; + char *m_input_buf; + int m_bitrate; + ulong m_input_at, m_output_at; + double m_frameSize; + qint64 m_totalTime; }; |
