aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-07-22 14:04:43 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-07-22 14:04:43 +0000
commit7ec5b791cbf171a60f75c731b7c035d536ecce95 (patch)
tree5c3fad7f31751a254284f0cab15a5ed68cf540e3 /src/plugins
parent37fd73456298ddc324eade8e61774e1c7fc70650 (diff)
downloadqmmp-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/plugins')
-rw-r--r--src/plugins/Input/CMakeLists.txt4
-rw-r--r--src/plugins/Input/Input.pro2
-rw-r--r--src/plugins/Input/aac/decoder_aac.cpp201
-rw-r--r--src/plugins/Input/aac/decoder_aac.h44
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;
};