aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/mpc/decoder_mpc.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-07-10 19:00:19 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-07-10 19:00:19 +0000
commit0ffc657cc8ef4ae47649f941690e9bfea2f8650f (patch)
treebf4d458699745106bc7593c307f2b9b2c4f1966a /src/plugins/Input/mpc/decoder_mpc.cpp
parentecac2692da3607ad2287d20c4d5003434413eac0 (diff)
downloadqmmp-0ffc657cc8ef4ae47649f941690e9bfea2f8650f.tar.gz
qmmp-0ffc657cc8ef4ae47649f941690e9bfea2f8650f.tar.bz2
qmmp-0ffc657cc8ef4ae47649f941690e9bfea2f8650f.zip
ported musepack plugin
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1020 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/mpc/decoder_mpc.cpp')
-rw-r--r--src/plugins/Input/mpc/decoder_mpc.cpp229
1 files changed, 37 insertions, 192 deletions
diff --git a/src/plugins/Input/mpc/decoder_mpc.cpp b/src/plugins/Input/mpc/decoder_mpc.cpp
index 26b0c71b6..b859d6ebd 100644
--- a/src/plugins/Input/mpc/decoder_mpc.cpp
+++ b/src/plugins/Input/mpc/decoder_mpc.cpp
@@ -22,7 +22,6 @@
#include <QObject>
#include <QIODevice>
-#include <qmmp/constants.h>
#include <qmmp/buffer.h>
#include <qmmp/output.h>
#include <qmmp/recycler.h>
@@ -60,8 +59,6 @@ inline static void copyBuffer(MPC_SAMPLE_FORMAT* pInBuf, char* pOutBuf, unsigned
// mpc callbacks
-
-
#ifdef MPC_OLD_API
static mpc_int32_t mpc_callback_read (void *data, void *buffer, mpc_int32_t size)
{
@@ -127,28 +124,16 @@ static mpc_int32_t mpc_callback_get_size (mpc_reader *reader)
DecoderMPC::DecoderMPC(QObject *parent, DecoderFactory *d, QIODevice *i, Output *o)
: Decoder(parent, d, i, o)
{
- inited = FALSE;
- user_stop = FALSE;
- output_buf = 0;
- output_bytes = 0;
- output_at = 0;
- bks = 0;
- done = FALSE;
- m_finish = FALSE;
- len = 0;
- freq = 0;
- bitrate = 0;
- seekTime = -1.0;
+ m_len = 0;
+ m_bitrate = 0;
m_totalTime = 0.0;
- chan = 0;
- output_size = 0;
m_data = 0;
}
DecoderMPC::~DecoderMPC()
{
- deinit();
+ m_len = 0;
if (data())
{
#ifndef MPC_OLD_API
@@ -159,67 +144,12 @@ DecoderMPC::~DecoderMPC()
delete data();
m_data = 0;
}
- if (output_buf)
- delete [] output_buf;
- output_buf = 0;
-}
-
-
-void DecoderMPC::stop()
-{
- user_stop = TRUE;
-}
-
-
-void DecoderMPC::flush(bool final)
-{
- ulong min = final ? 0 : bks;
-
- while ((! done && ! m_finish) && output_bytes > min)
- {
- output()->recycler()->mutex()->lock ();
-
- while ((! done && ! m_finish) && output()->recycler()->full())
- {
- mutex()->unlock();
-
- output()->recycler()->cond()->wait(output()->recycler()->mutex());
-
- mutex()->lock ();
- done = user_stop;
- }
-
- if (user_stop || m_finish)
- {
- inited = FALSE;
- done = TRUE;
- }
- else
- {
- output_bytes -= produceSound(output_buf, output_bytes, bitrate, chan);
- output_size += bks;
- output_at = output_bytes;
- }
-
- if (output()->recycler()->full())
- {
- output()->recycler()->cond()->wakeOne();
- }
- output()->recycler()->mutex()->unlock();
- }
}
-
bool DecoderMPC::initialize()
{
- bks = Buffer::size();
- inited = user_stop = done = m_finish = FALSE;
- len = freq = bitrate = 0;
- chan = 0;
- output_size = 0;
- seekTime = -1.0;
- m_totalTime = 0.0;
-
+ m_bitrate = 0;
+ m_totalTime = 0;
if (!input())
{
@@ -227,11 +157,6 @@ bool DecoderMPC::initialize()
return FALSE;
}
- if (! output_buf)
- output_buf = new char[globalBufferSize];
- output_at = 0;
- output_bytes = 0;
-
if (!input()->isOpen())
{
if (!input()->open(QIODevice::ReadOnly))
@@ -265,7 +190,7 @@ bool DecoderMPC::initialize()
mpc_demux_get_info (m_data->demuxer, &m_data->info);
#endif
- chan = data()->info.channels;
+ int chan = data()->info.channels;
configure(data()->info.sample_freq, chan, 16);
#ifdef MPC_OLD_API
@@ -279,7 +204,6 @@ bool DecoderMPC::initialize()
}
#endif
m_totalTime = mpc_streaminfo_get_length(&data()->info) * 1000;
- inited = TRUE;
qDebug("DecoderMPC: initialize succes");
return TRUE;
}
@@ -287,136 +211,57 @@ bool DecoderMPC::initialize()
qint64 DecoderMPC::totalTime()
{
- if (! inited)
- return 0;
-
return m_totalTime;
}
-
-void DecoderMPC::seek(qint64 pos)
-{
- seekTime = pos;
-}
-
-
-void DecoderMPC::deinit()
+int DecoderMPC::bitrate()
{
- inited = user_stop = done = m_finish = FALSE;
- len = freq = bitrate = 0;
- chan = 0;
- output_size = 0;
+ return m_bitrate;
}
-void DecoderMPC::run()
+qint64 DecoderMPC::readAudio(char *audio, qint64 maxSize)
{
#ifdef MPC_OLD_API
mpc_uint32_t vbrAcc = 0;
mpc_uint32_t vbrUpd = 0;
+ MPC_SAMPLE_FORMAT buffer[MPC_DECODER_BUFFER_LENGTH];
+ m_len = mpc_decoder_decode (&data()->decoder, buffer, &vbrAcc, &vbrUpd);
+ copyBuffer(buffer, audio, qMin(m_len,long(maxSize/4)));
+ m_len = m_len * 4;
+ m_bitrate = vbrUpd * data()->info.sample_freq / 1152000;
#else
mpc_frame_info frame;
mpc_status err;
-#endif
- mutex()->lock ();
- if (!inited)
+ MPC_SAMPLE_FORMAT buffer[MPC_DECODER_BUFFER_LENGTH];
+ frame.buffer = (MPC_SAMPLE_FORMAT *) &buffer;
+ m_len = 0;
+ while (!m_len)
{
- mutex()->unlock();
- return;
- }
- mutex()->unlock();
-
- while (! done && ! m_finish)
- {
- mutex()->lock ();
- // decode
-
- if (seekTime >= 0.0)
+ err = mpc_demux_decode (m_data->demuxer, &frame);
+ if (err != MPC_STATUS_OK || frame.bits == -1)
{
-#ifdef MPC_OLD_API
- mpc_decoder_seek_seconds(&data()->decoder, seekTime/1000);
-#else
- mpc_demux_seek_second(data()->demuxer, (double)seekTime/1000);
-#endif
- seekTime = -1.0;
+ m_len = 0;
+ qDebug("finished");
+ return 0;
}
-#ifdef MPC_OLD_API
- MPC_SAMPLE_FORMAT buffer[MPC_DECODER_BUFFER_LENGTH];
- len = mpc_decoder_decode (&data()->decoder, buffer, &vbrAcc, &vbrUpd);
- copyBuffer(buffer, (char *) (output_buf + output_at), len);
- len = len * 4;
-#else
- MPC_SAMPLE_FORMAT buffer[MPC_DECODER_BUFFER_LENGTH];
- frame.buffer = (MPC_SAMPLE_FORMAT *) &buffer;
- len = 0;
- while (!len)
+ else
{
- err = mpc_demux_decode (m_data->demuxer, &frame);
- if (err != MPC_STATUS_OK || frame.bits == -1)
- {
- len = 0;
- qDebug("finished");
- break;
- }
- else
- {
- len = frame.samples;
- copyBuffer(frame.buffer, (char *) (output_buf + output_at), len);
- len = len * 4;
- }
+ m_len = frame.samples;
+ copyBuffer(buffer, audio, qMin(m_len,long(maxSize/4)));
+ m_len = m_len * 4;
}
+ }
+ m_bitrate = frame.bits * data()->info.sample_freq / 1152000;
#endif
- if (len > 0)
- {
+ return m_len;
+}
+
+void DecoderMPC::seekAudio(qint64 pos)
+{
#ifdef MPC_OLD_API
- bitrate = vbrUpd * data()->info.sample_freq / 1152000;
+ mpc_decoder_seek_seconds(&data()->decoder, pos/1000);
#else
- bitrate = frame.bits * data()->info.sample_freq / 1152000;
+ mpc_demux_seek_second(data()->demuxer, (double)pos/1000);
#endif
- output_at += len;
- 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() && ! user_stop)
- {
- output()->recycler()->cond()->wakeOne();
- mutex()->unlock();
- output()->recycler()->cond()->wait(output()->recycler()->mutex());
- mutex()->lock ();
- }
- output()->recycler()->mutex()->unlock();
- }
-
- done = TRUE;
- if (! user_stop)
- {
- m_finish = TRUE;
- }
- }
- else
- {
- // error in read
- qWarning("DecoderMPC: Error while decoding stream, file appears to be corrupted");
- m_finish = TRUE;
- }
-
- mutex()->unlock();
- }
- mutex()->lock ();
-
- if (m_finish)
- finish();
-
- mutex()->unlock();
- deinit();
}
+