overlays: play SND0.AT3 during initialization

This commit is contained in:
Megamouse 2026-03-10 08:56:04 +01:00
parent 892da25cf0
commit e5dee277ad
8 changed files with 96 additions and 1 deletions

View file

@ -500,6 +500,7 @@ target_sources(rpcs3_emu PRIVATE
RSX/Overlays/overlays.cpp
RSX/Overlays/overlay_animated_icon.cpp
RSX/Overlays/overlay_animation.cpp
RSX/Overlays/overlay_audio.cpp
RSX/Overlays/overlay_compile_notification.cpp
RSX/Overlays/overlay_controls.cpp
RSX/Overlays/overlay_cursor.cpp

View file

@ -0,0 +1,30 @@
#include "stdafx.h"
#include "overlay_audio.h"
#include "Emu/System.h"
namespace rsx
{
namespace overlays
{
audio_player::audio_player(const std::string& audio_path)
{
init_audio(audio_path);
}
void audio_player::init_audio(const std::string& audio_path)
{
if (audio_path.empty()) return;
m_video_source = ensure(Emu.GetCallbacks().make_video_source());
m_video_source->set_audio_path(audio_path);
}
void audio_player::set_active(bool active)
{
if (m_video_source)
{
m_video_source->set_active(active);
}
}
}
}

View file

@ -0,0 +1,23 @@
#pragma once
#include "util/video_source.h"
namespace rsx
{
namespace overlays
{
class audio_player
{
public:
audio_player(const std::string& audio_path);
~audio_player() = default;
void set_active(bool active);
private:
void init_audio(const std::string& audio_path);
std::unique_ptr<video_source> m_video_source;
};
}
}

View file

@ -167,6 +167,23 @@ namespace rsx
}
}
void display_manager::start_audio(const std::string& audio_path)
{
if (audio_path.empty())
{
m_audio_player.reset();
return;
}
m_audio_player = std::make_unique<audio_player>(audio_path);
m_audio_player->set_active(true);
}
void display_manager::stop_audio()
{
m_audio_player.reset();
}
void display_manager::on_overlay_activated(const std::shared_ptr<overlay>& /*item*/)
{
// TODO: Internal management, callbacks, etc

View file

@ -1,6 +1,7 @@
#pragma once
#include "overlays.h"
#include "overlay_audio.h"
#include "Emu/IdManager.h"
#include "Utilities/mutex.h"
@ -25,6 +26,8 @@ namespace rsx
lf_queue<u32> m_type_ids_to_remove;
atomic_t<u32> m_pending_removals_count = 0;
std::unique_ptr<audio_player> m_audio_player;
bool remove_type(u32 type_id);
bool remove_uid(u32 uid);
@ -167,6 +170,9 @@ namespace rsx
std::function<void(s32)> on_input_loop_exit = nullptr, // [optional] What to do with the result if any
std::function<s32()> input_loop_override = nullptr); // [optional] What to do during the input loop. By default calls user_interface::run_input_loop
void start_audio(const std::string& audio_path);
void stop_audio();
private:
struct overlay_input_thread
{

View file

@ -711,6 +711,11 @@ namespace rsx
if (g_cfg.misc.use_native_interface && (g_cfg.video.renderer == video_renderer::opengl || g_cfg.video.renderer == video_renderer::vulkan))
{
m_overlay_manager = g_fxo->init<rsx::overlays::display_manager>(0);
if (const std::string audio_path = Emu.GetSfoDir(true) + "/SND0.AT3"; fs::is_file(audio_path))
{
m_overlay_manager->start_audio(audio_path);
}
}
if (!_ar)
@ -1101,6 +1106,11 @@ namespace rsx
thread_ctrl::set_thread_affinity_mask(thread_ctrl::get_affinity_mask(thread_class::rsx));
}
if (auto manager = g_fxo->try_get<rsx::overlays::display_manager>())
{
manager->stop_audio();
}
while (!test_stopped())
{
// Wait for external pause events

View file

@ -145,6 +145,7 @@
<ClCompile Include="Emu\RSX\Overlays\Network\overlay_recvmessage_dialog.cpp" />
<ClCompile Include="Emu\RSX\Overlays\Network\overlay_sendmessage_dialog.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_animated_icon.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_audio.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_controls.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_cursor.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_debug_overlay.cpp" />
@ -704,6 +705,7 @@
<ClInclude Include="Emu\RSX\Overlays\Network\overlay_recvmessage_dialog.h" />
<ClInclude Include="Emu\RSX\Overlays\Network\overlay_sendmessage_dialog.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_animated_icon.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_audio.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_cursor.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_debug_overlay.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_edit_text.hpp" />
@ -1103,4 +1105,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View file

@ -1411,6 +1411,9 @@
<ClCompile Include="Loader\ISO.cpp">
<Filter>Loader</Filter>
</ClCompile>
<ClCompile Include="Emu\RSX\Overlays\overlay_audio.cpp">
<Filter>Emu\GPU\RSX\Overlays</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Crypto\aes.h">
@ -2833,6 +2836,9 @@
<ClInclude Include="Loader\ISO.h">
<Filter>Loader</Filter>
</ClInclude>
<ClInclude Include="Emu\RSX\Overlays\overlay_audio.h">
<Filter>Emu\GPU\RSX\Overlays</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="Emu\RSX\Program\GLSLSnippets\GPUDeswizzle.glsl">