diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-10 19:00:19 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-10 19:00:19 +0000 |
| commit | 0ffc657cc8ef4ae47649f941690e9bfea2f8650f (patch) | |
| tree | bf4d458699745106bc7593c307f2b9b2c4f1966a /src/plugins/Input/mpc/decoder_mpc.cpp | |
| parent | ecac2692da3607ad2287d20c4d5003434413eac0 (diff) | |
| download | qmmp-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.cpp | 229 |
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(); } + |
