Skip to content

Commit

Permalink
Savestates: Fix rsxaudio
Browse files Browse the repository at this point in the history
  • Loading branch information
elad335 committed Oct 4, 2023
1 parent 48dcac8 commit cc67dd5
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 11 deletions.
2 changes: 1 addition & 1 deletion rpcs3/Emu/Cell/Modules/cellAudio.cpp
Expand Up @@ -419,7 +419,7 @@ cell_audio_thread::cell_audio_thread(utils::serial& ar)
for (key_info& k : keys)
{
ar(k.start_period, k.flags, k.source);
k.port = lv2_event_queue::load_ptr(ar, k.port);
k.port = lv2_event_queue::load_ptr(ar, k.port, "audio");
}

ar(ports);
Expand Down
18 changes: 14 additions & 4 deletions rpcs3/Emu/Cell/lv2/sys_event.cpp
Expand Up @@ -57,7 +57,7 @@ void lv2_event_queue::save_ptr(utils::serial& ar, lv2_event_queue* q)
ar(q->id);
}

std::shared_ptr<lv2_event_queue> lv2_event_queue::load_ptr(utils::serial& ar, std::shared_ptr<lv2_event_queue>& queue)
std::shared_ptr<lv2_event_queue> lv2_event_queue::load_ptr(utils::serial& ar, std::shared_ptr<lv2_event_queue>& queue, std::string_view msg)
{
const u32 id = ar.operator u32();

Expand All @@ -72,10 +72,20 @@ std::shared_ptr<lv2_event_queue> lv2_event_queue::load_ptr(utils::serial& ar, st
return q;
}

Emu.DeferDeserialization([id, &queue]()
if (id >> 24 != id_base >> 24)
{
fmt::throw_exception("Failed in event queue pointer deserialization (invalid ID): location: %s, id=0x%x", msg, id);
}

Emu.DeferDeserialization([id, &queue, msg_str = std::string{msg}]()
{
// Defer resolving
queue = ensure(idm::get_unlocked<lv2_obj, lv2_event_queue>(id));
queue = idm::get_unlocked<lv2_obj, lv2_event_queue>(id);

if (!queue)
{
fmt::throw_exception("Failed in event queue pointer deserialization (not found): location: %s, id=0x%x", msg_str, id);
}
});

// Null until resolved
Expand All @@ -85,7 +95,7 @@ std::shared_ptr<lv2_event_queue> lv2_event_queue::load_ptr(utils::serial& ar, st
lv2_event_port::lv2_event_port(utils::serial& ar)
: type(ar)
, name(ar)
, queue(lv2_event_queue::load_ptr(ar, queue))
, queue(lv2_event_queue::load_ptr(ar, queue, "eventport"))
{
}

Expand Down
2 changes: 1 addition & 1 deletion rpcs3/Emu/Cell/lv2/sys_event.h
Expand Up @@ -101,7 +101,7 @@ struct lv2_event_queue final : public lv2_obj
static std::shared_ptr<void> load(utils::serial& ar);
void save(utils::serial& ar);
static void save_ptr(utils::serial&, lv2_event_queue*);
static std::shared_ptr<lv2_event_queue> load_ptr(utils::serial& ar, std::shared_ptr<lv2_event_queue>& queue);
static std::shared_ptr<lv2_event_queue> load_ptr(utils::serial& ar, std::shared_ptr<lv2_event_queue>& queue, std::string_view msg = {});

CellError send(lv2_event event);

Expand Down
8 changes: 4 additions & 4 deletions rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp
Expand Up @@ -111,9 +111,9 @@ lv2_rsxaudio::lv2_rsxaudio(utils::serial& ar) noexcept
{
ar(shmem);

for (const auto& port : event_queue)
for (auto& port : event_queue)
{
lv2_event_queue::save_ptr(ar, port.get());
port = lv2_event_queue::load_ptr(ar, port, "rsxaudio");
}
}
}
Expand All @@ -128,9 +128,9 @@ void lv2_rsxaudio::save(utils::serial& ar)
{
ar(shmem);

for (auto& port : event_queue)
for (const auto& port : event_queue)
{
port = lv2_event_queue::load_ptr(ar, port);
lv2_event_queue::save_ptr(ar, port.get());
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion rpcs3/Emu/Cell/lv2/sys_timer.cpp
Expand Up @@ -33,7 +33,7 @@ struct lv2_timer_thread
lv2_timer::lv2_timer(utils::serial& ar)
: lv2_obj{1}
, state(ar)
, port(lv2_event_queue::load_ptr(ar, port))
, port(lv2_event_queue::load_ptr(ar, port, "timer"))
, source(ar)
, data1(ar)
, data2(ar)
Expand Down

0 comments on commit cc67dd5

Please sign in to comment.