diff options
Diffstat (limited to 'src/plugins/Input/sid/decoder_sid.cpp')
| -rw-r--r-- | src/plugins/Input/sid/decoder_sid.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/plugins/Input/sid/decoder_sid.cpp b/src/plugins/Input/sid/decoder_sid.cpp new file mode 100644 index 000000000..bcd84e56b --- /dev/null +++ b/src/plugins/Input/sid/decoder_sid.cpp @@ -0,0 +1,100 @@ +/*************************************************************************** + * Copyright (C) 2013 by Ilya Kotov * + * forkotov02@hotmail.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + + +#include "decoder_sid.h" + +// Decoder class +DecoderSID::DecoderSID(QIODevice *input) : Decoder(input) +{ + m_player = new sidplayfp(); +} + +DecoderSID::~DecoderSID() +{ + delete m_player; +} + +bool DecoderSID::initialize() +{ + QByteArray data = input()->readAll(); + + if(data.isEmpty()) + { + qWarning("DecoderSID: error: %s", qPrintable(input()->errorString())); + return false; + } + + SidTune *tune = new SidTune(0); + tune->read((const unsigned char*)data.constData(), data.size()); + tune->selectSong(0); + + if(!tune->getStatus()) + { + qWarning("DecoderSID: error: %s", tune->statusString()); + return false; + } + + sidbuilder *rs = new ReSIDfpBuilder("ReSIDfp builder"); + rs->create(m_player->info().maxsids()); + + SidConfig cfg = m_player->config(); + + cfg.frequency = 44100; + cfg.samplingMethod = SidConfig::INTERPOLATE; + cfg.playback = SidConfig::STEREO; + cfg.sidEmulation = rs; + + if(!m_player->config(cfg)) + { + qWarning("DecoderSID: unable to load config, error: %s", m_player->error()); + return false; + } + + if(!m_player->load(tune)) + { + qWarning("DecoderSID: unable to load tune, error: %s", m_player->error()); + return false; + } + + configure(44100, 2); + qDebug("DecoderSID: initialize succes"); + return true; +} + +qint64 DecoderSID::totalTime() +{ + return 0; +} + +void DecoderSID::seek(qint64 pos) +{ + Q_UNUSED(pos); +} + +int DecoderSID::bitrate() +{ + return 8; +} + +qint64 DecoderSID::read(char *data, qint64 size) +{ + return m_player->play((short *)data, size/2) * 2; +} |
