diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 54c63624e618..a642b96dc8b2 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -483,6 +483,11 @@ true true + + true + true + true + true true @@ -753,6 +758,11 @@ true true + + true + true + true + true true @@ -1043,6 +1053,11 @@ true true + + true + true + true + true true @@ -1313,6 +1328,11 @@ true true + + true + true + true + true true @@ -1450,6 +1470,7 @@ + @@ -2184,6 +2205,24 @@ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl" "-I.\..\3rdparty\curl\include" "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl" "-I.\..\3rdparty\curl\include" "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl" "-I.\..\3rdparty\curl\include" "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl" "-I.\..\3rdparty\curl\include" "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl" "-I.\..\3rdparty\curl\include" "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\XAudio2Redist\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index f50bca31a82c..ea40bbaad4fd 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1009,6 +1009,21 @@ Gui\misc dialogs + + Gui\settings + + + Generated Files\Release - LLVM + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug - LLVM + @@ -1304,6 +1319,9 @@ Gui\misc dialogs + + Gui\settings + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index 8f06279f0a23..43d32b28b0ac 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -30,6 +30,7 @@ main_window.cpp memory_string_searcher.cpp memory_viewer_panel.cpp + microphone_creator.cpp msg_dialog_frame.cpp osk_dialog_frame.cpp pad_led_settings_dialog.cpp diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index 0ec8da9d9504..093367279915 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -7,7 +7,6 @@ #include "Utilities/Config.h" #include "Utilities/Thread.h" -#include "Utilities/StrUtil.h" #include #include @@ -18,8 +17,6 @@ #include "Emu/RSX/VK/VKHelpers.h" #endif -#include "3rdparty/OpenAL/include/alext.h" - LOG_CHANNEL(cfg_log, "CFG"); extern std::string g_cfg_defaults; //! Default settings grabbed from Utilities/Config.h @@ -199,59 +196,6 @@ emu_settings::Render_Creator::Render_Creator(const QString& name_null, const QSt renderers = { &Vulkan, &OpenGL, &NullRender }; } -emu_settings::Microphone_Creator::Microphone_Creator() - : mic_none(tr("None", "Microphone device")) -{ - RefreshList(); -} - -void emu_settings::Microphone_Creator::RefreshList() -{ - microphones_list.clear(); - microphones_list.append(mic_none); - - if (alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT") == AL_TRUE) - { - const char *devices = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER); - - while (*devices != 0) - { - microphones_list.append(qstr(devices)); - devices += strlen(devices) + 1; - } - } - else - { - // Without enumeration we can only use one device - microphones_list.append(qstr(alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER))); - } -} - -std::string emu_settings::Microphone_Creator::SetDevice(u32 num, QString& text) -{ - if (text == mic_none) - sel_list[num-1] = ""; - else - sel_list[num-1] = text.toStdString(); - - const std::string final_list = sel_list[0] + "@@@" + sel_list[1] + "@@@" + sel_list[2] + "@@@" + sel_list[3] + "@@@"; - return final_list; -} - -void emu_settings::Microphone_Creator::ParseDevices(std::string list) -{ - for (u32 index = 0; index < 4; index++) - { - sel_list[index] = ""; - } - - const auto devices_list = fmt::split(list, { "@@@" }); - for (u32 index = 0; index < std::min(4, ::size32(devices_list)); index++) - { - sel_list[index] = devices_list[index]; - } -} - emu_settings::emu_settings() : QObject() , m_render_creator( diff --git a/rpcs3/rpcs3qt/emu_settings.h b/rpcs3/rpcs3qt/emu_settings.h index a4ae86ec87e6..b25e8eb6c71f 100644 --- a/rpcs3/rpcs3qt/emu_settings.h +++ b/rpcs3/rpcs3qt/emu_settings.h @@ -4,6 +4,8 @@ #include "stdafx.h" +#include "microphone_creator.h" + #include #include #include @@ -200,17 +202,6 @@ class emu_settings : public QObject Render_Creator(const QString& name_null, const QString& name_vulkan, const QString& name_openGL); }; - struct Microphone_Creator - { - QStringList microphones_list; - QString mic_none; - std::array sel_list; - std::string SetDevice(u32 num, QString& text); - void ParseDevices(std::string list); - void RefreshList(); - Microphone_Creator(); - }; - std::set m_broken_types; // list of broken settings /** Creates a settings object which reads in the config.yml file at rpcs3/bin/%path%/config.yml @@ -262,7 +253,7 @@ class emu_settings : public QObject Render_Creator m_render_creator; /** Gets a list of all the microphones available.*/ - Microphone_Creator m_microphone_creator; + microphone_creator m_microphone_creator; /** Loads the settings from path.*/ void LoadSettings(const std::string& title_id = ""); diff --git a/rpcs3/rpcs3qt/microphone_creator.cpp b/rpcs3/rpcs3qt/microphone_creator.cpp new file mode 100644 index 000000000000..376122be0d9e --- /dev/null +++ b/rpcs3/rpcs3qt/microphone_creator.cpp @@ -0,0 +1,76 @@ +#include "microphone_creator.h" + +#include "Utilities/StrUtil.h" + +#include "3rdparty/OpenAL/include/alext.h" + +constexpr auto qstr = QString::fromStdString; + +microphone_creator::microphone_creator() +{ + setObjectName("microphone_creator"); + refresh_list(); +} + +// We need to recreate the localized string because the microphone creator is currently only created once. +QString microphone_creator::get_none() +{ + return tr("None", "Microphone device"); +} + +void microphone_creator::refresh_list() +{ + m_microphone_list.clear(); + m_microphone_list.append(get_none()); + + if (alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT") == AL_TRUE) + { + const char* devices = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER); + + while (*devices != 0) + { + m_microphone_list.append(qstr(devices)); + devices += strlen(devices) + 1; + } + } + else + { + // Without enumeration we can only use one device + m_microphone_list.append(qstr(alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER))); + } +} + +QStringList microphone_creator::get_microphone_list() +{ + return m_microphone_list; +} + +std::array microphone_creator::get_selection_list() +{ + return m_sel_list; +} + +std::string microphone_creator::set_device(u32 num, const QString& text) +{ + if (text == get_none()) + m_sel_list[num - 1] = ""; + else + m_sel_list[num - 1] = text.toStdString(); + + const std::string final_list = m_sel_list[0] + "@@@" + m_sel_list[1] + "@@@" + m_sel_list[2] + "@@@" + m_sel_list[3] + "@@@"; + return final_list; +} + +void microphone_creator::parse_devices(const std::string& list) +{ + for (u32 index = 0; index < 4; index++) + { + m_sel_list[index] = ""; + } + + const auto devices_list = fmt::split(list, { "@@@" }); + for (u32 index = 0; index < std::min(4, ::size32(devices_list)); index++) + { + m_sel_list[index] = devices_list[index]; + } +} diff --git a/rpcs3/rpcs3qt/microphone_creator.h b/rpcs3/rpcs3qt/microphone_creator.h new file mode 100644 index 000000000000..3a7764bdfed8 --- /dev/null +++ b/rpcs3/rpcs3qt/microphone_creator.h @@ -0,0 +1,27 @@ +#pragma once + +#include "stdafx.h" + +#include +#include +#include + +#include + +class microphone_creator : public QObject +{ + Q_OBJECT + +public: + microphone_creator(); + QString get_none(); + std::string set_device(u32 num, const QString& text); + void parse_devices(const std::string& list); + void refresh_list(); + QStringList get_microphone_list(); + std::array get_selection_list(); + +private: + QStringList m_microphone_list; + std::array m_sel_list; +}; diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 6a7683d8ca3c..ab5ae77a5a51 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -624,6 +624,8 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std enable_buffering_options(enabled && ui->enableBuffering->isChecked()); }; + const QString mic_none = m_emu_settings->m_microphone_creator.get_none(); + auto change_microphone_type = [=, this](QString text) { std::string s_standard, s_singstar, s_realsingstar, s_rocksmith; @@ -632,15 +634,15 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std { ui->microphone1Box->setEnabled(true); - if (max == 1 || ui->microphone1Box->currentText() == m_emu_settings->m_microphone_creator.mic_none) + if (max == 1 || ui->microphone1Box->currentText() == mic_none) return; ui->microphone2Box->setEnabled(true); - if (max > 2 && ui->microphone2Box->currentText() != m_emu_settings->m_microphone_creator.mic_none) + if (max > 2 && ui->microphone2Box->currentText() != mic_none) { ui->microphone3Box->setEnabled(true); - if (ui->microphone3Box->currentText() != m_emu_settings->m_microphone_creator.mic_none) + if (ui->microphone3Box->currentText() != mic_none) { ui->microphone4Box->setEnabled(true); } @@ -679,10 +681,10 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std for (u32 index = 0; index < 4; index++) { const QString cur_item = mics_combo[index]->currentText(); - QStringList cur_list = m_emu_settings->m_microphone_creator.microphones_list; + QStringList cur_list = m_emu_settings->m_microphone_creator.get_microphone_list(); for (u32 subindex = 0; subindex < 4; subindex++) { - if (subindex != index && mics_combo[subindex]->currentText() != m_emu_settings->m_microphone_creator.mic_none) + if (subindex != index && mics_combo[subindex]->currentText() != mic_none) cur_list.removeOne(mics_combo[subindex]->currentText()); } mics_combo[index]->blockSignals(true); @@ -696,9 +698,9 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std auto change_microphone_device = [=, this](u32 next_index, QString text) { - m_emu_settings->SetSetting(emu_settings::MicrophoneDevices, m_emu_settings->m_microphone_creator.SetDevice(next_index, text)); - if (next_index < 4 && text == m_emu_settings->m_microphone_creator.mic_none) - mics_combo[next_index]->setCurrentText(m_emu_settings->m_microphone_creator.mic_none); + m_emu_settings->SetSetting(emu_settings::MicrophoneDevices, m_emu_settings->m_microphone_creator.set_device(next_index, text)); + if (next_index < 4 && text == mic_none) + mics_combo[next_index]->setCurrentText(mic_none); propagate_used_devices(); }; @@ -721,21 +723,26 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std connect(mics_combo[1], &QComboBox::currentTextChanged, [=, this](const QString& text) { change_microphone_device(2, text); }); connect(mics_combo[2], &QComboBox::currentTextChanged, [=, this](const QString& text) { change_microphone_device(3, text); }); connect(mics_combo[3], &QComboBox::currentTextChanged, [=, this](const QString& text) { change_microphone_device(4, text); }); - m_emu_settings->m_microphone_creator.RefreshList(); + m_emu_settings->m_microphone_creator.refresh_list(); propagate_used_devices(); // Fills comboboxes list - m_emu_settings->m_microphone_creator.ParseDevices(m_emu_settings->GetSetting(emu_settings::MicrophoneDevices)); + m_emu_settings->m_microphone_creator.parse_devices(m_emu_settings->GetSetting(emu_settings::MicrophoneDevices)); + + const auto mic_sel_list = m_emu_settings->m_microphone_creator.get_selection_list(); for (s32 index = 3; index >= 0; index--) { - if (m_emu_settings->m_microphone_creator.sel_list[index].empty() || mics_combo[index]->findText(qstr(m_emu_settings->m_microphone_creator.sel_list[index])) == -1) + const auto mic = mic_sel_list[index]; + const auto qmic = qstr(mic); + + if (mic.empty() || mics_combo[index]->findText(qmic) == -1) { - mics_combo[index]->setCurrentText(m_emu_settings->m_microphone_creator.mic_none); - change_microphone_device(index+1, m_emu_settings->m_microphone_creator.mic_none); // Ensures the value is set in config + mics_combo[index]->setCurrentText(mic_none); + change_microphone_device(index+1, mic_none); // Ensures the value is set in config } else { - mics_combo[index]->setCurrentText(qstr(m_emu_settings->m_microphone_creator.sel_list[index])); + mics_combo[index]->setCurrentText(qmic); } }