diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 18b2143273..dfcbffb5a6 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -174,6 +174,7 @@ void __KernelDoState(PointerWrap &p) __MpegDoState(p); __PowerDoState(p); __PsmfDoState(p); + __PsmfPlayerDoState(p); __SasDoState(p); __SslDoState(p); __UmdDoState(p); diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index eb6dd8500d..6b7fe7e941 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -373,6 +373,38 @@ void __PsmfDoState(PointerWrap &p) p.DoMarker("scePsmf"); } +void __PsmfPlayerDoState(PointerWrap &p) +{ + int n = (int) psmfPlayerMap.size(); + p.Do(n); + if (p.mode == p.MODE_READ) { + std::map::iterator it, end; + for (it = psmfPlayerMap.begin(), end = psmfPlayerMap.end(); it != end; ++it) { + delete it->second; + } + psmfMap.clear(); + + for (int i = 0; i < n; ++i) { + u32 key; + p.Do(key); + PsmfPlayer *psmfplayer = new PsmfPlayer(0); + psmfplayer->DoState(p); + psmfPlayerMap[key] = psmfplayer; + } + } else { + std::map::iterator it, end; + for (it = psmfPlayerMap.begin(), end = psmfPlayerMap.end(); it != end; ++it) { + p.Do(it->first); + it->second->DoState(p); + } + } + + // TODO: Actually load this from a map. + psmfPlayerStatus = PSMF_PLAYER_STATUS_NONE; + + p.DoMarker("scePsmfPlayer"); +} + void __PsmfShutdown() { for (auto it = psmfMap.begin(), end = psmfMap.end(); it != end; ++it) diff --git a/Core/HLE/scePsmf.h b/Core/HLE/scePsmf.h index 02baa33952..31cf34646c 100644 --- a/Core/HLE/scePsmf.h +++ b/Core/HLE/scePsmf.h @@ -22,4 +22,5 @@ void Register_scePsmfPlayer(); void __PsmfInit(); void __PsmfDoState(PointerWrap &p); +void __PsmfPlayerDoState(PointerWrap &p); void __PsmfShutdown();