Skip to content

Commit d50df55

Browse files
committed
Qt: Add sound effect manager
1 parent aa22075 commit d50df55

14 files changed

+227
-12
lines changed

rpcs3/Emu/RSX/Overlays/overlays.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace rsx
1515
{
1616
namespace overlays
1717
{
18-
void play_sound(sound_effect sound)
18+
std::string get_sound_filepath(sound_effect sound)
1919
{
2020
const auto get_sound_filename = [sound]()
2121
{
@@ -34,7 +34,12 @@ namespace rsx
3434
fmt::throw_exception("Unreachable (sound=%d)", static_cast<u32>(sound));
3535
};
3636

37-
Emu.GetCallbacks().play_sound(fmt::format("%ssounds/%s.wav", fs::get_config_dir(), get_sound_filename()));
37+
return fmt::format("%ssounds/%s.wav", fs::get_config_dir(), get_sound_filename());
38+
}
39+
40+
void play_sound(sound_effect sound, std::optional<f32> volume)
41+
{
42+
Emu.GetCallbacks().play_sound(get_sound_filepath(sound), volume);
3843
}
3944

4045
thread_local DECLARE(user_interface::g_thread_bit) = 0;

rpcs3/Emu/RSX/Overlays/overlays.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ namespace rsx
2929
trophy,
3030
};
3131

32-
void play_sound(sound_effect sound);
32+
std::string get_sound_filepath(sound_effect sound);
33+
void play_sound(sound_effect sound, std::optional<f32> volume = std::nullopt);
3334

3435
// Bitfield of UI signals to overlay manager
3536
enum status_bits : u32

rpcs3/Emu/System.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ struct EmuCallbacks
101101
std::function<std::string(localized_string_id, const char*)> get_localized_string;
102102
std::function<std::u32string(localized_string_id, const char*)> get_localized_u32string;
103103
std::function<std::string(const cfg::_base*, u32)> get_localized_setting;
104-
std::function<void(const std::string&)> play_sound;
104+
std::function<void(const std::string&, std::optional<f32>)> play_sound;
105105
std::function<bool(const std::string&, std::string&, s32&, s32&, s32&)> get_image_info; // (filename, sub_type, width, height, CellSearchOrientation)
106106
std::function<bool(const std::string&, s32, s32, s32&, s32&, u8*, bool)> get_scaled_image; // (filename, target_width, target_height, width, height, dst, force_fit)
107107
std::string(*resolve_path)(std::string_view) = [](std::string_view arg){ return std::string{arg}; }; // Resolve path using Qt

rpcs3/headless_application.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ void headless_application::InitializeCallbacks()
169169
callbacks.get_localized_u32string = [](localized_string_id, const char*) -> std::u32string { return {}; };
170170
callbacks.get_localized_setting = [](const cfg::_base*, u32) -> std::string { return {}; };
171171

172-
callbacks.play_sound = [](const std::string&){};
172+
callbacks.play_sound = [](const std::string&, std::optional<f32>){};
173173
callbacks.add_breakpoint = [](u32 /*addr*/){};
174174

175175
callbacks.display_sleep_control_supported = [](){ return false; };

rpcs3/rpcs3.vcxproj

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,9 @@
430430
<ClCompile Include="QTGeneratedFiles\Debug\moc_screenshot_preview.cpp">
431431
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
432432
</ClCompile>
433+
<ClCompile Include="QTGeneratedFiles\Debug\moc_sound_effect_manager_dialog.cpp">
434+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
435+
</ClCompile>
433436
<ClCompile Include="QTGeneratedFiles\Debug\moc_sendmessage_dialog_frame.cpp">
434437
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
435438
</ClCompile>
@@ -718,6 +721,9 @@
718721
<ClCompile Include="QTGeneratedFiles\Release\moc_screenshot_preview.cpp">
719722
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
720723
</ClCompile>
724+
<ClCompile Include="QTGeneratedFiles\Release\moc_sound_effect_manager_dialog.cpp">
725+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
726+
</ClCompile>
721727
<ClCompile Include="QTGeneratedFiles\Release\moc_sendmessage_dialog_frame.cpp">
722728
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
723729
</ClCompile>
@@ -851,6 +857,7 @@
851857
<ClCompile Include="rpcs3qt\screenshot_item.cpp" />
852858
<ClCompile Include="rpcs3qt\screenshot_manager_dialog.cpp" />
853859
<ClCompile Include="rpcs3qt\screenshot_preview.cpp" />
860+
<ClCompile Include="rpcs3qt\sound_effect_manager_dialog.cpp" />
854861
<ClCompile Include="rpcs3qt\sendmessage_dialog_frame.cpp" />
855862
<ClCompile Include="rpcs3qt\settings.cpp" />
856863
<ClCompile Include="rpcs3qt\shortcut_dialog.cpp" />
@@ -1311,6 +1318,16 @@
13111318
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
13121319
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent"</Command>
13131320
</CustomBuild>
1321+
<CustomBuild Include="rpcs3qt\sound_effect_manager_dialog.h">
1322+
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing %(Identity)...</Message>
1323+
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
1324+
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent"</Command>
1325+
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing %(Identity)...</Message>
1326+
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
1327+
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent"</Command>
1328+
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
1329+
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
1330+
</CustomBuild>
13141331
<CustomBuild Include="rpcs3qt\fatal_error_dialog.h">
13151332
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
13161333
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing %(Identity)...</Message>

rpcs3/rpcs3.vcxproj.filters

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@
205205
<Filter Include="Gui\widgets">
206206
<UniqueIdentifier>{149c596b-83e7-43f8-b5db-6108694434ef}</UniqueIdentifier>
207207
</Filter>
208+
<Filter Include="Gui\sound effect manager">
209+
<UniqueIdentifier>{640b7d83-1522-4384-8bf7-a4fbd5873ae7}</UniqueIdentifier>
210+
</Filter>
208211
</ItemGroup>
209212
<ItemGroup>
210213
<ClCompile Include="main.cpp">
@@ -738,6 +741,15 @@
738741
<ClCompile Include="QTGeneratedFiles\Release\moc_screenshot_manager_dialog.cpp">
739742
<Filter>Generated Files\Release</Filter>
740743
</ClCompile>
744+
<ClCompile Include="rpcs3qt\sound_effect_manager_dialog.cpp">
745+
<Filter>Gui\sound effect manager</Filter>
746+
</ClCompile>
747+
<ClCompile Include="QTGeneratedFiles\Debug\moc_sound_effect_manager_dialog.cpp">
748+
<Filter>Generated Files\Debug</Filter>
749+
</ClCompile>
750+
<ClCompile Include="QTGeneratedFiles\Release\moc_sound_effect_manager_dialog.cpp">
751+
<Filter>Generated Files\Release</Filter>
752+
</ClCompile>
741753
<ClCompile Include="rpcs3qt\screenshot_preview.cpp">
742754
<Filter>Gui\screenshot manager</Filter>
743755
</ClCompile>
@@ -1627,6 +1639,9 @@
16271639
<CustomBuild Include="rpcs3qt\screenshot_preview.h">
16281640
<Filter>Gui\screenshot manager</Filter>
16291641
</CustomBuild>
1642+
<CustomBuild Include="rpcs3qt\sound_effect_manager_dialog.h">
1643+
<Filter>Gui\sound effect manager</Filter>
1644+
</CustomBuild>
16301645
<CustomBuild Include="rpcs3qt\dimensions_dialog.h">
16311646
<Filter>Gui\dimensions</Filter>
16321647
</CustomBuild>

rpcs3/rpcs3qt/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ add_library(rpcs3_ui STATIC
9999
shortcut_handler.cpp
100100
shortcut_settings.cpp
101101
skylander_dialog.cpp
102+
sound_effect_manager_dialog.cpp
102103
syntax_highlighter.cpp
103104
system_cmd_dialog.cpp
104105
table_item_delegate.cpp

rpcs3/rpcs3qt/gs_frame.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ void gs_frame::toggle_recording()
447447
// Play a sound
448448
if (const std::string sound_path = fs::get_config_dir() + "sounds/snd_recording.wav"; fs::is_file(sound_path))
449449
{
450-
Emu.GetCallbacks().play_sound(sound_path);
450+
Emu.GetCallbacks().play_sound(sound_path, std::nullopt);
451451
}
452452
else
453453
{
@@ -1070,7 +1070,7 @@ void gs_frame::take_screenshot(std::vector<u8>&& data, u32 sshot_width, u32 ssho
10701070
{
10711071
if (const std::string sound_path = fs::get_config_dir() + "sounds/snd_screenshot.wav"; fs::is_file(sound_path))
10721072
{
1073-
Emu.GetCallbacks().play_sound(sound_path);
1073+
Emu.GetCallbacks().play_sound(sound_path, std::nullopt);
10741074
}
10751075
else
10761076
{

rpcs3/rpcs3qt/gui_application.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -743,9 +743,9 @@ void gui_application::InitializeCallbacks()
743743
return m_emu_settings->GetLocalizedSetting(node, enum_index);
744744
};
745745

746-
callbacks.play_sound = [this](const std::string& path)
746+
callbacks.play_sound = [this](const std::string& path, std::optional<f32> volume)
747747
{
748-
Emu.CallFromMainThread([this, path]()
748+
Emu.CallFromMainThread([this, path, volume]()
749749
{
750750
if (fs::is_file(path))
751751
{
@@ -758,12 +758,12 @@ void gui_application::InitializeCallbacks()
758758
// Create a new sound effect. Re-using the same object seems to be broken for some users starting with Qt 6.6.3.
759759
std::unique_ptr<QSoundEffect> sound_effect = std::make_unique<QSoundEffect>();
760760
sound_effect->setSource(QUrl::fromLocalFile(QString::fromStdString(path)));
761-
sound_effect->setVolume(audio::get_volume());
761+
sound_effect->setVolume(volume ? *volume : audio::get_volume());
762762
sound_effect->play();
763763

764764
m_sound_effects.push_back(std::move(sound_effect));
765765
}
766-
});
766+
}, nullptr, false);
767767
};
768768

769769
if (m_show_gui) // If this is false, we already have a fallback in the main_application.

rpcs3/rpcs3qt/main_window.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "vfs_tool_dialog.h"
4545
#include "welcome_dialog.h"
4646
#include "music_player_dialog.h"
47+
#include "sound_effect_manager_dialog.h"
4748

4849
#include <thread>
4950
#include <unordered_set>
@@ -3037,6 +3038,12 @@ void main_window::CreateConnects()
30373038
screenshot_manager->show();
30383039
});
30393040

3041+
connect(ui->actionManage_SoundEffects, &QAction::triggered, this, [this]
3042+
{
3043+
sound_effect_manager_dialog* dlg = new sound_effect_manager_dialog();
3044+
dlg->show();
3045+
});
3046+
30403047
connect(ui->toolsCgDisasmAct, &QAction::triggered, this, [this]
30413048
{
30423049
cg_disasm_window* cgdw = new cg_disasm_window(m_gui_settings);

0 commit comments

Comments
 (0)