add support for libsidplayfp-3 backport from svn master: r13128, r13131, r13132, r13133, r13136, r13139 --- a/src/plugins/Input/sid/CMakeLists.txt +++ b/src/plugins/Input/sid/CMakeLists.txt @@ -1,8 +1,18 @@ project(libsid) +include(CheckIncludeFileCXX) + # libsidplayfp pkg_search_module(SIDPLAYFP libsidplayfp>=1.0.3 IMPORTED_TARGET) +# libresidfp support +if(SIDPLAYFP_FOUND) + check_include_file_cxx(sidplayfp/builders/residfp.h RESIDFP_HEADER_FOUND ${SIDPLAYFP_CFLAGS}) + if(RESIDFP_HEADER_FOUND) + add_definitions(-DHAVE_RESIDFP_HEADER) + endif(RESIDFP_HEADER_FOUND) +endif(SIDPLAYFP_FOUND) + SET(libsid_SRCS decoder_sid.cpp decodersidfactory.cpp --- a/src/plugins/Input/sid/decoder_sid.cpp +++ b/src/plugins/Input/sid/decoder_sid.cpp @@ -24,8 +24,14 @@ #include #include #include -#include +#if LIBSIDPLAYFP_VERSION_MAJ >= 3 +#include +#else #include +#endif +#ifdef HAVE_RESIDFP_HEADER +#include +#endif #include #include #include @@ -52,13 +58,14 @@ bool DecoderSID::initialize() int track = -1; QString path = TrackInfo::pathFromUrl(m_url, &track); - m_tune.load(qPrintable(path)); - if(!m_tune.getInfo()) + m_tune = std::make_unique(nullptr); + m_tune->load(qPrintable(path)); + if(!m_tune->getInfo()) { - qCWarning(plugin, "unable to load tune, error: %s", m_tune.statusString()); + qCWarning(plugin, "unable to load tune, error: %s", m_tune->statusString()); return false; } - int count = m_tune.getInfo()->songs(); + int count = m_tune->getInfo()->songs(); if(track > count || track < 1) { @@ -66,16 +73,16 @@ bool DecoderSID::initialize() return false; } - m_tune.selectSong(track); + m_tune->selectSong(track); - if(!m_tune.getStatus()) + if(!m_tune->getStatus()) { - qCWarning(plugin, "error: %s", m_tune.statusString()); + qCWarning(plugin, "error: %s", m_tune->statusString()); return false; } //send metadata for pseudo-protocol - const SidTuneInfo *tune_info = m_tune.getInfo(); + const SidTuneInfo *tune_info = m_tune->getInfo(); QMap metadata; metadata.insert(Qmmp::TITLE, QString::fromUtf8(tune_info->infoString(0))); metadata.insert(Qmmp::ARTIST, QString::fromUtf8(tune_info->infoString(1))); @@ -89,7 +96,7 @@ bool DecoderSID::initialize() if(settings.value(u"use_hvsc"_s, false).toBool()) { char md5[SidTune::MD5_LENGTH + 1]; - m_tune.createMD5(md5); + m_tune->createMD5(md5); m_length = m_db->length(md5, track); } @@ -98,26 +105,43 @@ bool DecoderSID::initialize() qCDebug(plugin, "song length: %d", m_length); - sidbuilder *rs = nullptr; +#if LIBSIDPLAYFP_VERSION_MAJ >= 3 +#ifdef HAVE_RESIDFP_HEADER + if(settings.value(u"engine"_s, u"sidlite"_s).toString() == "residfp"_L1) + { + m_builder = std::make_unique("ReSIDfp"); + } + else +#endif + { + m_builder = std::make_unique("SIDLite"); + } +#else +#ifdef HAVE_RESIDFP_HEADER if(settings.value(u"engine"_s, u"residfp"_s).toString() == "residfp"_L1) { - rs = new ReSIDfpBuilder("ReSIDfp builder"); - qCDebug(plugin, "using ReSIDfp emulation"); + m_builder = std::make_unique("ReSIDfp"); } else +#endif { - rs = new ReSIDBuilder("ReSID builder"); - qCDebug(plugin, "using ReSID emulation"); + m_builder = std::make_unique("ReSID"); } - rs->create(m_player->info().maxsids()); + m_builder->create(m_player->info().maxsids()); +#endif + + qCDebug(plugin, "using %s emulation", m_builder->name()); SidConfig cfg = m_player->config(); cfg.frequency = settings.value(u"sample_rate"_s, 48000).toInt(); int sm = settings.value(u"resampling_method"_s, SidConfig::INTERPOLATE).toInt(); - cfg.samplingMethod = (SidConfig::sampling_method_t) sm; + cfg.samplingMethod = static_cast(sm); + + cfg.sidEmulation = m_builder.get(); +#if LIBSIDPLAYFP_VERSION_MAJ < 3 cfg.playback = SidConfig::STEREO; - cfg.sidEmulation = rs; cfg.fastSampling = settings.value(u"fast_resampling"_s, false).toBool(); +#endif settings.endGroup(); if(!m_player->config(cfg)) @@ -126,7 +150,7 @@ bool DecoderSID::initialize() return false; } - if(!m_player->load(&m_tune)) + if(!m_player->load(m_tune.get())) { qCWarning(plugin, "unable to load tune, error: %s", m_player->error()); return false; --- a/src/plugins/Input/sid/decoder_sid.h +++ b/src/plugins/Input/sid/decoder_sid.h @@ -21,11 +21,13 @@ #ifndef DECODER_SID_H #define DECODER_SID_H +#include #include class sidplayfp; class SidDatabase; class SidTune; +class sidbuilder; /** @author Ilya Kotov @@ -50,7 +52,8 @@ private: int m_length = 0; qint64 m_length_in_bytes = 0; qint64 m_read_bytes = 0; - SidTune m_tune; + std::unique_ptr m_tune; + std::unique_ptr m_builder; }; #endif // DECODER_SID_H --- a/src/plugins/Input/sid/sid.pro +++ b/src/plugins/Input/sid/sid.pro @@ -17,6 +17,8 @@ RESOURCES = translations/translations.qrc FORMS += \ sidsettingsdialog.ui +DEFINES += HAVE_RESIDFP_HEADER + unix{ target.path = $$PLUGIN_DIR/Input INSTALLS += target --- a/src/plugins/Input/sid/sidsettingsdialog.cpp +++ b/src/plugins/Input/sid/sidsettingsdialog.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "sidsettingsdialog.h" #include "ui_sidsettingsdialog.h" @@ -40,20 +41,33 @@ SidSettingsDialog::SidSettingsDialog(SidDatabase *db, QWidget *parent) : QDialog m_ui->sampleRateComboBox->addItem(tr("44100 Hz"), 44100); m_ui->sampleRateComboBox->addItem(tr("48000 Hz"), 48000); - int i = m_ui->sampleRateComboBox->findData(settings.value(u"sample_rate"_s, 48000).toInt()); - m_ui->sampleRateComboBox->setCurrentIndex(i); + int index = m_ui->sampleRateComboBox->findData(settings.value(u"sample_rate"_s, 48000).toInt()); + m_ui->sampleRateComboBox->setCurrentIndex(index); +#if LIBSIDPLAYFP_VERSION_MAJ >= 3 + m_ui->emuComboBox->addItem(u"SIDLite"_s, u"sidlite"_s); + m_ui->emuComboBox->addItem(u"ReSIDfp"_s, u"residfp"_s); + index = m_ui->emuComboBox->findData(settings.value(u"engine"_s, u"sidlite"_s).toString()); + m_ui->emuComboBox->setCurrentIndex(qMax(index, 0)); + m_ui->fastResampligCheckBox->setVisible(false); +#else m_ui->emuComboBox->addItem(u"ReSID"_s, u"resid"_s); m_ui->emuComboBox->addItem(u"ReSIDfp"_s, u"residfp"_s); - i = m_ui->emuComboBox->findData(settings.value(u"engine"_s, u"residfp"_s).toString()); - m_ui->emuComboBox->setCurrentIndex(i); - + index = m_ui->emuComboBox->findData(settings.value(u"engine"_s, u"residfp"_s).toString()); + m_ui->emuComboBox->setCurrentIndex(qMax(index, 0)); m_ui->fastResampligCheckBox->setChecked(settings.value(u"fast_resampling"_s, false).toBool()); +#endif + +//TODO use QFormLayout::setRowVisible +#ifndef HAVE_RESIDFP_HEADER + m_ui->emulationLabel->setVisible(false); + m_ui->emuComboBox->setVisible(false); +#endif m_ui->resamplingComboBox->addItem(u"Interpolate"_s, SidConfig::INTERPOLATE); m_ui->resamplingComboBox->addItem(u"Resample Interpolate"_s, SidConfig::RESAMPLE_INTERPOLATE); - i = m_ui->resamplingComboBox->findData(settings.value(u"resampling_method"_s, SidConfig::INTERPOLATE).toInt()); - m_ui->resamplingComboBox->setCurrentIndex(i); + index = m_ui->resamplingComboBox->findData(settings.value(u"resampling_method"_s, SidConfig::INTERPOLATE).toInt()); + m_ui->resamplingComboBox->setCurrentIndex(index); settings.endGroup(); } --- a/src/plugins/Input/sid/sidsettingsdialog.ui +++ b/src/plugins/Input/sid/sidsettingsdialog.ui @@ -6,14 +6,14 @@ 0 0 - 445 - 286 + 475 + 287 SID Plugin Settings - + 6 @@ -23,20 +23,102 @@ 6 - - - - 5 - - - 1000 + + + + + + HVSC database file: + + + + + + + false + + + + + + + Defaults song length, sec: + + + + + + + 5 + + + 1000 + + + 180 + + + + + + + Sample rate: + + + + + + + + + + Emulation: + + + + + + + + + + Resampling method: + + + + + + + + + + Fast resampling + + + + + + + Enable HVSC song length database + + + + + + + + + Qt::Vertical - - 180 + + + 20 + 40 + - + - + @@ -49,71 +131,6 @@ - - - - Fast resampling - - - - - - - Sample rate: - - - - - - - HVSC database file: - - - - - - - Resampling method: - - - - - - - - - - false - - - - - - - Defaults song length, sec: - - - - - - - Enable HVSC song length database - - - - - - - Emulation: - - - - - - - - -