refactored Video and Audio dialogs into common dialog

created new EmulationDialog
(re)moved some includes to reduce compile time
This commit is contained in:
thrust26 2020-05-11 16:15:12 +02:00
parent 614e28375d
commit 259c0bf48f
21 changed files with 795 additions and 746 deletions

View File

@ -19,7 +19,6 @@
#define CART_DEBUG_WIDGET_HXX
class GuiObject;
class ButtonWidget;
class StringListWidget;
namespace GUI {
@ -29,8 +28,6 @@ namespace GUI {
#include "Base.hxx" // not needed here, but all child classes need it
#include "Command.hxx"
#include "Widget.hxx"
#include "Debugger.hxx"
#include "CartDebug.hxx"
class CartDebugWidget : public Widget, public CommandSender
{

View File

@ -17,6 +17,8 @@
#include "PopUpWidget.hxx"
#include "Debugger.hxx"
#include "CartDebug.hxx"
#include "CartEnhanced.hxx"
#include "CartEnhancedWidget.hxx"

View File

@ -33,6 +33,7 @@ class TiaOutputWidget;
class TiaZoomWidget;
class CartDebugWidget;
class CartRamWidget;
class OptionsDialog;
namespace Common {
struct Rect;
@ -40,7 +41,6 @@ namespace Common {
#include "Dialog.hxx"
#include "MessageBox.hxx"
#include "OptionsDialog.hxx"
class DebuggerDialog : public Dialog
{

View File

@ -41,7 +41,7 @@ class AudioSettings;
class Menu;
class MessageMenu;
class TimeMachine;
class VideoDialog;
class VideoAudioDialog;
#endif
#ifdef PNG_SUPPORT
class PNGLibrary;

View File

@ -1,353 +0,0 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2020 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#include <sstream>
#include "bspf.hxx"
#include "Console.hxx"
#include "Cart.hxx"
#include "CartDPC.hxx"
#include "Control.hxx"
#include "Dialog.hxx"
#include "Font.hxx"
#include "Menu.hxx"
#include "OSystem.hxx"
#include "PopUpWidget.hxx"
#include "Settings.hxx"
#include "Sound.hxx"
#include "Widget.hxx"
#include "AudioSettings.hxx"
#include "AudioDialog.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AudioDialog::AudioDialog(OSystem& osystem, DialogContainer& parent,
const GUI::Font& font)
: Dialog(osystem, parent, font, "Audio settings")
{
const int lineHeight = font.getLineHeight(),
fontHeight = font.getFontHeight(),
fontWidth = font.getMaxCharWidth();
const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25;
const int INDENT = fontWidth * 2;
const int VGAP = fontHeight / 4;
int xpos, ypos;
int lwidth = font.getStringWidth("Volume "),
pwidth;
WidgetArray wid;
VariantList items;
// Set real dimensions
_w = 48 * fontWidth + HBORDER * 2;
_h = 12 * (lineHeight + VGAP) + VBORDER + _th;
xpos = HBORDER; ypos = VBORDER + _th;
// Enable sound
mySoundEnableCheckbox = new CheckboxWidget(this, font, xpos, ypos,
"Enable sound", kSoundEnableChanged);
wid.push_back(mySoundEnableCheckbox);
ypos += lineHeight + VGAP;
xpos += CheckboxWidget::prefixSize(font);
// Volume
myVolumeSlider = new SliderWidget(this, font, xpos, ypos,
"Volume", lwidth, 0, 4 * fontWidth, "%");
myVolumeSlider->setMinValue(1); myVolumeSlider->setMaxValue(100);
myVolumeSlider->setTickmarkIntervals(4);
wid.push_back(myVolumeSlider);
ypos += lineHeight + VGAP;
// Mode
items.clear();
VarList::push_back(items, "Low quality, medium lag", static_cast<int>(AudioSettings::Preset::lowQualityMediumLag));
VarList::push_back(items, "High quality, medium lag", static_cast<int>(AudioSettings::Preset::highQualityMediumLag));
VarList::push_back(items, "High quality, low lag", static_cast<int>(AudioSettings::Preset::highQualityLowLag));
VarList::push_back(items, "Ultra quality, minimal lag", static_cast<int>(AudioSettings::Preset::ultraQualityMinimalLag));
VarList::push_back(items, "Custom", static_cast<int>(AudioSettings::Preset::custom));
myModePopup = new PopUpWidget(this, font, xpos, ypos,
font.getStringWidth("Ultry quality, minimal lag"), lineHeight,
items, "Mode", lwidth, kModeChanged);
wid.push_back(myModePopup);
ypos += lineHeight + VGAP;
xpos += INDENT;
// Fragment size
pwidth = font.getStringWidth("512 samples") + 7;
lwidth = font.getStringWidth("Resampling quality ");
items.clear();
VarList::push_back(items, "128 samples", 128);
VarList::push_back(items, "256 samples", 256);
VarList::push_back(items, "512 samples", 512);
VarList::push_back(items, "1k samples", 1024);
VarList::push_back(items, "2k samples", 2048);
VarList::push_back(items, "4K samples", 4096);
myFragsizePopup = new PopUpWidget(this, font, xpos, ypos,
pwidth, lineHeight,
items, "Fragment size", lwidth);
wid.push_back(myFragsizePopup);
ypos += lineHeight + VGAP;
// Output frequency
items.clear();
VarList::push_back(items, "44100 Hz", 44100);
VarList::push_back(items, "48000 Hz", 48000);
VarList::push_back(items, "96000 Hz", 96000);
myFreqPopup = new PopUpWidget(this, font, xpos, ypos,
pwidth, lineHeight,
items, "Sample rate", lwidth);
wid.push_back(myFreqPopup);
ypos += lineHeight + VGAP;
// Resampling quality
items.clear();
VarList::push_back(items, "Low", static_cast<int>(AudioSettings::ResamplingQuality::nearestNeightbour));
VarList::push_back(items, "High", static_cast<int>(AudioSettings::ResamplingQuality::lanczos_2));
VarList::push_back(items, "Ultra", static_cast<int>(AudioSettings::ResamplingQuality::lanczos_3));
myResamplingPopup = new PopUpWidget(this, font, xpos, ypos,
pwidth, lineHeight,
items, "Resampling quality ", lwidth);
wid.push_back(myResamplingPopup);
ypos += lineHeight + VGAP;
// Param 1
int swidth = pwidth+23;
myHeadroomSlider = new SliderWidget(this, font, xpos, ypos, swidth, lineHeight,
"Headroom ", 0, kHeadroomChanged, 10 * fontWidth);
myHeadroomSlider->setMinValue(0); myHeadroomSlider->setMaxValue(AudioSettings::MAX_HEADROOM);
myHeadroomSlider->setTickmarkIntervals(5);
wid.push_back(myHeadroomSlider);
ypos += lineHeight + VGAP;
// Param 2
myBufferSizeSlider = new SliderWidget(this, font, xpos, ypos, swidth, lineHeight,
"Buffer size ", 0, kBufferSizeChanged, 10 * fontWidth);
myBufferSizeSlider->setMinValue(0); myBufferSizeSlider->setMaxValue(AudioSettings::MAX_BUFFER_SIZE);
myBufferSizeSlider->setTickmarkIntervals(5);
wid.push_back(myBufferSizeSlider);
ypos += lineHeight + VGAP;
// Stereo sound
xpos -= INDENT;
myStereoSoundCheckbox = new CheckboxWidget(this, font, xpos, ypos,
"Stereo for all ROMs");
wid.push_back(myStereoSoundCheckbox);
ypos += lineHeight + VGAP;
myDpcPitch = new SliderWidget(this, font, xpos, ypos, swidth - 16, lineHeight,
"Pitfall II music pitch ", 0, 0, 5 * fontWidth);
myDpcPitch->setMinValue(10000); myDpcPitch->setMaxValue(30000);
myDpcPitch->setStepValue(100);
myDpcPitch->setTickmarkIntervals(2);
wid.push_back(myDpcPitch);
// Add Defaults, OK and Cancel buttons
addDefaultsOKCancelBGroup(wid, font);
addToFocusList(wid);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void AudioDialog::loadConfig()
{
AudioSettings& audioSettings = instance().audioSettings();
// Enable sound
mySoundEnableCheckbox->setState(audioSettings.enabled());
// Volume
myVolumeSlider->setValue(audioSettings.volume());
// Stereo
myStereoSoundCheckbox->setState(audioSettings.stereo());
// DPC Pitch
myDpcPitch->setValue(audioSettings.dpcPitch());
// Preset / mode
myModePopup->setSelected(static_cast<int>(audioSettings.preset()));
updateSettingsWithPreset(instance().audioSettings());
updateEnabledState();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void AudioDialog::updateSettingsWithPreset(AudioSettings& audioSettings)
{
// Fragsize
myFragsizePopup->setSelected(audioSettings.fragmentSize());
// Output frequency
myFreqPopup->setSelected(audioSettings.sampleRate());
// Headroom
myHeadroomSlider->setValue(audioSettings.headroom());
// Buffer size
myBufferSizeSlider->setValue(audioSettings.bufferSize());
// Resampling quality
myResamplingPopup->setSelected(static_cast<int>(audioSettings.resamplingQuality()));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void AudioDialog::saveConfig()
{
AudioSettings& audioSettings = instance().audioSettings();
// Enabled
audioSettings.setEnabled(mySoundEnableCheckbox->getState());
instance().sound().setEnabled(mySoundEnableCheckbox->getState());
// Volume
audioSettings.setVolume(myVolumeSlider->getValue());
instance().sound().setVolume(myVolumeSlider->getValue());
// Stereo
audioSettings.setStereo(myStereoSoundCheckbox->getState());
// DPC Pitch
audioSettings.setDpcPitch(myDpcPitch->getValue());
// update if current cart is Pitfall II
if (instance().hasConsole() && instance().console().cartridge().name() == "CartridgeDPC")
{
CartridgeDPC& cart = static_cast<CartridgeDPC&>(instance().console().cartridge());
cart.setDpcPitch(myDpcPitch->getValue());
}
AudioSettings::Preset preset = static_cast<AudioSettings::Preset>(myModePopup->getSelectedTag().toInt());
audioSettings.setPreset(preset);
if (preset == AudioSettings::Preset::custom) {
// Fragsize
audioSettings.setFragmentSize(myFragsizePopup->getSelectedTag().toInt());
audioSettings.setSampleRate(myFreqPopup->getSelectedTag().toInt());
audioSettings.setHeadroom(myHeadroomSlider->getValue());
audioSettings.setBufferSize(myBufferSizeSlider->getValue());
audioSettings.setResamplingQuality(static_cast<AudioSettings::ResamplingQuality>(myResamplingPopup->getSelectedTag().toInt()));
}
// Only force a re-initialization when necessary, since it can
// be a time-consuming operation
if(instance().hasConsole())
instance().console().initializeAudio();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void AudioDialog::setDefaults()
{
mySoundEnableCheckbox->setState(AudioSettings::DEFAULT_ENABLED);
myVolumeSlider->setValue(AudioSettings::DEFAULT_VOLUME);
myStereoSoundCheckbox->setState(AudioSettings::DEFAULT_STEREO);
myDpcPitch->setValue(AudioSettings::DEFAULT_DPC_PITCH);
myModePopup->setSelected(static_cast<int>(AudioSettings::DEFAULT_PRESET));
if (AudioSettings::DEFAULT_PRESET == AudioSettings::Preset::custom) {
myResamplingPopup->setSelected(static_cast<int>(AudioSettings::DEFAULT_RESAMPLING_QUALITY));
myFragsizePopup->setSelected(AudioSettings::DEFAULT_FRAGMENT_SIZE);
myFreqPopup->setSelected(AudioSettings::DEFAULT_SAMPLE_RATE);
myHeadroomSlider->setValue(AudioSettings::DEFAULT_HEADROOM);
myBufferSizeSlider->setValue(AudioSettings::DEFAULT_BUFFER_SIZE);
}
else updatePreset();
updateEnabledState();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void AudioDialog::updateEnabledState()
{
bool active = mySoundEnableCheckbox->getState();
AudioSettings::Preset preset = static_cast<AudioSettings::Preset>(myModePopup->getSelectedTag().toInt());
bool userMode = preset == AudioSettings::Preset::custom;
myVolumeSlider->setEnabled(active);
myStereoSoundCheckbox->setEnabled(active);
myModePopup->setEnabled(active);
// enable only for Pitfall II cart
myDpcPitch->setEnabled(active && instance().hasConsole() && instance().console().cartridge().name() == "CartridgeDPC");
myFragsizePopup->setEnabled(active && userMode);
myFreqPopup->setEnabled(active && userMode);
myResamplingPopup->setEnabled(active && userMode);
myHeadroomSlider->setEnabled(active && userMode);
myBufferSizeSlider->setEnabled(active && userMode);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void AudioDialog::updatePreset()
{
AudioSettings::Preset preset = static_cast<AudioSettings::Preset>(myModePopup->getSelectedTag().toInt());
// Make a copy that does not affect the actual settings...
AudioSettings audioSettings = instance().audioSettings();
audioSettings.setPersistent(false);
// ... and set the requested preset
audioSettings.setPreset(preset);
updateSettingsWithPreset(audioSettings);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void AudioDialog::handleCommand(CommandSender* sender, int cmd,
int data, int id)
{
switch(cmd)
{
case GuiObject::kOKCmd:
saveConfig();
close();
break;
case GuiObject::kDefaultsCmd:
setDefaults();
break;
case kSoundEnableChanged:
updateEnabledState();
break;
case kModeChanged:
updatePreset();
updateEnabledState();
break;
case kHeadroomChanged:
{
std::ostringstream ss;
ss << std::fixed << std::setprecision(1) << (0.5 * myHeadroomSlider->getValue()) << " frames";
myHeadroomSlider->setValueLabel(ss.str());
break;
}
case kBufferSizeChanged:
{
std::ostringstream ss;
ss << std::fixed << std::setprecision(1) << (0.5 * myBufferSizeSlider->getValue()) << " frames";
myBufferSizeSlider->setValueLabel(ss.str());
break;
}
default:
Dialog::handleCommand(sender, cmd, data, 0);
break;
}
}

View File

@ -1,77 +0,0 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2020 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#ifndef AUDIO_DIALOG_HXX
#define AUDIO_DIALOG_HXX
class CommandSender;
class Dialog;
class DialogContainer;
class PopUpWidget;
class SliderWidget;
class StaticTextWidget;
class CheckboxWidget;
class OSystem;
class AudioSettings;
#include "bspf.hxx"
class AudioDialog : public Dialog
{
public:
AudioDialog(OSystem& osystem, DialogContainer& parent, const GUI::Font& font);
virtual ~AudioDialog() = default;
private:
void loadConfig() override;
void saveConfig() override;
void setDefaults() override;
void updatePreset();
void updateEnabledState();
void updateSettingsWithPreset(AudioSettings&);
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
private:
enum {
kSoundEnableChanged = 'ADse',
kModeChanged = 'ADmc',
kHeadroomChanged = 'ADhc',
kBufferSizeChanged = 'ADbc'
};
CheckboxWidget* mySoundEnableCheckbox{nullptr};
SliderWidget* myVolumeSlider{nullptr};
CheckboxWidget* myStereoSoundCheckbox{nullptr};
PopUpWidget* myModePopup{nullptr};
PopUpWidget* myFragsizePopup{nullptr};
PopUpWidget* myFreqPopup{nullptr};
PopUpWidget* myResamplingPopup{nullptr};
SliderWidget* myHeadroomSlider{nullptr};
SliderWidget* myBufferSizeSlider{nullptr};
SliderWidget* myDpcPitch{nullptr};
private:
// Following constructors and assignment operators not supported
AudioDialog() = delete;
AudioDialog(const AudioDialog&) = delete;
AudioDialog(AudioDialog&&) = delete;
AudioDialog& operator=(const AudioDialog&) = delete;
AudioDialog& operator=(AudioDialog&&) = delete;
};
#endif

View File

@ -499,31 +499,6 @@ void DeveloperDialog::addTimeMachineTab(const GUI::Font& font)
lineHeight, items, "Horizon ~ ", 0, kHorizonChanged);
wid.push_back(myStateHorizonWidget);
xpos = HBORDER + INDENT;
ypos += lineHeight + VGAP * 2;
new StaticTextWidget(myTab, font, HBORDER, ypos + 1,
"When entering/exiting emulation:");
ypos += lineHeight + VGAP;
mySaveOnExitGroup = new RadioButtonGroup();
r = new RadioButtonWidget(myTab, font, xpos, ypos + 1,
"Do nothing", mySaveOnExitGroup);
wid.push_back(r);
ypos += lineHeight + VGAP;
r = new RadioButtonWidget(myTab, font, xpos, ypos + 1,
"Save current state in current slot", mySaveOnExitGroup);
wid.push_back(r);
ypos += lineHeight + VGAP;
r = new RadioButtonWidget(myTab, font, xpos, ypos + 1,
"Load/save all Time Machine states", mySaveOnExitGroup);
wid.push_back(r);
ypos += lineHeight + VGAP;
xpos = HBORDER;
myAutoSlotWidget = new CheckboxWidget(myTab, font, xpos, ypos + 1, "Automatically change save state slots");
wid.push_back(myAutoSlotWidget);
ypos += lineHeight + VGAP;
// Add message concerning usage
const GUI::Font& infofont = instance().frameBuffer().infoFont();
ypos = myTab->getHeight() - fontHeight - infofont.getFontHeight() - VGAP - VBORDER;
@ -678,8 +653,6 @@ void DeveloperDialog::loadSettings(SettingsSet set)
myUncompressed[set] = instance().settings().getInt(prefix + "tm.uncompressed");
myStateInterval[set] = instance().settings().getString(prefix + "tm.interval");
myStateHorizon[set] = instance().settings().getString(prefix + "tm.horizon");
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -871,12 +844,6 @@ void DeveloperDialog::loadConfig()
// Debug colours
handleDebugColours(instance().settings().getString("tia.dbgcolors"));
// Save on exit
string saveOnExit = instance().settings().getString("saveonexit");
mySaveOnExitGroup->setSelected(saveOnExit == "all" ? 2 : saveOnExit == "current" ? 1 : 0);
// Automatically change save state slots
myAutoSlotWidget->setState(instance().settings().getBool("autoslot"));
#ifdef DEBUGGER_SUPPORT
uInt32 w, h;
@ -953,13 +920,6 @@ void DeveloperDialog::saveConfig()
instance().state().setRewindMode(myTimeMachineWidget->getState() ?
StateManager::Mode::TimeMachine : StateManager::Mode::Off);
// Save on exit
int saveOnExit = mySaveOnExitGroup->getSelected();
instance().settings().setValue("saveonexit",
saveOnExit == 0 ? "none" : saveOnExit == 1 ? "current" : "all");
// Automatically change save state slots
instance().settings().setValue("autoslot", myAutoSlotWidget->getState());
#ifdef DEBUGGER_SUPPORT
// Debugger font style
instance().settings().setValue("dbg.fontstyle",
@ -1050,8 +1010,6 @@ void DeveloperDialog::setDefaults()
myStateHorizon[set] = devSettings ? "30s" : "10m";
setWidgetStates(set);
mySaveOnExitGroup->setSelected(0);
myAutoSlotWidget->setState(false);
break;
case 4: // Debugger options

View File

@ -135,8 +135,6 @@ class DeveloperDialog : public Dialog
SliderWidget* myUncompressedWidget{nullptr};
PopUpWidget* myStateIntervalWidget{nullptr};
PopUpWidget* myStateHorizonWidget{nullptr};
RadioButtonGroup* mySaveOnExitGroup{nullptr};
CheckboxWidget* myAutoSlotWidget{nullptr};
#ifdef DEBUGGER_SUPPORT
// Debugger UI widgets

283
src/gui/EmulationDialog.cxx Normal file
View File

@ -0,0 +1,283 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2020 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#include "Console.hxx"
#include "FrameBuffer.hxx"
#include "RadioButtonWidget.hxx"
#include "TIASurface.hxx"
#include "EmulationDialog.hxx"
namespace {
// Emulation speed is a positive float that multiplies the framerate. However, the UI controls
// adjust speed in terms of a speedup factor (1/10, 1/9 .. 1/2, 1, 2, 3, .., 10). The following
// mapping and formatting functions implement this conversion. The speedup factor is represented
// by an integer value between -900 and 900 (0 means no speedup).
constexpr int MAX_SPEED = 900;
constexpr int MIN_SPEED = -900;
constexpr int SPEED_STEP = 10;
int mapSpeed(float speed)
{
speed = std::abs(speed);
return BSPF::clamp(
static_cast<int>(round(100 * (speed >= 1 ? speed - 1 : -1 / speed + 1))),
MIN_SPEED, MAX_SPEED
);
}
float unmapSpeed(int speed)
{
float f_speed = static_cast<float>(speed) / 100;
return speed < 0 ? -1 / (f_speed - 1) : 1 + f_speed;
}
string formatSpeed(int speed) {
stringstream ss;
ss
<< std::setw(3) << std::fixed << std::setprecision(0)
<< (unmapSpeed(speed) * 100);
return ss.str();
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EmulationDialog::EmulationDialog(OSystem& osystem, DialogContainer& parent,
const GUI::Font& font, int max_w, int max_h)
: Dialog(osystem, parent, font, "Emulation settings")
{
const int lineHeight = font.getLineHeight(),
fontHeight = font.getFontHeight(),
fontWidth = font.getMaxCharWidth(),
buttonHeight = font.getLineHeight() * 1.25;
const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25;
const int INDENT = fontWidth * 2;
const int VGAP = fontHeight / 4;
int xpos, ypos;
int lwidth = font.getStringWidth("Emulation speed ");
WidgetArray wid;
VariantList items;
const int swidth = fontWidth * 10;
// Set real dimensions
_w = 37 * fontWidth + HBORDER * 2 + CheckboxWidget::prefixSize(_font);
_h = 12 * (lineHeight + VGAP) + VGAP * 7 + VBORDER * 3 + _th + buttonHeight;
xpos = HBORDER; ypos = VBORDER + _th;
// Speed
mySpeed =
new SliderWidget(this, _font, xpos, ypos-1, swidth, lineHeight,
"Emulation speed ", lwidth, kSpeedupChanged, fontWidth * 5, "%");
mySpeed->setMinValue(MIN_SPEED); mySpeed->setMaxValue(MAX_SPEED);
mySpeed->setStepValue(SPEED_STEP);
mySpeed->setTickmarkIntervals(2);
wid.push_back(mySpeed);
ypos += lineHeight + VGAP;
// Use sync to vblank
myUseVSync = new CheckboxWidget(this, _font, xpos, ypos + 1, "VSync");
wid.push_back(myUseVSync);
ypos += lineHeight + VGAP;
myTurbo = new CheckboxWidget(this, _font, xpos, ypos + 1, "Turbo mode");
wid.push_back(myTurbo);
ypos += lineHeight + VGAP * 3;
// Use multi-threading
myUseThreads = new CheckboxWidget(this, _font, xpos, ypos + 1, "Multi-threading");
wid.push_back(myUseThreads);
ypos += lineHeight + VGAP;
// Skip progress load bars for SuperCharger ROMs
// Doesn't really belong here, but I couldn't find a better place for it
myFastSCBios = new CheckboxWidget(this, _font, xpos, ypos + 1, "Fast SuperCharger load");
wid.push_back(myFastSCBios);
ypos += lineHeight + VGAP;
// Show UI messages onscreen
myUIMessages = new CheckboxWidget(this, _font, xpos, ypos + 1, "Show UI messages");
wid.push_back(myUIMessages);
ypos += lineHeight + VGAP;
// Confirm dialog when exiting emulation
xpos = HBORDER; ypos += VGAP * 3;
myConfirmExitWidget = new CheckboxWidget(this, _font, xpos, ypos, "Confirm exiting emulation");
wid.push_back(myConfirmExitWidget);
xpos = HBORDER + INDENT;
ypos += lineHeight + VGAP * 3;
new StaticTextWidget(this, font, HBORDER, ypos + 1,
"When entering/exiting emulation:");
ypos += lineHeight + VGAP;
mySaveOnExitGroup = new RadioButtonGroup();
RadioButtonWidget* r;
r = new RadioButtonWidget(this, font, xpos, ypos + 1,
"Do nothing", mySaveOnExitGroup);
wid.push_back(r);
ypos += lineHeight + VGAP;
r = new RadioButtonWidget(this, font, xpos, ypos + 1,
"Save current state in current slot", mySaveOnExitGroup);
wid.push_back(r);
ypos += lineHeight + VGAP;
r = new RadioButtonWidget(this, font, xpos, ypos + 1,
"Load/save all Time Machine states", mySaveOnExitGroup);
wid.push_back(r);
ypos += lineHeight + VGAP;
xpos = HBORDER;
myAutoSlotWidget = new CheckboxWidget(this, font, xpos, ypos + 1, "Automatically change save state slots");
wid.push_back(myAutoSlotWidget);
ypos += lineHeight + VGAP;
// Add Defaults, OK and Cancel buttons
addDefaultsOKCancelBGroup(wid, font);
addToFocusList(wid);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EmulationDialog::loadConfig()
{
Settings& settings = instance().settings();
// Emulation speed
int speed = mapSpeed(settings.getFloat("speed"));
mySpeed->setValue(speed);
mySpeed->setValueLabel(formatSpeed(speed));
// Use sync to vertical blank
myUseVSync->setState(settings.getBool("vsync"));
// Enable 'Turbo' mode
myTurbo->setState(settings.getBool("turbo"));
// Show UI messages
myUIMessages->setState(settings.getBool("uimessages"));
// Fast loading of Supercharger BIOS
myFastSCBios->setState(settings.getBool("fastscbios"));
// Multi-threaded rendering
myUseThreads->setState(settings.getBool("threads"));
// Confirm dialog when exiting emulation
myConfirmExitWidget->setState(settings.getBool("confirmexit"));
// Save on exit
string saveOnExit = settings.getString("saveonexit");
mySaveOnExitGroup->setSelected(saveOnExit == "all" ? 2 : saveOnExit == "current" ? 1 : 0);
// Automatically change save state slots
myAutoSlotWidget->setState(settings.getBool("autoslot"));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EmulationDialog::saveConfig()
{
Settings& settings = instance().settings();
// Speed
const int speedup = mySpeed->getValue();
settings.setValue("speed", unmapSpeed(speedup));
if(instance().hasConsole())
instance().console().initializeAudio();
// Use sync to vertical blank
settings.setValue("vsync", myUseVSync->getState());
// Enable 'Turbo' mode
settings.setValue("turbo", myTurbo->getState());
// Show UI messages
settings.setValue("uimessages", myUIMessages->getState());
// Fast loading of Supercharger BIOS
settings.setValue("fastscbios", myFastSCBios->getState());
// Multi-threaded rendering
settings.setValue("threads", myUseThreads->getState());
// Confirm dialog when exiting emulation
settings.setValue("confirmexit", myConfirmExitWidget->getState());
// Save on exit
int saveOnExit = mySaveOnExitGroup->getSelected();
settings.setValue("saveonexit",
saveOnExit == 0 ? "none" : saveOnExit == 1 ? "current" : "all");
// Automatically change save state slots
settings.setValue("autoslot", myAutoSlotWidget->getState());
if(instance().hasConsole())
{
// update speed
instance().console().initializeAudio();
// update VSync
instance().console().initializeVideo();
instance().frameBuffer().tiaSurface().ntsc().enableThreading(myUseThreads->getState());
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EmulationDialog::setDefaults()
{
// speed
mySpeed->setValue(0);
myUseVSync->setState(true);
// misc
myUIMessages->setState(true);
myFastSCBios->setState(true);
myUseThreads->setState(false);
myConfirmExitWidget->setState(false);
mySaveOnExitGroup->setSelected(0);
myAutoSlotWidget->setState(false);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EmulationDialog::handleCommand(CommandSender* sender, int cmd,
int data, int id)
{
switch(cmd)
{
case GuiObject::kOKCmd:
saveConfig();
close();
break;
case GuiObject::kDefaultsCmd:
setDefaults();
break;
case kSpeedupChanged:
mySpeed->setValueLabel(formatSpeed(mySpeed->getValue()));
break;
default:
Dialog::handleCommand(sender, cmd, data, 0);
break;
}
}

View File

@ -0,0 +1,63 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2020 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#ifndef EMULATION_DIALOG_HXX
#define EMULATION_DIALOG_HXX
class RadioButtonGroup;
#include "Dialog.hxx"
class EmulationDialog : public Dialog
{
public:
EmulationDialog(OSystem& osystem, DialogContainer& parent, const GUI::Font& font,
int max_w, int max_h);
virtual ~EmulationDialog() = default;
private:
void loadConfig() override;
void saveConfig() override;
void setDefaults() override;
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
private:
SliderWidget* mySpeed{nullptr};
CheckboxWidget* myUseVSync{nullptr};
CheckboxWidget* myTurbo{nullptr};
CheckboxWidget* myUIMessages{nullptr};
CheckboxWidget* myFastSCBios{nullptr};
CheckboxWidget* myUseThreads{nullptr};
CheckboxWidget* myConfirmExitWidget{nullptr};
RadioButtonGroup* mySaveOnExitGroup{nullptr};
CheckboxWidget* myAutoSlotWidget{nullptr};
enum {
kSpeedupChanged = 'EDSp',
};
private:
// Following constructors and assignment operators not supported
EmulationDialog() = delete;
EmulationDialog(const EmulationDialog&) = delete;
EmulationDialog(EmulationDialog&&) = delete;
EmulationDialog& operator=(const EmulationDialog&) = delete;
EmulationDialog& operator=(EmulationDialog&&) = delete;
};
#endif

View File

@ -53,7 +53,7 @@ InputDialog::InputDialog(OSystem& osystem, DialogContainer& parent,
int xpos, ypos, tabID;
// Set real dimensions
setSize(50 * fontWidth + HBORDER * 2,
setSize(48 * fontWidth + PopUpWidget::dropDownWidth(_font) + HBORDER * 2,
_th + VGAP * 3 + lineHeight + 13 * (lineHeight + VGAP) + VGAP * 8 + buttonHeight + VBORDER * 3,
max_w, max_h);

View File

@ -23,8 +23,8 @@
#include "Widget.hxx"
#include "Font.hxx"
#include "Control.hxx"
#include "VideoDialog.hxx"
#include "AudioDialog.hxx"
#include "EmulationDialog.hxx"
#include "VideoAudioDialog.hxx"
#include "InputDialog.hxx"
#include "UIDialog.hxx"
#include "SnapshotDialog.hxx"
@ -89,13 +89,10 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
return bw;
};
b = ADD_OD_BUTTON("Video" + ELLIPSIS, kVidCmd);
b = ADD_OD_BUTTON("Video & Audio" + ELLIPSIS, kVidCmd);
wid.push_back(b);
b = ADD_OD_BUTTON("Audio" + ELLIPSIS, kAudCmd);
#ifndef SOUND_SUPPORT
b->clearFlags(Widget::FLAG_ENABLED);
#endif
b = ADD_OD_BUTTON("Emulation" + ELLIPSIS, kEmuCmd);
wid.push_back(b);
b = ADD_OD_BUTTON("Input" + ELLIPSIS, kInptCmd);
@ -143,8 +140,8 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
addCancelWidget(b);
// Now create all the dialogs attached to each menu button
myVideoDialog = make_unique<VideoDialog>(osystem, parent, _font, max_w, max_h);
myAudioDialog = make_unique<AudioDialog>(osystem, parent, _font);
myVideoDialog = make_unique<VideoAudioDialog>(osystem, parent, _font, max_w, max_h);
myEmulationDialog= make_unique<EmulationDialog>(osystem, parent, _font, max_w, max_h);
myInputDialog = make_unique<InputDialog>(osystem, parent, _font, max_w, max_h);
myUIDialog = make_unique<UIDialog>(osystem, parent, _font, boss, max_w, max_h);
mySnapshotDialog = make_unique<SnapshotDialog>(osystem, parent, _font, max_w, max_h);
@ -212,6 +209,10 @@ void OptionsDialog::handleCommand(CommandSender* sender, int cmd,
instance().eventHandler().leaveMenuMode();
break;
case kEmuCmd:
myEmulationDialog->open();
break;
case kVidCmd:
{
// This dialog is resizable under certain conditions, so we need
@ -220,17 +221,12 @@ void OptionsDialog::handleCommand(CommandSender* sender, int cmd,
if(myVideoDialog == nullptr || myVideoDialog->shouldResize(w, h))
{
myVideoDialog = make_unique<VideoDialog>(instance(), parent(),
myVideoDialog = make_unique<VideoAudioDialog>(instance(), parent(),
instance().frameBuffer().font(), w, h);
}
myVideoDialog->open();
break;
}
case kAudCmd:
myAudioDialog->open();
break;
case kInptCmd:
{
// This dialog is resizable under certain conditions, so we need

View File

@ -22,8 +22,8 @@ class CommandSender;
class DialogContainer;
class GuiObject;
class OSystem;
class VideoDialog;
class AudioDialog;
class EmulationDialog;
class VideoAudioDialog;
class InputDialog;
class UIDialog;
class SnapshotDialog;
@ -52,8 +52,8 @@ class OptionsDialog : public Dialog
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
private:
unique_ptr<VideoDialog> myVideoDialog;
unique_ptr<AudioDialog> myAudioDialog;
unique_ptr<VideoAudioDialog> myVideoDialog;
unique_ptr<EmulationDialog> myEmulationDialog;
unique_ptr<InputDialog> myInputDialog;
unique_ptr<UIDialog> myUIDialog;
unique_ptr<SnapshotDialog> mySnapshotDialog;
@ -78,7 +78,7 @@ class OptionsDialog : public Dialog
enum {
kBasSetCmd = 'BAST',
kVidCmd = 'VIDO',
kAudCmd = 'AUDO',
kEmuCmd = 'EMUO',
kInptCmd = 'INPT',
kUsrIfaceCmd = 'URIF',
kSnapCmd = 'SNAP',

View File

@ -127,13 +127,8 @@ UIDialog::UIDialog(OSystem& osystem, DialogContainer& parent,
myCenter = new CheckboxWidget(myTab, _font, xpos, ypos + 1, "Center windows");
wid.push_back(myCenter);
// Confirm dialog when exiting emulation
xpos = HBORDER; ypos += lineHeight + VGAP * 2;
myConfirmExitWidget = new CheckboxWidget(myTab, font, xpos, ypos, "Confirm exiting emulation");
wid.push_back(myConfirmExitWidget);
ypos += lineHeight + VGAP * 3;
// Delay between quick-selecting characters in ListWidget
xpos = HBORDER; ypos += lineHeight + VGAP * 4;
int swidth = myPalettePopup->getWidth() - lwidth;
myListDelaySlider = new SliderWidget(myTab, font, xpos, ypos, swidth, lineHeight,
"List input delay ", 0, kListDelay,
@ -384,9 +379,6 @@ void UIDialog::loadConfig()
// Center window
myCenter->setState(settings.getBool("center"));
// Confirm dialog when exiting emulation
myConfirmExitWidget->setState(settings.getBool("confirmexit"));
// Listwidget quick delay
int delay = settings.getInt("listdelay");
myListDelaySlider->setValue(delay);
@ -462,9 +454,6 @@ void UIDialog::saveConfig()
// Center window
settings.setValue("center", myCenter->getState());
// Confirm dialog when exiting emulation
settings.setValue("confirmexit", myConfirmExitWidget->getState());
// Listwidget quick delay
settings.setValue("listdelay", myListDelaySlider->getValue());
FileListWidget::setQuickSelectDelay(myListDelaySlider->getValue());
@ -501,7 +490,6 @@ void UIDialog::setDefaults()
myHidpiWidget->setState(false);
myPositionPopup->setSelected("0");
myCenter->setState(false);
myConfirmExitWidget->setState(false);
myListDelaySlider->setValue(300);
myWheelLinesSlider->setValue(4);
myDoubleClickSlider->setValue(500);

View File

@ -70,7 +70,6 @@ class UIDialog : public Dialog, public CommandSender
CheckboxWidget* myHidpiWidget{nullptr};
PopUpWidget* myPositionPopup{nullptr};
CheckboxWidget* myCenter{nullptr};
CheckboxWidget* myConfirmExitWidget{nullptr};
SliderWidget* myListDelaySlider{nullptr};
SliderWidget* myWheelLinesSlider{nullptr};
SliderWidget* myControllerRateSlider{nullptr};

View File

@ -20,6 +20,8 @@
#include "bspf.hxx"
#include "Base.hxx"
#include "Control.hxx"
#include "Cart.hxx"
#include "CartDPC.hxx"
#include "Dialog.hxx"
#include "Menu.hxx"
#include "OSystem.hxx"
@ -30,51 +32,15 @@
#include "PaletteHandler.hxx"
#include "TIA.hxx"
#include "Settings.hxx"
#include "Sound.hxx"
#include "AudioSettings.hxx"
#include "Widget.hxx"
#include "Font.hxx"
#include "TabWidget.hxx"
#include "NTSCFilter.hxx"
#include "TIASurface.hxx"
#include "VideoDialog.hxx"
namespace {
// Emulation speed is a positive float that multiplies the framerate. However, the UI controls
// adjust speed in terms of a speedup factor (1/10, 1/9 .. 1/2, 1, 2, 3, .., 10). The following
// mapping and formatting functions implement this conversion. The speedup factor is represented
// by an integer value between -900 and 900 (0 means no speedup).
constexpr int MAX_SPEED = 900;
constexpr int MIN_SPEED = -900;
constexpr int SPEED_STEP = 10;
int mapSpeed(float speed)
{
speed = std::abs(speed);
return BSPF::clamp(
static_cast<int>(round(100 * (speed >= 1 ? speed - 1 : -1 / speed + 1))),
MIN_SPEED, MAX_SPEED
);
}
float unmapSpeed(int speed)
{
float f_speed = static_cast<float>(speed) / 100;
return speed < 0 ? -1 / (f_speed - 1) : 1 + f_speed;
}
string formatSpeed(int speed) {
stringstream ss;
ss
<< std::setw(3) << std::fixed << std::setprecision(0)
<< (unmapSpeed(speed) * 100);
return ss.str();
}
}
#include "VideoAudioDialog.hxx"
#define CREATE_CUSTOM_SLIDERS(obj, desc, cmd) \
myTV ## obj = \
@ -87,9 +53,9 @@ namespace {
ypos += lineHeight + VGAP;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
VideoAudioDialog::VideoAudioDialog(OSystem& osystem, DialogContainer& parent,
const GUI::Font& font, int max_w, int max_h)
: Dialog(osystem, parent, font, "Video settings")
: Dialog(osystem, parent, font, "Video & Audio settings")
{
const int lineHeight = _font.getLineHeight(),
fontHeight = _font.getFontHeight(),
@ -101,8 +67,8 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
int xpos, ypos;
// Set real dimensions
setSize(57 * fontWidth + HBORDER * 2 + PopUpWidget::dropDownWidth(font) * 2,
_th + VGAP * 3 + lineHeight + 11 * (lineHeight + VGAP) + buttonHeight + VBORDER * 3,
setSize(44 * fontWidth + HBORDER * 2 + PopUpWidget::dropDownWidth(font) * 2,
_th + VGAP * 6 + lineHeight + 10 * (lineHeight + VGAP) + buttonHeight + VBORDER * 3,
max_w, max_h);
// The tab widget
@ -112,9 +78,10 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
_h - _th - VGAP - buttonHeight - VBORDER * 2);
addTabWidget(myTab);
addGeneralTab();
addDisplayTab();
addPaletteTab();
addTVEffectsTab();
addAudioTab();
//const int req_w = std::max(myFastSCBios->getRight(), myCloneBad->getRight()) + HBORDER + 1;
//const int req_h = _th + VGAP * 3
@ -141,7 +108,7 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::addGeneralTab()
void VideoAudioDialog::addDisplayTab()
{
const int lineHeight = _font.getLineHeight(),
fontHeight = _font.getFontHeight(),
@ -152,24 +119,32 @@ void VideoDialog::addGeneralTab()
const int HBORDER = fontWidth * 1.25;
const int INDENT = CheckboxWidget::prefixSize(_font);
const int lwidth = _font.getStringWidth("V-Size adjust "),
pwidth = _font.getStringWidth("XXXXxXXXX");
pwidth = _font.getStringWidth("OpenGLES2");
int xpos = HBORDER,
ypos = VBORDER;
WidgetArray wid;
VariantList items;
const int tabID = myTab->addTab(" General ");
const int tabID = myTab->addTab(" Display ", TabWidget::AUTO_WIDTH);
// Video renderer
myRenderer = new PopUpWidget(myTab, _font, xpos, ypos, pwidth, lineHeight,
instance().frameBuffer().supportedRenderers(),
"Renderer ", lwidth);
wid.push_back(myRenderer);
const int swidth = myRenderer->getWidth() - lwidth;
ypos += lineHeight + VGAP;
// TIA interpolation
myTIAInterpolate = new CheckboxWidget(myTab, _font, xpos, ypos + 1, "Interpolation ");
wid.push_back(myTIAInterpolate); ypos += lineHeight + VGAP * 4;
// TIA zoom levels (will be dynamically filled later)
myTIAZoom = new SliderWidget(myTab, _font, xpos, ypos - 1, swidth, lineHeight,
"Zoom ", lwidth, 0, fontWidth * 4, "%");
myTIAZoom->setMinValue(200); myTIAZoom->setStepValue(FrameBuffer::ZOOM_STEPS * 100);
wid.push_back(myTIAZoom);
ypos += lineHeight + VGAP;
// Fullscreen
myFullscreen = new CheckboxWidget(myTab, _font, xpos, ypos + 1, "Fullscreen", kFullScreenChanged);
wid.push_back(myFullscreen);
@ -187,7 +162,6 @@ void VideoDialog::addGeneralTab()
ypos += lineHeight + VGAP;
// FS overscan
const int swidth = myRenderer->getWidth() - lwidth;
myTVOverscan = new SliderWidget(myTab, _font, xpos + INDENT, ypos - 1, swidth, lineHeight,
"Overscan", lwidth - INDENT, kOverscanChanged, fontWidth * 3, "%");
myTVOverscan->setMinValue(0); myTVOverscan->setMaxValue(10);
@ -195,13 +169,6 @@ void VideoDialog::addGeneralTab()
wid.push_back(myTVOverscan);
ypos += lineHeight + VGAP;
// TIA zoom levels (will be dynamically filled later)
myTIAZoom = new SliderWidget(myTab, _font, xpos, ypos - 1, swidth, lineHeight,
"Zoom ", lwidth, 0, fontWidth * 4, "%");
myTIAZoom->setMinValue(200); myTIAZoom->setStepValue(FrameBuffer::ZOOM_STEPS * 100);
wid.push_back(myTIAZoom);
ypos += lineHeight + VGAP;
// Vertical size
myVSizeAdjust =
new SliderWidget(myTab, _font, xpos, ypos-1, swidth, lineHeight,
@ -209,47 +176,13 @@ void VideoDialog::addGeneralTab()
myVSizeAdjust->setMinValue(-5); myVSizeAdjust->setMaxValue(5);
myVSizeAdjust->setTickmarkIntervals(2);
wid.push_back(myVSizeAdjust);
ypos += lineHeight + VGAP * 4;
// Speed
mySpeed =
new SliderWidget(myTab, _font, xpos, ypos-1, swidth, lineHeight,
"Emul. speed ", lwidth, kSpeedupChanged, fontWidth * 5, "%");
mySpeed->setMinValue(MIN_SPEED); mySpeed->setMaxValue(MAX_SPEED);
mySpeed->setStepValue(SPEED_STEP);
mySpeed->setTickmarkIntervals(2);
wid.push_back(mySpeed);
ypos += lineHeight + VGAP;
// Use sync to vblank
myUseVSync = new CheckboxWidget(myTab, _font, xpos, ypos + 1, "VSync");
wid.push_back(myUseVSync);
// Move over to the next column
xpos = myVSizeAdjust->getRight() + fontWidth * 3;
ypos = VBORDER;
// Skip progress load bars for SuperCharger ROMs
// Doesn't really belong here, but I couldn't find a better place for it
myFastSCBios = new CheckboxWidget(myTab, _font, xpos, ypos + 1, "Fast SuperCharger load");
wid.push_back(myFastSCBios);
ypos += lineHeight + VGAP;
// Show UI messages onscreen
myUIMessages = new CheckboxWidget(myTab, _font, xpos, ypos + 1, "Show UI messages");
wid.push_back(myUIMessages);
ypos += lineHeight + VGAP;
// Use multi-threading
myUseThreads = new CheckboxWidget(myTab, _font, xpos, ypos + 1, "Multi-threading");
wid.push_back(myUseThreads);
// Add items for tab 0
addToFocusList(wid, myTab, tabID);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::addPaletteTab()
void VideoAudioDialog::addPaletteTab()
{
const int lineHeight = _font.getLineHeight(),
fontHeight = _font.getFontHeight(),
@ -265,7 +198,7 @@ void VideoDialog::addPaletteTab()
ypos = VBORDER;
WidgetArray wid;
VariantList items;
const int tabID = myTab->addTab(" Palettes ");
const int tabID = myTab->addTab(" Palettes ", TabWidget::AUTO_WIDTH);
// TIA Palette
items.clear();
@ -308,15 +241,16 @@ void VideoDialog::addPaletteTab()
CREATE_CUSTOM_SLIDERS(Gamma, "Gamma ", kPaletteUpdated)
// The resulting palette
addPalette(myPhaseShiftNtsc->getRight() + fontWidth * 2, VBORDER,
fontWidth * 2 * 8, myTVGamma->getBottom() - myTIAPalette->getTop());
xpos = myPhaseShiftNtsc->getRight() + fontWidth * 2;
addPalette(xpos, VBORDER, _w - 2 * 2 - HBORDER - xpos,
myTVGamma->getBottom() - myTIAPalette->getTop());
// Add items for tab 2
addToFocusList(wid, myTab, tabID);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::addTVEffectsTab()
void VideoAudioDialog::addTVEffectsTab()
{
const int lineHeight = _font.getLineHeight(),
fontHeight = _font.getFontHeight(),
@ -332,7 +266,7 @@ void VideoDialog::addTVEffectsTab()
const int pwidth = _font.getStringWidth("Bad adjust ");
WidgetArray wid;
VariantList items;
const int tabID = myTab->addTab(" TV Effects ");
const int tabID = myTab->addTab(" TV Effects ", TabWidget::AUTO_WIDTH);
items.clear();
VarList::push_back(items, "Disabled", static_cast<uInt32>(NTSCFilter::Preset::OFF));
@ -403,11 +337,138 @@ void VideoDialog::addTVEffectsTab()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::loadConfig()
void VideoAudioDialog::addAudioTab()
{
const int lineHeight = _font.getLineHeight(),
fontHeight = _font.getFontHeight(),
fontWidth = _font.getMaxCharWidth();
const int VBORDER = fontHeight / 2;
const int HBORDER = fontWidth * 1.25;
const int INDENT = CheckboxWidget::prefixSize(_font);
const int VGAP = fontHeight / 4;
int xpos, ypos;
int lwidth = _font.getStringWidth("Volume "),
pwidth;
WidgetArray wid;
VariantList items;
const int tabID = myTab->addTab(" Audio ", TabWidget::AUTO_WIDTH);
xpos = HBORDER; ypos = VBORDER;
// Enable sound
mySoundEnableCheckbox = new CheckboxWidget(myTab, _font, xpos, ypos,
"Enable sound", kSoundEnableChanged);
wid.push_back(mySoundEnableCheckbox);
ypos += lineHeight + VGAP;
xpos += CheckboxWidget::prefixSize(_font);
// Volume
myVolumeSlider = new SliderWidget(myTab, _font, xpos, ypos,
"Volume", lwidth, 0, 4 * fontWidth, "%");
myVolumeSlider->setMinValue(1); myVolumeSlider->setMaxValue(100);
myVolumeSlider->setTickmarkIntervals(4);
wid.push_back(myVolumeSlider);
ypos += lineHeight + VGAP;
// Mode
items.clear();
VarList::push_back(items, "Low quality, medium lag", static_cast<int>(AudioSettings::Preset::lowQualityMediumLag));
VarList::push_back(items, "High quality, medium lag", static_cast<int>(AudioSettings::Preset::highQualityMediumLag));
VarList::push_back(items, "High quality, low lag", static_cast<int>(AudioSettings::Preset::highQualityLowLag));
VarList::push_back(items, "Ultra quality, minimal lag", static_cast<int>(AudioSettings::Preset::ultraQualityMinimalLag));
VarList::push_back(items, "Custom", static_cast<int>(AudioSettings::Preset::custom));
myModePopup = new PopUpWidget(myTab, _font, xpos, ypos,
_font.getStringWidth("Ultry quality, minimal lag"), lineHeight,
items, "Mode", lwidth, kModeChanged);
wid.push_back(myModePopup);
ypos += lineHeight + VGAP;
xpos += INDENT;
// Fragment size
lwidth = _font.getStringWidth("Resampling quality ");
pwidth = myModePopup->getRight() - xpos - lwidth - PopUpWidget::dropDownWidth(_font);
items.clear();
VarList::push_back(items, "128 samples", 128);
VarList::push_back(items, "256 samples", 256);
VarList::push_back(items, "512 samples", 512);
VarList::push_back(items, "1k samples", 1024);
VarList::push_back(items, "2k samples", 2048);
VarList::push_back(items, "4K samples", 4096);
myFragsizePopup = new PopUpWidget(myTab, _font, xpos, ypos,
pwidth, lineHeight,
items, "Fragment size", lwidth);
wid.push_back(myFragsizePopup);
ypos += lineHeight + VGAP;
// Output frequency
items.clear();
VarList::push_back(items, "44100 Hz", 44100);
VarList::push_back(items, "48000 Hz", 48000);
VarList::push_back(items, "96000 Hz", 96000);
myFreqPopup = new PopUpWidget(myTab, _font, xpos, ypos,
pwidth, lineHeight,
items, "Sample rate", lwidth);
wid.push_back(myFreqPopup);
ypos += lineHeight + VGAP;
// Resampling quality
items.clear();
VarList::push_back(items, "Low", static_cast<int>(AudioSettings::ResamplingQuality::nearestNeightbour));
VarList::push_back(items, "High", static_cast<int>(AudioSettings::ResamplingQuality::lanczos_2));
VarList::push_back(items, "Ultra", static_cast<int>(AudioSettings::ResamplingQuality::lanczos_3));
myResamplingPopup = new PopUpWidget(myTab, _font, xpos, ypos,
pwidth, lineHeight,
items, "Resampling quality ", lwidth);
wid.push_back(myResamplingPopup);
ypos += lineHeight + VGAP;
// Param 1
int swidth = pwidth + PopUpWidget::dropDownWidth(_font);
myHeadroomSlider = new SliderWidget(myTab, _font, xpos, ypos, swidth, lineHeight,
"Headroom ", 0, kHeadroomChanged, 10 * fontWidth);
myHeadroomSlider->setMinValue(0); myHeadroomSlider->setMaxValue(AudioSettings::MAX_HEADROOM);
myHeadroomSlider->setTickmarkIntervals(5);
wid.push_back(myHeadroomSlider);
ypos += lineHeight + VGAP;
// Param 2
myBufferSizeSlider = new SliderWidget(myTab, _font, xpos, ypos, swidth, lineHeight,
"Buffer size ", 0, kBufferSizeChanged, 10 * fontWidth);
myBufferSizeSlider->setMinValue(0); myBufferSizeSlider->setMaxValue(AudioSettings::MAX_BUFFER_SIZE);
myBufferSizeSlider->setTickmarkIntervals(5);
wid.push_back(myBufferSizeSlider);
ypos += lineHeight + VGAP;
// Stereo sound
xpos -= INDENT;
myStereoSoundCheckbox = new CheckboxWidget(myTab, _font, xpos, ypos,
"Stereo for all ROMs");
wid.push_back(myStereoSoundCheckbox);
ypos += lineHeight + VGAP;
swidth += INDENT - fontWidth * 4;
myDpcPitch = new SliderWidget(myTab, _font, xpos, ypos, swidth, lineHeight,
"Pitfall II music pitch ", 0, 0, 5 * fontWidth);
myDpcPitch->setMinValue(10000); myDpcPitch->setMaxValue(30000);
myDpcPitch->setStepValue(100);
myDpcPitch->setTickmarkIntervals(2);
wid.push_back(myDpcPitch);
// Add items for tab 4
addToFocusList(wid, myTab, tabID);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoAudioDialog::loadConfig()
{
// Display tab
// Renderer settings
myRenderer->setSelected(instance().settings().getString("video"), "default");
// TIA interpolation
myTIAInterpolate->setState(instance().settings().getBool("tia.inter"));
// TIA zoom levels
// These are dynamically loaded, since they depend on the size of
// the desktop and which renderer we're using
@ -419,6 +480,21 @@ void VideoDialog::loadConfig()
myTIAZoom->setTickmarkIntervals((maxZoom - minZoom) * 2); // every ~50%
myTIAZoom->setValue(instance().settings().getFloat("tia.zoom") * 100);
// Fullscreen
myFullscreen->setState(instance().settings().getBool("fullscreen"));
/*string mode = instance().settings().getString("fullscreenmode");
myFullScreenMode->setSelected(mode);*/
// Fullscreen stretch setting
myUseStretch->setState(instance().settings().getBool("tia.fs_stretch"));
// Fullscreen overscan setting
myTVOverscan->setValue(instance().settings().getInt("tia.fs_overscan"));
handleFullScreenChange();
// Aspect ratio setting (NTSC and PAL)
myVSizeAdjust->setValue(instance().settings().getInt("tia.vsizeadjust"));
/////////////////////////////////////////////////////////////////////////////
// Palettes tab
// TIA Palette
myPalette = instance().settings().getString("palette");
myTIAPalette->setSelected(myPalette, PaletteHandler::SETTING_STANDARD);
@ -435,39 +511,8 @@ void VideoDialog::loadConfig()
handlePaletteChange();
colorPalette();
// TIA interpolation
myTIAInterpolate->setState(instance().settings().getBool("tia.inter"));
// Aspect ratio setting (NTSC and PAL)
myVSizeAdjust->setValue(instance().settings().getInt("tia.vsizeadjust"));
// Emulation speed
int speed = mapSpeed(instance().settings().getFloat("speed"));
mySpeed->setValue(speed);
mySpeed->setValueLabel(formatSpeed(speed));
// Fullscreen
myFullscreen->setState(instance().settings().getBool("fullscreen"));
/*string mode = instance().settings().getString("fullscreenmode");
myFullScreenMode->setSelected(mode);*/
// Fullscreen stretch setting
myUseStretch->setState(instance().settings().getBool("tia.fs_stretch"));
// Fullscreen overscan setting
myTVOverscan->setValue(instance().settings().getInt("tia.fs_overscan"));
handleFullScreenChange();
// Use sync to vertical blank
myUseVSync->setState(instance().settings().getBool("vsync"));
// Show UI messages
myUIMessages->setState(instance().settings().getBool("uimessages"));
// Fast loading of Supercharger BIOS
myFastSCBios->setState(instance().settings().getBool("fastscbios"));
// Multi-threaded rendering
myUseThreads->setState(instance().settings().getBool("threads"));
/////////////////////////////////////////////////////////////////////////////
// TV Effects tab
// TV Mode
myTVMode->setSelected(
instance().settings().getString("tv.filter"), "0");
@ -487,12 +532,60 @@ void VideoDialog::loadConfig()
// TV scanline intensity and interpolation
myTVScanIntense->setValue(instance().settings().getInt("tv.scanlines"));
/////////////////////////////////////////////////////////////////////////////
// Audio tab
AudioSettings& audioSettings = instance().audioSettings();
// Enable sound
#ifndef SOUND_SUPPORT
mySoundEnableCheckbox->setState(audioSettings.enabled());
#else
mySoundEnableCheckbox->setState(false);
#endif
// Volume
myVolumeSlider->setValue(audioSettings.volume());
// Stereo
myStereoSoundCheckbox->setState(audioSettings.stereo());
// DPC Pitch
myDpcPitch->setValue(audioSettings.dpcPitch());
// Preset / mode
myModePopup->setSelected(static_cast<int>(audioSettings.preset()));
updateSettingsWithPreset(instance().audioSettings());
updateEnabledState();
myTab->loadConfig();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::saveConfig()
void VideoAudioDialog::updateSettingsWithPreset(AudioSettings& audioSettings)
{
// Fragsize
myFragsizePopup->setSelected(audioSettings.fragmentSize());
// Output frequency
myFreqPopup->setSelected(audioSettings.sampleRate());
// Headroom
myHeadroomSlider->setValue(audioSettings.headroom());
// Buffer size
myBufferSizeSlider->setValue(audioSettings.bufferSize());
// Resampling quality
myResamplingPopup->setSelected(static_cast<int>(audioSettings.resamplingQuality()));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoAudioDialog::saveConfig()
{
/////////////////////////////////////////////////////////////////////////////
// Display tab
// Renderer setting
instance().settings().setValue("video",
myRenderer->getSelectedTag().toString());
@ -500,10 +593,6 @@ void VideoDialog::saveConfig()
// TIA interpolation
instance().settings().setValue("tia.inter", myTIAInterpolate->getState());
// Note: Palette values are saved directly when changed!
// Fullscreen
instance().settings().setValue("fullscreen", myFullscreen->getState());
// Fullscreen stretch setting
@ -521,26 +610,12 @@ void VideoDialog::saveConfig()
instance().settings().setValue("tia.vsizeadjust", newAdjust);
// Speed
const int speedup = mySpeed->getValue();
instance().settings().setValue("speed", unmapSpeed(speedup));
if (instance().hasConsole())
instance().console().initializeAudio();
// Use sync to vertical blank
instance().settings().setValue("vsync", myUseVSync->getState());
// Note: Palette values are saved directly when changed!
// Show UI messages
instance().settings().setValue("uimessages", myUIMessages->getState());
// Fast loading of Supercharger BIOS
instance().settings().setValue("fastscbios", myFastSCBios->getState());
// Multi-threaded rendering
instance().settings().setValue("threads", myUseThreads->getState());
if (instance().hasConsole())
instance().frameBuffer().tiaSurface().ntsc().enableThreading(myUseThreads->getState());
/////////////////////////////////////////////////////////////////////////////
// TV Effects tab
// TV Mode
instance().settings().setValue("tv.filter",
myTVMode->getSelectedTag().toString());
@ -579,10 +654,51 @@ void VideoDialog::saveConfig()
// ... and apply potential setting changes to the TIA surface
instance().frameBuffer().tiaSurface().updateSurfaceSettings();
/////////////////////////////////////////////////////////////////////////////
// Audio tab
AudioSettings& audioSettings = instance().audioSettings();
// Enabled
audioSettings.setEnabled(mySoundEnableCheckbox->getState());
instance().sound().setEnabled(mySoundEnableCheckbox->getState());
// Volume
audioSettings.setVolume(myVolumeSlider->getValue());
instance().sound().setVolume(myVolumeSlider->getValue());
// Stereo
audioSettings.setStereo(myStereoSoundCheckbox->getState());
// DPC Pitch
audioSettings.setDpcPitch(myDpcPitch->getValue());
// update if current cart is Pitfall II
if (instance().hasConsole() && instance().console().cartridge().name() == "CartridgeDPC")
{
CartridgeDPC& cart = static_cast<CartridgeDPC&>(instance().console().cartridge());
cart.setDpcPitch(myDpcPitch->getValue());
}
AudioSettings::Preset preset = static_cast<AudioSettings::Preset>(myModePopup->getSelectedTag().toInt());
audioSettings.setPreset(preset);
if (preset == AudioSettings::Preset::custom) {
// Fragsize
audioSettings.setFragmentSize(myFragsizePopup->getSelectedTag().toInt());
audioSettings.setSampleRate(myFreqPopup->getSelectedTag().toInt());
audioSettings.setHeadroom(myHeadroomSlider->getValue());
audioSettings.setBufferSize(myBufferSizeSlider->getValue());
audioSettings.setResamplingQuality(static_cast<AudioSettings::ResamplingQuality>(myResamplingPopup->getSelectedTag().toInt()));
}
// Only force a re-initialization when necessary, since it can
// be a time-consuming operation
if(instance().hasConsole())
instance().console().initializeAudio();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::setDefaults()
void VideoAudioDialog::setDefaults()
{
switch(myTab->getActiveTab())
{
@ -597,13 +713,6 @@ void VideoDialog::setDefaults()
myTVOverscan->setValue(0);
myTIAZoom->setValue(300);
myVSizeAdjust->setValue(0);
// speed
mySpeed->setValue(0);
myUseVSync->setState(true);
// misc
myUIMessages->setState(true);
myFastSCBios->setState(true);
myUseThreads->setState(false);
handleFullScreenChange();
break;
@ -640,11 +749,29 @@ void VideoDialog::setDefaults()
loadTVAdjustables(NTSCFilter::Preset::CUSTOM);
break;
}
case 3: // Audio
mySoundEnableCheckbox->setState(AudioSettings::DEFAULT_ENABLED);
myVolumeSlider->setValue(AudioSettings::DEFAULT_VOLUME);
myStereoSoundCheckbox->setState(AudioSettings::DEFAULT_STEREO);
myDpcPitch->setValue(AudioSettings::DEFAULT_DPC_PITCH);
myModePopup->setSelected(static_cast<int>(AudioSettings::DEFAULT_PRESET));
if (AudioSettings::DEFAULT_PRESET == AudioSettings::Preset::custom) {
myResamplingPopup->setSelected(static_cast<int>(AudioSettings::DEFAULT_RESAMPLING_QUALITY));
myFragsizePopup->setSelected(AudioSettings::DEFAULT_FRAGMENT_SIZE);
myFreqPopup->setSelected(AudioSettings::DEFAULT_SAMPLE_RATE);
myHeadroomSlider->setValue(AudioSettings::DEFAULT_HEADROOM);
myBufferSizeSlider->setValue(AudioSettings::DEFAULT_BUFFER_SIZE);
}
else updatePreset();
updateEnabledState();
break;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::handleTVModeChange(NTSCFilter::Preset preset)
void VideoAudioDialog::handleTVModeChange(NTSCFilter::Preset preset)
{
bool enable = preset == NTSCFilter::Preset::CUSTOM;
@ -661,7 +788,7 @@ void VideoDialog::handleTVModeChange(NTSCFilter::Preset preset)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::loadTVAdjustables(NTSCFilter::Preset preset)
void VideoAudioDialog::loadTVAdjustables(NTSCFilter::Preset preset)
{
NTSCFilter::Adjustable adj;
instance().frameBuffer().tiaSurface().ntsc().getAdjustables(
@ -674,7 +801,7 @@ void VideoDialog::loadTVAdjustables(NTSCFilter::Preset preset)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::handlePaletteChange()
void VideoAudioDialog::handlePaletteChange()
{
bool enable = myTIAPalette->getSelectedTag().toString() == "custom";
@ -683,7 +810,7 @@ void VideoDialog::handlePaletteChange()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::handlePaletteUpdate()
void VideoAudioDialog::handlePaletteUpdate()
{
// TIA Palette
instance().settings().setValue("palette",
@ -704,7 +831,7 @@ void VideoDialog::handlePaletteUpdate()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::handleFullScreenChange()
void VideoAudioDialog::handleFullScreenChange()
{
bool enable = myFullscreen->getState();
myUseStretch->setEnabled(enable);
@ -712,7 +839,7 @@ void VideoDialog::handleFullScreenChange()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::handleOverscanChange()
void VideoAudioDialog::handleOverscanChange()
{
if (myTVOverscan->getValue() == 0)
{
@ -724,13 +851,13 @@ void VideoDialog::handleOverscanChange()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::handlePhosphorChange()
void VideoAudioDialog::handlePhosphorChange()
{
myTVPhosLevel->setEnabled(myTVPhosphor->getState());
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::handleCommand(CommandSender* sender, int cmd,
void VideoAudioDialog::handleCommand(CommandSender* sender, int cmd,
int data, int id)
{
switch (cmd)
@ -793,11 +920,6 @@ void VideoDialog::handleCommand(CommandSender* sender, int cmd,
myVSizeAdjust->setValueUnit("%");
break;
}
case kSpeedupChanged:
mySpeed->setValueLabel(formatSpeed(mySpeed->getValue()));
break;
case kFullScreenChanged:
handleFullScreenChange();
break;
@ -845,6 +967,30 @@ void VideoDialog::handleCommand(CommandSender* sender, int cmd,
myTVPhosLevel->setValueUnit("%");
break;
case kSoundEnableChanged:
updateEnabledState();
break;
case kModeChanged:
updatePreset();
updateEnabledState();
break;
case kHeadroomChanged:
{
std::ostringstream ss;
ss << std::fixed << std::setprecision(1) << (0.5 * myHeadroomSlider->getValue()) << " frames";
myHeadroomSlider->setValueLabel(ss.str());
break;
}
case kBufferSizeChanged:
{
std::ostringstream ss;
ss << std::fixed << std::setprecision(1) << (0.5 * myBufferSizeSlider->getValue()) << " frames";
myBufferSizeSlider->setValueLabel(ss.str());
break;
}
default:
Dialog::handleCommand(sender, cmd, data, 0);
break;
@ -852,7 +998,7 @@ void VideoDialog::handleCommand(CommandSender* sender, int cmd,
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::addPalette(int x, int y, int w, int h)
void VideoAudioDialog::addPalette(int x, int y, int w, int h)
{
if(instance().hasConsole())
{
@ -877,7 +1023,7 @@ void VideoDialog::addPalette(int x, int y, int w, int h)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::colorPalette()
void VideoAudioDialog::colorPalette()
{
if(instance().hasConsole())
{
@ -904,3 +1050,37 @@ void VideoDialog::colorPalette()
}
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoAudioDialog::updateEnabledState()
{
bool active = mySoundEnableCheckbox->getState();
AudioSettings::Preset preset = static_cast<AudioSettings::Preset>(myModePopup->getSelectedTag().toInt());
bool userMode = preset == AudioSettings::Preset::custom;
myVolumeSlider->setEnabled(active);
myStereoSoundCheckbox->setEnabled(active);
myModePopup->setEnabled(active);
// enable only for Pitfall II cart
myDpcPitch->setEnabled(active && instance().hasConsole() && instance().console().cartridge().name() == "CartridgeDPC");
myFragsizePopup->setEnabled(active && userMode);
myFreqPopup->setEnabled(active && userMode);
myResamplingPopup->setEnabled(active && userMode);
myHeadroomSlider->setEnabled(active && userMode);
myBufferSizeSlider->setEnabled(active && userMode);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoAudioDialog::updatePreset()
{
AudioSettings::Preset preset = static_cast<AudioSettings::Preset>(myModePopup->getSelectedTag().toInt());
// Make a copy that does not affect the actual settings...
AudioSettings audioSettings = instance().audioSettings();
audioSettings.setPersistent(false);
// ... and set the requested preset
audioSettings.setPreset(preset);
updateSettingsWithPreset(audioSettings);
}

View File

@ -15,8 +15,8 @@
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#ifndef VIDEO_DIALOG_HXX
#define VIDEO_DIALOG_HXX
#ifndef VIDEOAUDIO_DIALOG_HXX
#define VIDEOAUDIO_DIALOG_HXX
class CommandSender;
class CheckboxWidget;
@ -34,21 +34,22 @@ class OSystem;
#include "NTSCFilter.hxx"
#include "bspf.hxx"
class VideoDialog : public Dialog
class VideoAudioDialog : public Dialog
{
public:
VideoDialog(OSystem& osystem, DialogContainer& parent, const GUI::Font& font,
VideoAudioDialog(OSystem& osystem, DialogContainer& parent, const GUI::Font& font,
int max_w, int max_h);
virtual ~VideoDialog() = default;
virtual ~VideoAudioDialog() = default;
private:
void loadConfig() override;
void saveConfig() override;
void setDefaults() override;
void addGeneralTab();
void addDisplayTab();
void addPaletteTab();
void addTVEffectsTab();
void addAudioTab();
void handleTVModeChange(NTSCFilter::Preset);
void loadTVAdjustables(NTSCFilter::Preset preset);
void handlePaletteChange();
@ -59,45 +60,30 @@ class VideoDialog : public Dialog
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
void addPalette(int x, int y, int h, int w);
void colorPalette();
void updatePreset();
void updateEnabledState();
void updateSettingsWithPreset(AudioSettings&);
private:
TabWidget* myTab;
// General options
PopUpWidget* myRenderer{nullptr};
SliderWidget* myTIAZoom{nullptr};
PopUpWidget* myTIAPalette{nullptr};
SliderWidget* myPhaseShiftNtsc{nullptr};
SliderWidget* myPhaseShiftPal{nullptr};
CheckboxWidget* myTIAInterpolate{nullptr};
SliderWidget* myVSizeAdjust{nullptr};
SliderWidget* mySpeed{nullptr};
RadioButtonGroup* myZoomGroup{nullptr};
CheckboxWidget* myFullscreen{nullptr};
//PopUpWidget* myFullScreenMode;
CheckboxWidget* myUseStretch{nullptr};
SliderWidget* myTVOverscan{nullptr};
CheckboxWidget* myUseVSync{nullptr};
CheckboxWidget* myUIMessages{nullptr};
CheckboxWidget* myFastSCBios{nullptr};
CheckboxWidget* myUseThreads{nullptr};
std::array<StaticTextWidget*, 16> myColorLbl{nullptr};
//std::array<ColorWidget*, 16> myColor{nullptr};
ColorWidget* myColor[16][8]{nullptr};
SliderWidget* myTIAZoom{nullptr};
SliderWidget* myVSizeAdjust{nullptr};
// TV effects adjustables (custom mode)
PopUpWidget* myTVMode{nullptr};
SliderWidget* myTVSharp{nullptr};
SliderWidget* myTVHue{nullptr};
SliderWidget* myTVRes{nullptr};
SliderWidget* myTVArtifacts{nullptr};
SliderWidget* myTVFringe{nullptr};
SliderWidget* myTVBleed{nullptr};
SliderWidget* myTVBright{nullptr};
SliderWidget* myTVContrast{nullptr};
SliderWidget* myTVSatur{nullptr};
SliderWidget* myTVGamma{nullptr};
// TV phosphor effect
CheckboxWidget* myTVPhosphor{nullptr};
@ -114,19 +100,43 @@ class VideoDialog : public Dialog
ButtonWidget* myCloneBad{nullptr};
ButtonWidget* myCloneCustom{nullptr};
// Palettes
PopUpWidget* myTIAPalette{nullptr};
SliderWidget* myPhaseShiftNtsc{nullptr};
SliderWidget* myPhaseShiftPal{nullptr};
SliderWidget* myTVHue{nullptr};
SliderWidget* myTVSatur{nullptr};
SliderWidget* myTVBright{nullptr};
SliderWidget* myTVContrast{nullptr};
SliderWidget* myTVGamma{nullptr};
std::array<StaticTextWidget*, 16> myColorLbl{nullptr};
ColorWidget* myColor[16][8]{nullptr};
// Audio
CheckboxWidget* mySoundEnableCheckbox{nullptr};
SliderWidget* myVolumeSlider{nullptr};
CheckboxWidget* myStereoSoundCheckbox{nullptr};
PopUpWidget* myModePopup{nullptr};
PopUpWidget* myFragsizePopup{nullptr};
PopUpWidget* myFreqPopup{nullptr};
PopUpWidget* myResamplingPopup{nullptr};
SliderWidget* myHeadroomSlider{nullptr};
SliderWidget* myBufferSizeSlider{nullptr};
SliderWidget* myDpcPitch{nullptr};
string myPalette;
PaletteHandler::Adjustable myPaletteAdj{0.0F};
enum {
kZoomChanged = 'VDZo',
kVSizeChanged = 'VDVs',
kFullScreenChanged = 'VDFs',
kOverscanChanged = 'VDOv',
kPaletteChanged = 'VDpl',
kNtscShiftChanged = 'VDns',
kPalShiftChanged = 'VDps',
kPaletteUpdated = 'VDpu',
kSpeedupChanged = 'VDSp',
kVSizeChanged = 'VDVs',
kFullScreenChanged = 'VDFs',
kZoomChanged = 'VDZo',
kOverscanChanged = 'VDOv',
kTVModeChanged = 'VDtv',
kCloneCompositeCmd = 'CLcp',
@ -136,16 +146,21 @@ class VideoDialog : public Dialog
kCloneCustomCmd = 'CLcu',
kPhosphorChanged = 'VDph',
kPhosBlendChanged = 'VDbl',
kScanlinesChanged = 'VDsc'
kScanlinesChanged = 'VDsc',
kSoundEnableChanged = 'ADse',
kModeChanged = 'ADmc',
kHeadroomChanged = 'ADhc',
kBufferSizeChanged = 'ADbc'
};
private:
// Following constructors and assignment operators not supported
VideoDialog() = delete;
VideoDialog(const VideoDialog&) = delete;
VideoDialog(VideoDialog&&) = delete;
VideoDialog& operator=(const VideoDialog&) = delete;
VideoDialog& operator=(VideoDialog&&) = delete;
VideoAudioDialog() = delete;
VideoAudioDialog(const VideoAudioDialog&) = delete;
VideoAudioDialog(VideoAudioDialog&&) = delete;
VideoAudioDialog& operator=(const VideoAudioDialog&) = delete;
VideoAudioDialog& operator=(VideoAudioDialog&&) = delete;
};
#endif

View File

@ -2,7 +2,6 @@ MODULE := src/gui
MODULE_OBJS := \
src/gui/AboutDialog.o \
src/gui/AudioDialog.o \
src/gui/BrowserDialog.o \
src/gui/CheckListWidget.o \
src/gui/ColorWidget.o \
@ -15,6 +14,7 @@ MODULE_OBJS := \
src/gui/Dialog.o \
src/gui/EditableWidget.o \
src/gui/EditTextWidget.o \
src/gui/EmulationDialog.o \
src/gui/EventMappingWidget.o \
src/gui/FileListWidget.o \
src/gui/Font.o \
@ -49,7 +49,7 @@ MODULE_OBJS := \
src/gui/TimeMachineDialog.o \
src/gui/TimeMachine.o \
src/gui/UIDialog.o \
src/gui/VideoDialog.o \
src/gui/VideoAudioDialog.o \
src/gui/Widget.o
MODULE_DIRS += \

View File

@ -230,7 +230,7 @@
* the type.
*/
# ifndef PNG_EXPORT_TYPE
# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP
# define PNG_EXPORT_TYPE(name) name PNG_IMPEXP
# endif
# define PNG_DLL_EXPORT __export
# else /* newer compiler */
@ -450,7 +450,7 @@
# define PNG_FP_EXPORT(ordinal, type, name, args)\
PNG_EXPORT(ordinal, type, name, args);
# else /* No floating point APIs */
# define PNG_FP_EXPORT(ordinal, type, name, args)
# define PNG_FP_EXPORT(ordinal, name, name, args)
# endif
#endif
#ifndef PNG_FIXED_EXPORT /* A fixed point API. */
@ -458,7 +458,7 @@
# define PNG_FIXED_EXPORT(ordinal, type, name, args)\
PNG_EXPORT(ordinal, type, name, args);
# else /* No fixed point APIs */
# define PNG_FIXED_EXPORT(ordinal, type, name, args)
# define PNG_FIXED_EXPORT(ordinal, name, name, args)
# endif
#endif

View File

@ -758,6 +758,7 @@
<ClCompile Include="..\emucore\tia\TIA.cxx" />
<ClCompile Include="..\gui\ColorWidget.cxx" />
<ClCompile Include="..\gui\DeveloperDialog.cxx" />
<ClCompile Include="..\gui\EmulationDialog.cxx" />
<ClCompile Include="..\gui\FileListWidget.cxx" />
<ClCompile Include="..\gui\JoystickDialog.cxx" />
<ClCompile Include="..\gui\LoggerDialog.cxx" />
@ -907,7 +908,6 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\gui\AboutDialog.cxx" />
<ClCompile Include="..\gui\AudioDialog.cxx" />
<ClCompile Include="..\gui\BrowserDialog.cxx" />
<ClCompile Include="..\gui\CheckListWidget.cxx" />
<ClCompile Include="..\gui\ComboDialog.cxx" />
@ -939,7 +939,7 @@
<ClCompile Include="..\gui\StringListWidget.cxx" />
<ClCompile Include="..\gui\TabWidget.cxx" />
<ClCompile Include="..\gui\UIDialog.cxx" />
<ClCompile Include="..\gui\VideoDialog.cxx" />
<ClCompile Include="..\gui\VideoAudioDialog.cxx" />
<ClCompile Include="..\gui\Widget.cxx" />
<ClCompile Include="..\zlib\adler32.c">
<CompileAs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">CompileAsC</CompileAs>
@ -1791,6 +1791,7 @@
<ClInclude Include="..\gui\ConsoleMediumBFont.hxx" />
<ClInclude Include="..\gui\ConsoleMediumFont.hxx" />
<ClInclude Include="..\gui\DeveloperDialog.hxx" />
<ClInclude Include="..\gui\EmulationDialog.hxx" />
<ClInclude Include="..\gui\FileListWidget.hxx" />
<ClInclude Include="..\gui\JoystickDialog.hxx" />
<ClInclude Include="..\gui\LoggerDialog.hxx" />
@ -1967,7 +1968,6 @@
<ClInclude Include="..\cheat\CheetahCheat.hxx" />
<ClInclude Include="..\cheat\RamCheat.hxx" />
<ClInclude Include="..\gui\AboutDialog.hxx" />
<ClInclude Include="..\gui\AudioDialog.hxx" />
<ClInclude Include="..\gui\BrowserDialog.hxx" />
<ClInclude Include="..\gui\CheckListWidget.hxx" />
<ClInclude Include="..\gui\ComboDialog.hxx" />
@ -2003,7 +2003,7 @@
<ClInclude Include="..\gui\StringListWidget.hxx" />
<ClInclude Include="..\gui\TabWidget.hxx" />
<ClInclude Include="..\gui\UIDialog.hxx" />
<ClInclude Include="..\gui\VideoDialog.hxx" />
<ClInclude Include="..\gui\VideoAudioDialog.hxx" />
<ClInclude Include="..\gui\Widget.hxx" />
<ClInclude Include="..\zlib\crc32.h" />
<ClInclude Include="..\zlib\deflate.h" />

View File

@ -342,9 +342,6 @@
<ClCompile Include="..\gui\AboutDialog.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
<ClCompile Include="..\gui\AudioDialog.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
<ClCompile Include="..\gui\BrowserDialog.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
@ -438,9 +435,6 @@
<ClCompile Include="..\gui\UIDialog.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
<ClCompile Include="..\gui\VideoDialog.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
<ClCompile Include="..\gui\Widget.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
@ -1005,6 +999,12 @@
<ClCompile Include="..\common\PaletteHandler.cxx">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\gui\EmulationDialog.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
<ClCompile Include="..\gui\VideoAudioDialog.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\common\bspf.hxx">
@ -1316,9 +1316,6 @@
<ClInclude Include="..\gui\AboutDialog.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
<ClInclude Include="..\gui\AudioDialog.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
<ClInclude Include="..\gui\BrowserDialog.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
@ -1424,9 +1421,6 @@
<ClInclude Include="..\gui\UIDialog.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
<ClInclude Include="..\gui\VideoDialog.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
<ClInclude Include="..\gui\Widget.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
@ -2063,6 +2057,12 @@
<ClInclude Include="..\common\PaletteHandler.hxx">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\gui\EmulationDialog.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
<ClInclude Include="..\gui\VideoAudioDialog.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="stella.ico">