mirror of https://github.com/mgba-emu/mgba.git
parent
40d2b0f77a
commit
5fa1638b1d
1
CHANGES
1
CHANGES
|
@ -101,6 +101,7 @@ Misc:
|
||||||
Changes from beta 1:
|
Changes from beta 1:
|
||||||
Features:
|
Features:
|
||||||
- Libretro: Add Game Boy cheat support
|
- Libretro: Add Game Boy cheat support
|
||||||
|
- Qt: Separate fast forward volume control (fixes mgba.io/i/846, mgba.io/i/1143)
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
- PSP2: Fix audio crackling after fast forward
|
- PSP2: Fix audio crackling after fast forward
|
||||||
- PSP2: Fix audio crackling when buffer is full
|
- PSP2: Fix audio crackling when buffer is full
|
||||||
|
|
|
@ -245,6 +245,8 @@ void CoreController::loadConfig(ConfigController* config) {
|
||||||
m_autosave = config->getOption("autosave", false).toInt();
|
m_autosave = config->getOption("autosave", false).toInt();
|
||||||
m_autoload = config->getOption("autoload", true).toInt();
|
m_autoload = config->getOption("autoload", true).toInt();
|
||||||
m_autofireThreshold = config->getOption("autofireThreshold", m_autofireThreshold).toInt();
|
m_autofireThreshold = config->getOption("autofireThreshold", m_autofireThreshold).toInt();
|
||||||
|
m_fastForwardVolume = config->getOption("fastForwardVolume", -1).toInt();
|
||||||
|
m_fastForwardMute = config->getOption("fastForwardMute", -1).toInt();
|
||||||
mCoreLoadForeignConfig(m_threadContext.core, config->config());
|
mCoreLoadForeignConfig(m_threadContext.core, config->config());
|
||||||
if (hasStarted()) {
|
if (hasStarted()) {
|
||||||
updateFastForward();
|
updateFastForward();
|
||||||
|
@ -810,15 +812,29 @@ void CoreController::finishFrame() {
|
||||||
|
|
||||||
void CoreController::updateFastForward() {
|
void CoreController::updateFastForward() {
|
||||||
if (m_fastForward || m_fastForwardForced) {
|
if (m_fastForward || m_fastForwardForced) {
|
||||||
|
if (m_fastForwardVolume >= 0) {
|
||||||
|
m_threadContext.core->opts.volume = m_fastForwardVolume;
|
||||||
|
}
|
||||||
|
if (m_fastForwardMute >= 0) {
|
||||||
|
m_threadContext.core->opts.mute = m_fastForwardMute;
|
||||||
|
}
|
||||||
if (m_fastForwardRatio > 0) {
|
if (m_fastForwardRatio > 0) {
|
||||||
m_threadContext.impl->sync.fpsTarget = m_fpsTarget * m_fastForwardRatio;
|
m_threadContext.impl->sync.fpsTarget = m_fpsTarget * m_fastForwardRatio;
|
||||||
} else {
|
} else {
|
||||||
setSync(false);
|
setSync(false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (!mCoreConfigGetIntValue(&m_threadContext.core->config, "volume", &m_threadContext.core->opts.volume)) {
|
||||||
|
m_threadContext.core->opts.volume = 0x100;
|
||||||
|
}
|
||||||
|
int fakeBool = 0;
|
||||||
|
mCoreConfigGetIntValue(&m_threadContext.core->config, "mute", &fakeBool);
|
||||||
|
m_threadContext.core->opts.mute = fakeBool;
|
||||||
m_threadContext.impl->sync.fpsTarget = m_fpsTarget;
|
m_threadContext.impl->sync.fpsTarget = m_fpsTarget;
|
||||||
setSync(true);
|
setSync(true);
|
||||||
}
|
}
|
||||||
|
// XXX: Have a way of just updating opts
|
||||||
|
m_threadContext.core->loadConfig(m_threadContext.core, &m_threadContext.core->config);
|
||||||
}
|
}
|
||||||
|
|
||||||
CoreController::Interrupter::Interrupter(CoreController* parent, bool fromThread)
|
CoreController::Interrupter::Interrupter(CoreController* parent, bool fromThread)
|
||||||
|
|
|
@ -204,6 +204,8 @@ private:
|
||||||
|
|
||||||
int m_fastForward = false;
|
int m_fastForward = false;
|
||||||
int m_fastForwardForced = false;
|
int m_fastForwardForced = false;
|
||||||
|
int m_fastForwardVolume = -1;
|
||||||
|
int m_fastForwardMute = -1;
|
||||||
float m_fastForwardRatio = -1.f;
|
float m_fastForwardRatio = -1.f;
|
||||||
float m_fpsTarget;
|
float m_fpsTarget;
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,18 @@ SettingsView::SettingsView(ConfigController* controller, InputController* inputC
|
||||||
|
|
||||||
reloadConfig();
|
reloadConfig();
|
||||||
|
|
||||||
|
connect(m_ui.volume, static_cast<void (QSlider::*)(int)>(&QSlider::valueChanged), [this](int v) {
|
||||||
|
if (v < m_ui.volumeFf->value()) {
|
||||||
|
m_ui.volumeFf->setValue(v);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(m_ui.mute, &QAbstractButton::toggled, [this](bool e) {
|
||||||
|
if (e) {
|
||||||
|
m_ui.muteFf->setChecked(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (m_ui.savegamePath->text().isEmpty()) {
|
if (m_ui.savegamePath->text().isEmpty()) {
|
||||||
m_ui.savegameSameDir->setChecked(true);
|
m_ui.savegameSameDir->setChecked(true);
|
||||||
}
|
}
|
||||||
|
@ -339,6 +351,8 @@ void SettingsView::updateConfig() {
|
||||||
saveSetting("lockIntegerScaling", m_ui.lockIntegerScaling);
|
saveSetting("lockIntegerScaling", m_ui.lockIntegerScaling);
|
||||||
saveSetting("volume", m_ui.volume);
|
saveSetting("volume", m_ui.volume);
|
||||||
saveSetting("mute", m_ui.mute);
|
saveSetting("mute", m_ui.mute);
|
||||||
|
saveSetting("fastForwardVolume", m_ui.volumeFf);
|
||||||
|
saveSetting("fastForwardMute", m_ui.muteFf);
|
||||||
saveSetting("rewindEnable", m_ui.rewind);
|
saveSetting("rewindEnable", m_ui.rewind);
|
||||||
saveSetting("rewindBufferCapacity", m_ui.rewindCapacity);
|
saveSetting("rewindBufferCapacity", m_ui.rewindCapacity);
|
||||||
saveSetting("resampleVideo", m_ui.resampleVideo);
|
saveSetting("resampleVideo", m_ui.resampleVideo);
|
||||||
|
@ -460,8 +474,10 @@ void SettingsView::reloadConfig() {
|
||||||
loadSetting("autofireThreshold", m_ui.autofireThreshold);
|
loadSetting("autofireThreshold", m_ui.autofireThreshold);
|
||||||
loadSetting("lockAspectRatio", m_ui.lockAspectRatio);
|
loadSetting("lockAspectRatio", m_ui.lockAspectRatio);
|
||||||
loadSetting("lockIntegerScaling", m_ui.lockIntegerScaling);
|
loadSetting("lockIntegerScaling", m_ui.lockIntegerScaling);
|
||||||
loadSetting("volume", m_ui.volume);
|
loadSetting("volume", m_ui.volume, 0x100);
|
||||||
loadSetting("mute", m_ui.mute);
|
loadSetting("mute", m_ui.mute, false);
|
||||||
|
loadSetting("fastForwardVolume", m_ui.volumeFf, m_ui.volume->value());
|
||||||
|
loadSetting("fastForwardMute", m_ui.muteFf, m_ui.mute->isChecked());
|
||||||
loadSetting("rewindEnable", m_ui.rewind);
|
loadSetting("rewindEnable", m_ui.rewind);
|
||||||
loadSetting("rewindBufferCapacity", m_ui.rewindCapacity);
|
loadSetting("rewindBufferCapacity", m_ui.rewindCapacity);
|
||||||
loadSetting("resampleVideo", m_ui.resampleVideo);
|
loadSetting("resampleVideo", m_ui.resampleVideo);
|
||||||
|
@ -592,9 +608,9 @@ void SettingsView::loadSetting(const char* key, QLineEdit* field) {
|
||||||
field->setText(option);
|
field->setText(option);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsView::loadSetting(const char* key, QSlider* field) {
|
void SettingsView::loadSetting(const char* key, QSlider* field, int defaultVal) {
|
||||||
QString option = loadSetting(key);
|
QString option = loadSetting(key);
|
||||||
field->setValue(option.toInt());
|
field->setValue(option.isNull() ? defaultVal : option.toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsView::loadSetting(const char* key, QSpinBox* field) {
|
void SettingsView::loadSetting(const char* key, QSpinBox* field) {
|
||||||
|
|
|
@ -72,7 +72,7 @@ private:
|
||||||
void loadSetting(const char* key, QComboBox*);
|
void loadSetting(const char* key, QComboBox*);
|
||||||
void loadSetting(const char* key, QDoubleSpinBox*);
|
void loadSetting(const char* key, QDoubleSpinBox*);
|
||||||
void loadSetting(const char* key, QLineEdit*);
|
void loadSetting(const char* key, QLineEdit*);
|
||||||
void loadSetting(const char* key, QSlider*);
|
void loadSetting(const char* key, QSlider*, int defaultVal = 0);
|
||||||
void loadSetting(const char* key, QSpinBox*);
|
void loadSetting(const char* key, QSpinBox*);
|
||||||
QString loadSetting(const char* key);
|
QString loadSetting(const char* key);
|
||||||
};
|
};
|
||||||
|
|
|
@ -263,21 +263,61 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0" colspan="2">
|
<item row="4" column="0">
|
||||||
|
<widget class="QLabel" name="label_34">
|
||||||
|
<property name="text">
|
||||||
|
<string>Fast forward volume:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_17">
|
||||||
|
<item>
|
||||||
|
<widget class="QSlider" name="volumeFf">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>128</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>256</number>
|
||||||
|
</property>
|
||||||
|
<property name="pageStep">
|
||||||
|
<number>16</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>256</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="muteFf">
|
||||||
|
<property name="text">
|
||||||
|
<string>Mute</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0" colspan="2">
|
||||||
<widget class="Line" name="line_4">
|
<widget class="Line" name="line_4">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QLabel" name="label_10">
|
<widget class="QLabel" name="label_10">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Display driver:</string>
|
<string>Display driver:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QComboBox" name="displayDriver">
|
<widget class="QComboBox" name="displayDriver">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
@ -287,14 +327,14 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QLabel" name="label_9">
|
<widget class="QLabel" name="label_9">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Frameskip:</string>
|
<string>Frameskip:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1">
|
<item row="7" column="1">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_16">
|
<layout class="QHBoxLayout" name="horizontalLayout_16">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_12">
|
<widget class="QLabel" name="label_12">
|
||||||
|
@ -315,14 +355,14 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="8" column="0">
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>FPS target:</string>
|
<string>FPS target:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="1">
|
<item row="8" column="1">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QDoubleSpinBox" name="fpsTarget">
|
<widget class="QDoubleSpinBox" name="fpsTarget">
|
||||||
|
@ -349,21 +389,21 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0" colspan="2">
|
<item row="9" column="0" colspan="2">
|
||||||
<widget class="Line" name="line_5">
|
<widget class="Line" name="line_5">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Sync:</string>
|
<string>Sync:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="10" column="1">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_10">
|
<layout class="QHBoxLayout" name="horizontalLayout_10">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="videoSync">
|
<widget class="QCheckBox" name="videoSync">
|
||||||
|
@ -381,7 +421,7 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="1">
|
<item row="11" column="1">
|
||||||
<widget class="QCheckBox" name="lockAspectRatio">
|
<widget class="QCheckBox" name="lockAspectRatio">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Lock aspect ratio</string>
|
<string>Lock aspect ratio</string>
|
||||||
|
|
|
@ -1610,6 +1610,16 @@ void Window::setupMenu(QMenuBar* menubar) {
|
||||||
reloadConfig();
|
reloadConfig();
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
|
ConfigOption* volumeFf = m_config->addOption("fastForwardVolume");
|
||||||
|
volumeFf->connect([this](const QVariant& value) {
|
||||||
|
reloadConfig();
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
ConfigOption* muteFf = m_config->addOption("fastForwardMute");
|
||||||
|
muteFf->connect([this](const QVariant& value) {
|
||||||
|
reloadConfig();
|
||||||
|
}, this);
|
||||||
|
|
||||||
ConfigOption* rewindEnable = m_config->addOption("rewindEnable");
|
ConfigOption* rewindEnable = m_config->addOption("rewindEnable");
|
||||||
rewindEnable->connect([this](const QVariant& value) {
|
rewindEnable->connect([this](const QVariant& value) {
|
||||||
reloadConfig();
|
reloadConfig();
|
||||||
|
|
Loading…
Reference in New Issue