/* * xSF - SNSF configuration * By Naram Qashat (CyberBotX) [cyberbotx@cyberbotx.com] * * Partially based on the vio*sf framework * * NOTE: 16-bit sound is always enabled, the player is currently limited to * creating a 16-bit PCM for Winamp and can not handle 8-bit sound from * snes9x. */ #include #include #include #include #include #include "windowsh_wrapper.h" #include "XSFApp.h" #include "XSFConfig.h" #include "XSFConfig_SNSF.h" #include "XSFConfigDialog_SNSF.h" #include "convert.h" #include "snes9x/apu/apu.h" class wxWindow; class XSFConfigDialog; class XSFPlayer; const unsigned XSFConfig::initSampleRate = 44100; const std::string XSFConfig::commonName = "SNSF Decoder"; const std::string XSFConfig::versionNumber = "0.9b"; XSFApp *XSFApp::Create() { return new XSFApp(); } XSFConfig *XSFConfig::Create() { return new XSFConfig_SNSF(); } XSFConfig_SNSF::XSFConfig_SNSF() : XSFConfig(), /*sixteenBitSound(false), */reverseStereo(false), mutes(), resampler(0) { this->supportedSampleRates.push_back(8000); this->supportedSampleRates.push_back(11025); this->supportedSampleRates.push_back(16000); this->supportedSampleRates.push_back(22050); this->supportedSampleRates.push_back(32000); this->supportedSampleRates.push_back(44100); this->supportedSampleRates.push_back(48000); this->supportedSampleRates.push_back(88200); this->supportedSampleRates.push_back(96000); this->supportedSampleRates.push_back(176400); this->supportedSampleRates.push_back(192000); } void XSFConfig_SNSF::LoadSpecificConfig() { //this->sixteenBitSound = this->configIO->GetValue("SixteenBitSound", XSFConfig_SNSF::initSixteenBitSound); this->reverseStereo = this->configIO->GetValue("ReverseStereo", XSFConfig_SNSF::initReverseStereo); this->resampler = this->configIO->GetValue("Resampler", XSFConfig_SNSF::initResampler); std::stringstream mutesSS(this->configIO->GetValue("Mutes", XSFConfig_SNSF::initMutes)); mutesSS >> this->mutes; } void XSFConfig_SNSF::SaveSpecificConfig() { //this->configIO->SetValue("SixteenBitSound", this->sixteenBitSound); this->configIO->SetValue("ReverseStereo", this->reverseStereo); this->configIO->SetValue("Resampler", this->resampler); this->configIO->SetValue("Mutes", this->mutes.to_string()); } void XSFConfig_SNSF::InitializeSpecificConfigDialog(XSFConfigDialog *dialog) { auto snsfDialog = static_cast(dialog); snsfDialog->reverseStereo = this->reverseStereo; snsfDialog->resampler = static_cast(this->resampler); for (std::size_t x = 0, numMutes = this->mutes.size(); x < numMutes; ++x) if (this->mutes[x]) snsfDialog->mute.Add(x); } void XSFConfig_SNSF::ResetSpecificConfigDefaults(XSFConfigDialog *dialog) { auto snsfDialog = static_cast(dialog); snsfDialog->reverseStereo = XSFConfig_SNSF::initReverseStereo; snsfDialog->resampler = XSFConfig_SNSF::initResampler; snsfDialog->mute.Clear(); auto tmpMutes = std::bitset<8>(XSFConfig_SNSF::initMutes); for (std::size_t x = 0, numMutes = tmpMutes.size(); x < numMutes; ++x) if (tmpMutes[x]) snsfDialog->mute.Add(x); } void XSFConfig_SNSF::SaveSpecificConfigDialog(XSFConfigDialog *dialog) { auto snsfDialog = static_cast(dialog); this->reverseStereo = snsfDialog->reverseStereo; this->resampler = snsfDialog->resampler; for (std::size_t x = 0, numMutes = this->mutes.size(); x < numMutes; ++x) this->mutes[x] = snsfDialog->mute.Index(x) != wxNOT_FOUND; } void XSFConfig_SNSF::CopySpecificConfigToMemory(XSFPlayer *, bool preLoad) { if (preLoad) { memset(&Settings, 0, sizeof(Settings)); //Settings.SixteenBitSound = this->sixteenBitSound; Settings.ReverseStereo = this->reverseStereo; } else S9xSetSoundControl(static_cast(this->mutes.to_ulong()) ^ 0xFF); } void XSFConfig_SNSF::About(HWND parent) { MessageBoxW(parent, ConvertFuncs::StringToWString(XSFConfig::commonName + " v" + XSFConfig::versionNumber + ", using xSF Winamp plugin framework (based on the vio*sf plugins) by Naram Qashat (CyberBotX) [cyberbotx@cyberbotx.com]\n\n" "Utilizes modified snes9x v1.53 for audio playback.").c_str(), ConvertFuncs::StringToWString(XSFConfig::commonName + " v" + XSFConfig::versionNumber).c_str(), MB_OK); } XSFConfigDialog *XSFConfig_SNSF::CreateDialogBox(wxWindow *window, const std::string &title) { return new XSFConfigDialog_SNSF(*this, window, title); }