aboutsummaryrefslogtreecommitdiff
path: root/backends/platform
diff options
context:
space:
mode:
authorTravis Howell2009-08-19 01:22:43 +0000
committerTravis Howell2009-08-19 01:22:43 +0000
commit89d7fea4e619cd44d5ce16eee1e46ad417e26c9c (patch)
treea5df60123d0d6a44d824d21e95df2ef421a4700b /backends/platform
parentdfaa5acbee5766e59b35697ea1b03122aa4ea2aa (diff)
parent2bd1f51d92492fa88ba61dc65f783fc9bbfd852c (diff)
downloadscummvm-rg350-89d7fea4e619cd44d5ce16eee1e46ad417e26c9c.tar.gz
scummvm-rg350-89d7fea4e619cd44d5ce16eee1e46ad417e26c9c.tar.bz2
scummvm-rg350-89d7fea4e619cd44d5ce16eee1e46ad417e26c9c.zip
Merged revisions 43458-43468,43470-43471,43473-43475,43477,43479-43483,43485,43497-43498,43500,43503-43504,43507,43509-43510,43512-43515,43517,43519,43521,43523 via svnmerge from
https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk ........ r43458 | thebluegr | 2009-08-17 15:55:21 +1000 (Mon, 17 Aug 2009) | 8 lines - Simplified some functions to accept only the parts of the EngineState they need as parameters, instead of the whole EngineState - Moved the class table in the Segment manager - it's the only class using it directly - Removed the sci11 flag from save games (we already know this, we don't need to store it) - Moved script_get_segment() and get_class_address() inside the segment manager class - Removed the script_locate_by_segment wrapper - Simplified script_lookup_export() a lot by removing some paranoia checks - Added some WIP code for automatically determining the game id in the fallback detector (still not working) - General cleanup ........ r43459 | lordhoto | 2009-08-17 17:36:08 +1000 (Mon, 17 Aug 2009) | 1 line Fix compilation of the SCI engine. It seems that all of the SCI header files I touched (and probably others I luckily didn't touch) seem to assume that files including them will supply needed types. That looks like a major issue in SCI. Someone with knowledge of the SCI code should look into this and cleanup the includes of *all* SCI headers. ........ r43460 | thebluegr | 2009-08-17 19:19:53 +1000 (Mon, 17 Aug 2009) | 1 line Cleanup ........ r43461 | strangerke | 2009-08-17 19:50:35 +1000 (Mon, 17 Aug 2009) | 1 line Added OPCODEDRAW 0x85, with a specific workaround for Bambou hardcoded paths in scripts ........ r43462 | strangerke | 2009-08-17 19:54:49 +1000 (Mon, 17 Aug 2009) | 1 line Suppress useless parentheses ........ r43463 | lordhoto | 2009-08-17 19:57:09 +1000 (Mon, 17 Aug 2009) | 1 line Formatting. ........ r43464 | strangerke | 2009-08-17 20:05:02 +1000 (Mon, 17 Aug 2009) | 1 line Add back parenthesis (I wasn't aware of this convention, sorry) in saveload, and mimic this code in oPlaytoons_openItk ........ r43465 | lordhoto | 2009-08-17 20:48:03 +1000 (Mon, 17 Aug 2009) | 2 lines - Add note about that modifing the parent stream will mess up SeekableSubReadStream and SeekableSubReadStreamEndian. - Link to SubReadStream documentation from SeekableSubReadStream and SeekableSubReadStreamEndian. ........ r43466 | thebluegr | 2009-08-17 21:06:27 +1000 (Mon, 17 Aug 2009) | 1 line Made sound effect playing code consistent for compressed and uncompressed sounds. MemoryReadStream is used again instead of SeekableSubReadStream, as there will be issues when multiple sound effects or voices are played simultaneously ........ r43467 | thebluegr | 2009-08-17 21:11:38 +1000 (Mon, 17 Aug 2009) | 1 line Ignore speech and sound effect samples with unknown compression, instead of trying to play them as raw sound. Some cleanup ........ r43468 | dreammaster | 2009-08-17 21:36:09 +1000 (Mon, 17 Aug 2009) | 1 line Fix for some more !!HIGH STRINGS!! when talking to the palace guards ........ r43470 | thebluegr | 2009-08-17 21:49:07 +1000 (Mon, 17 Aug 2009) | 1 line Simplified the sound playing code by removing the boolean variables for signed, stereo, endian and sample bit information - now sound flags are used instead. Some cleanup. ........ r43471 | dreammaster | 2009-08-17 21:51:42 +1000 (Mon, 17 Aug 2009) | 1 line Switched event loop while/do to do/while, to ensure event handling occurs even when the game is under heavy load ........ r43473 | lordhoto | 2009-08-17 22:22:15 +1000 (Mon, 17 Aug 2009) | 1 line Cleanup: don't copy the Kyrandia 1 Amiga credits data in a temporary buffer, and thus keeping it twice in memory. ........ r43474 | lordhoto | 2009-08-17 22:22:30 +1000 (Mon, 17 Aug 2009) | 1 line Clear input queue before displaying the credits in Kyrandia 1. ........ r43475 | lordhoto | 2009-08-17 22:47:57 +1000 (Mon, 17 Aug 2009) | 1 line Fix possible out of bounds access in Screen::drawShape. ........ r43477 | joostp | 2009-08-17 22:57:37 +1000 (Mon, 17 Aug 2009) | 2 lines Commit (slightly) modified version of patch #2831248: Allow suspend/resume for PSP ........ r43479 | thebluegr | 2009-08-17 23:16:40 +1000 (Mon, 17 Aug 2009) | 1 line Added looping support to LinearDiskStream, needed by SAGA and perhaps other engines. Note that the loop end parameter is still not implemented ........ r43480 | thebluegr | 2009-08-17 23:25:44 +1000 (Mon, 17 Aug 2009) | 2 lines - Removed the custom DigitalMusicInputStream used in SAGA for the digital music in ITE CD and replaced it with the common LinearDiskStream class - Removed leftover code which plays standalone tracks (it's not used anywhere) ........ r43481 | lordhoto | 2009-08-17 23:49:56 +1000 (Mon, 17 Aug 2009) | 1 line Slight cleanup to makeLinearDiskStream interface. ........ r43482 | waltervn | 2009-08-18 01:49:22 +1000 (Tue, 18 Aug 2009) | 1 line SCI: Add autodetection for DoSound. Cleanup. ........ r43483 | waltervn | 2009-08-18 02:07:47 +1000 (Tue, 18 Aug 2009) | 1 line SCI: Build fix. ........ r43485 | thebluegr | 2009-08-18 04:25:51 +1000 (Tue, 18 Aug 2009) | 1 line Put back the code for playing external digital music, used by the MIDI enhancement project, which was removed in rev. #43480 ........ r43497 | waltervn | 2009-08-18 09:11:25 +1000 (Tue, 18 Aug 2009) | 1 line SCI: Fix kernel table for multilingual SCI01 games. Cleanup. ........ r43498 | joostp | 2009-08-18 09:54:40 +1000 (Tue, 18 Aug 2009) | 2 lines PSP: increase optimization level and change clock rate to 333mhz ........ r43500 | thebluegr | 2009-08-18 16:43:06 +1000 (Tue, 18 Aug 2009) | 1 line Applied agent-q's patch to the SAGA pathfinding code for all platforms - x and y should not ever be greater than 640 and 480 respectively, so it looks safe enough to be applied ........ r43503 | thebluegr | 2009-08-18 19:12:41 +1000 (Tue, 18 Aug 2009) | 1 line Removed the maxMemory parameter of the resource manager and replaced it with a define ........ r43504 | thebluegr | 2009-08-18 20:01:18 +1000 (Tue, 18 Aug 2009) | 2 lines - Added game ID detection to the fallback detector. We still need to map some of Sierra's internal IDs to our own ones - The class table is now created in the segment manager constructor ........ r43507 | dreammaster | 2009-08-18 22:25:04 +1000 (Tue, 18 Aug 2009) | 1 line Bugfix for Castle Skorl problem reported on the list ........ r43509 | thebluegr | 2009-08-18 22:49:34 +1000 (Tue, 18 Aug 2009) | 1 line Mapped some Sierra internal IDs to our own ones, and added a note about a hack currently used in the fallback detector ........ r43510 | thebluegr | 2009-08-19 00:10:31 +1000 (Wed, 19 Aug 2009) | 1 line Started rewriting the SCI engine to use FSNode instead of file names. This is the proper solution for removing the hack in the fallback detector, but it still needs work. Also, reduced the things needed to be initialized a bit, so that the detection is a bit faster ........ r43512 | lordhoto | 2009-08-19 01:31:26 +1000 (Wed, 19 Aug 2009) | 1 line Made AGOS, DRASCULA, GOB, GROOVIE, MADE, SCUMM and TINSEL properly stop CD audio playback on engine quit. (This only problem affected playback from CD, not from ripped audio files) ........ r43513 | lordhoto | 2009-08-19 01:32:26 +1000 (Wed, 19 Aug 2009) | 2 lines - Destory AudioCDManager singleton after user quits a game, this saves a few bytes memory - Added FIXME to audiocd.h, concering why destroying the AudioCDManager can not quit CD playback right now ........ r43514 | joostp | 2009-08-19 01:39:47 +1000 (Wed, 19 Aug 2009) | 2 lines PSP: disable dosbox OPL ........ r43515 | lordhoto | 2009-08-19 01:41:00 +1000 (Wed, 19 Aug 2009) | 1 line Typos. ........ r43517 | joostp | 2009-08-19 03:12:01 +1000 (Wed, 19 Aug 2009) | 2 lines PSP: Make R-trigger act as a context sensitive modifier key, remap ENTER to triangle ........ r43519 | joostp | 2009-08-19 04:06:50 +1000 (Wed, 19 Aug 2009) | 2 lines Implement setCursorPalette(), correct hasFeature() <-> getFeatureState() mixup. ........ r43521 | john_doe | 2009-08-19 05:42:13 +1000 (Wed, 19 Aug 2009) | 2 lines - PMV player: Use frame count from PVM file and fix incorrect "invalid chunk type" warning - Fix sprite drawing glitch with vertically flipped sprites (bug #2825925) ........ r43523 | buddha_ | 2009-08-19 07:37:31 +1000 (Wed, 19 Aug 2009) | 1 line Possible fix for #2828330 (AGI: KQ1: Fast text box). If doesn't break anything else then should go to the branch-1-0-0 too, but haven't had the time to do much testing yet - thus committing to the trunk first. ........ svn-id: r43524
Diffstat (limited to 'backends/platform')
-rw-r--r--backends/platform/psp/Makefile7
-rw-r--r--backends/platform/psp/README.PSP.in9
-rw-r--r--backends/platform/psp/module.mk1
-rw-r--r--backends/platform/psp/osys_psp.cpp22
-rw-r--r--backends/platform/psp/osys_psp.h6
-rw-r--r--backends/platform/psp/osys_psp_gu.cpp21
-rw-r--r--backends/platform/psp/osys_psp_gu.h2
-rw-r--r--backends/platform/psp/powerman.cpp297
-rw-r--r--backends/platform/psp/powerman.h87
-rw-r--r--backends/platform/psp/psp.spec2
-rw-r--r--backends/platform/psp/psp_main.cpp32
11 files changed, 468 insertions, 18 deletions
diff --git a/backends/platform/psp/Makefile b/backends/platform/psp/Makefile
index 91a0c60bd6..d18e6ac82c 100644
--- a/backends/platform/psp/Makefile
+++ b/backends/platform/psp/Makefile
@@ -62,7 +62,7 @@ endif
INCDIR := $(srcdir) . $(srcdir)/engines/ . $(PSPSDK)/include
LIBDIR := $(LIBDIR) . $(PSPSDK)/lib
-CXXFLAGS = -O2 -Wall -D__PSP__ -DNONSTANDARD_PORT -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DUSE_ZLIB -Wno-multichar `$(PSPBIN)/sdl-config --cflags`
+CXXFLAGS = -O3 -Wall -D__PSP__ -DNONSTANDARD_PORT -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DUSE_ZLIB -DDISABLE_DOSBOX_OPL -Wno-multichar `$(PSPBIN)/sdl-config --cflags`
CXXFLAGS:= $(addprefix -I,$(INCDIR)) $(CXXFLAGS)
LDFLAGS := $(addprefix -L,$(LIBDIR)) $(LDFLAGS)
LIBS =
@@ -75,12 +75,13 @@ LIBS += -lmad
CXXFLAGS+= -DUSE_VORBIS -DUSE_TREMOR
LIBS += -lvorbisidec
-LIBS += `$(PSPBIN)/sdl-config --libs` -lz -lstdc++ -lc -lpspdisplay -lpspgu -lpspctrl -lpspsdk -lpspnet -lpspnet_inet -lpsputility -lpspsdk -lpspuser
+LIBS += `$(PSPBIN)/sdl-config --libs` -lz -lstdc++ -lc -lpspdisplay -lpspgu -lpspctrl -lpspsdk -lpspnet -lpspnet_inet -lpsputility -lpspuser -lpsppower
CXXFLAGS := $(CXXFLAGS) -fno-exceptions -fno-rtti
TARGET = scummvm-psp
-OBJS := psp_main.o \
+OBJS := powerman.o \
+ psp_main.o \
osys_psp.o \
osys_psp_gu.o \
kbd_ss_c.o \
diff --git a/backends/platform/psp/README.PSP.in b/backends/platform/psp/README.PSP.in
index 2a2b53e721..7eeba7d391 100644
--- a/backends/platform/psp/README.PSP.in
+++ b/backends/platform/psp/README.PSP.in
@@ -13,15 +13,17 @@ Controls
========
Left trigger - ESC
-Right trigger - Enter
+Right trigger - Modifier key (see below for uses)
Analog - Mouse movement
+Right trigger + Analog - Fine control mouse
Directionals - Mouse movement
-Analog + triangle - Fine control mouse
+Triangle - Enter
Cross - Mouse button 1
Circle - Mouse button 2
Square - '.' (skip dialogue in some games)
Select - Show/Hide Virtual Keyboard
Start - F5
+Right trigger + Start - Return-To-Launcher menu
Notes
=====
@@ -32,9 +34,6 @@ Notes
As such, it is recommended to play games in their original, uncompressed,
form whenever possible.
-- Sleep/Suspend mode currently isn't supported, so don't use it when
- running ScummVM.
-
- This README may be outdated, for more up-to-date instructions and notes see
the PSP Port Wiki: http://wiki.scummvm.org/index.php/PlayStation_Portable
diff --git a/backends/platform/psp/module.mk b/backends/platform/psp/module.mk
index afe9a23f58..8f083c5dfa 100644
--- a/backends/platform/psp/module.mk
+++ b/backends/platform/psp/module.mk
@@ -1,6 +1,7 @@
MODULE := backends/platform/psp
MODULE_OBJS := \
+ powerman.o \
psp_main.o \
osys_psp.o \
osys_psp_gu.o \
diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp
index 45be0a0cd3..566db3014b 100644
--- a/backends/platform/psp/osys_psp.cpp
+++ b/backends/platform/psp/osys_psp.cpp
@@ -79,6 +79,8 @@ OSystem_PSP::OSystem_PSP() : _screenWidth(0), _screenHeight(0), _overlayWidth(0)
memset(_palette, 0, sizeof(_palette));
+ _cursorPaletteDisabled = true;
+
_samplesPerSec = 0;
//init SDL
@@ -110,14 +112,14 @@ void OSystem_PSP::initBackend() {
bool OSystem_PSP::hasFeature(Feature f) {
- return false;
+ return (f == kFeatureOverlaySupportsAlpha || f == kFeatureCursorHasPalette);
}
void OSystem_PSP::setFeatureState(Feature f, bool enable) {
}
bool OSystem_PSP::getFeatureState(Feature f) {
- return (f == kFeatureOverlaySupportsAlpha);
+ return false;
}
const OSystem::GraphicsMode* OSystem_PSP::getSupportedGraphicsModes() const {
@@ -411,7 +413,7 @@ bool OSystem_PSP::pollEvent(Common::Event &event) {
*/
uint32 buttonsChanged = pad.Buttons ^ _prevButtons;
- if (buttonsChanged & (PSP_CTRL_CROSS | PSP_CTRL_CIRCLE | PSP_CTRL_LTRIGGER | PSP_CTRL_RTRIGGER | PSP_CTRL_START | PSP_CTRL_SELECT | PSP_CTRL_SQUARE)) {
+ if (buttonsChanged & (PSP_CTRL_CROSS | PSP_CTRL_CIRCLE | PSP_CTRL_LTRIGGER | PSP_CTRL_RTRIGGER | PSP_CTRL_START | PSP_CTRL_SELECT | PSP_CTRL_SQUARE | PSP_CTRL_TRIANGLE)) {
if (buttonsChanged & PSP_CTRL_CROSS) {
event.type = (pad.Buttons & PSP_CTRL_CROSS) ? Common::EVENT_LBUTTONDOWN : Common::EVENT_LBUTTONUP;
} else if (buttonsChanged & PSP_CTRL_CIRCLE) {
@@ -419,23 +421,29 @@ bool OSystem_PSP::pollEvent(Common::Event &event) {
} else {
//any of the other buttons.
event.type = buttonsChanged & pad.Buttons ? Common::EVENT_KEYDOWN : Common::EVENT_KEYUP;
+ event.kbd.ascii = 0;
event.kbd.flags = 0;
if (buttonsChanged & PSP_CTRL_LTRIGGER) {
event.kbd.keycode = Common::KEYCODE_ESCAPE;
event.kbd.ascii = 27;
- } else if (buttonsChanged & PSP_CTRL_RTRIGGER) {
- event.kbd.keycode = Common::KEYCODE_RETURN;
- event.kbd.ascii = 13;
} else if (buttonsChanged & PSP_CTRL_START) {
event.kbd.keycode = Common::KEYCODE_F5;
event.kbd.ascii = Common::ASCII_F5;
+ if (pad.Buttons & PSP_CTRL_RTRIGGER) {
+ event.kbd.flags = Common::KBD_CTRL; // Main menu to allow RTL
+ }
/* } else if (buttonsChanged & PSP_CTRL_SELECT) {
event.kbd.keycode = Common::KEYCODE_0;
event.kbd.ascii = '0';
*/ } else if (buttonsChanged & PSP_CTRL_SQUARE) {
event.kbd.keycode = Common::KEYCODE_PERIOD;
event.kbd.ascii = '.';
+ } else if (buttonsChanged & PSP_CTRL_TRIANGLE) {
+ event.kbd.keycode = Common::KEYCODE_RETURN;
+ event.kbd.ascii = 13;
+ } else if (pad.Buttons & PSP_CTRL_RTRIGGER) {
+ event.kbd.flags |= Common::KBD_SHIFT;
}
}
@@ -484,7 +492,7 @@ bool OSystem_PSP::pollEvent(Common::Event &event) {
newY += _padAccel >> 2;
// If no movement then this has no effect
- if (pad.Buttons & PSP_CTRL_TRIANGLE) {
+ if (pad.Buttons & PSP_CTRL_RTRIGGER) {
// Fine control mode for analog
if (analogStepAmountX != 0) {
if (analogStepAmountX > 0)
diff --git a/backends/platform/psp/osys_psp.h b/backends/platform/psp/osys_psp.h
index 34957b293c..310efdc7d4 100644
--- a/backends/platform/psp/osys_psp.h
+++ b/backends/platform/psp/osys_psp.h
@@ -23,6 +23,9 @@
*
*/
+#ifndef OSYS_PSP_H
+#define OSYS_PSP_H
+
#include "common/scummsys.h"
#include "graphics/surface.h"
#include "graphics/colormasks.h"
@@ -65,6 +68,7 @@ protected:
int _mouseHotspotX, _mouseHotspotY;
byte _mouseKeyColour;
byte *_mouseBuf;
+ bool _cursorPaletteDisabled;
uint32 _prevButtons;
uint32 _lastPadCheck;
@@ -144,3 +148,5 @@ public:
virtual Common::WriteStream *createConfigWriteStream();
};
+
+#endif /* OSYS_PSP_H */
diff --git a/backends/platform/psp/osys_psp_gu.cpp b/backends/platform/psp/osys_psp_gu.cpp
index 76f6b42e37..0fb1b4aded 100644
--- a/backends/platform/psp/osys_psp_gu.cpp
+++ b/backends/platform/psp/osys_psp_gu.cpp
@@ -41,6 +41,7 @@
unsigned int __attribute__((aligned(16))) list[262144];
unsigned short __attribute__((aligned(16))) clut256[256];
unsigned short __attribute__((aligned(16))) mouseClut[256];
+unsigned short __attribute__((aligned(16))) cursorPalette[256];
unsigned short __attribute__((aligned(16))) kbClut[256];
//unsigned int __attribute__((aligned(16))) offscreen256[640*480];
//unsigned int __attribute__((aligned(16))) overlayBuffer256[640*480*2];
@@ -225,6 +226,24 @@ void OSystem_PSP_GU::setPalette(const byte *colors, uint start, uint num) {
sceKernelDcacheWritebackAll();
}
+void OSystem_PSP_GU::setCursorPalette(const byte *colors, uint start, uint num) {
+ const byte *b = colors;
+
+ for (uint i = 0; i < num; ++i) {
+ cursorPalette[start + i] = RGBToColour(b[0], b[1], b[2]);
+ b += 4;
+ }
+
+ cursorPalette[0] = 0;
+
+ _cursorPaletteDisabled = false;
+
+ sceKernelDcacheWritebackAll();
+}
+
+void OSystem_PSP_GU::disableCursorPalette(bool disable) {
+ _cursorPaletteDisabled = disable;
+}
void OSystem_PSP_GU::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) {
//Clip the coordinates
@@ -364,7 +383,7 @@ void OSystem_PSP_GU::updateScreen() {
if (_mouseVisible) {
sceGuTexMode(GU_PSM_T8, 0, 0, 0); // 8-bit image
sceGuClutMode(GU_PSM_5551, 0, 0xff, 0);
- sceGuClutLoad(32, mouseClut); // upload 32*8 entries (256)
+ sceGuClutLoad(32, _cursorPaletteDisabled ? mouseClut : cursorPalette); // upload 32*8 entries (256)
sceGuAlphaFunc(GU_GREATER,0,0xff);
sceGuEnable(GU_ALPHA_TEST);
sceGuTexImage(0, MOUSE_SIZE, MOUSE_SIZE, MOUSE_SIZE, _mouseBuf);
diff --git a/backends/platform/psp/osys_psp_gu.h b/backends/platform/psp/osys_psp_gu.h
index e828a36b7d..c221971fc8 100644
--- a/backends/platform/psp/osys_psp_gu.h
+++ b/backends/platform/psp/osys_psp_gu.h
@@ -47,6 +47,8 @@ public:
void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int cursorTargetScale);
void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) ;
void setPalette(const byte *colors, uint start, uint num);
+ void setCursorPalette(const byte *colors, uint start, uint num);
+ void disableCursorPalette(bool disable);
bool pollEvent(Common::Event &event);
int _graphicMode;
struct Vertex *_vertices;
diff --git a/backends/platform/psp/powerman.cpp b/backends/platform/psp/powerman.cpp
new file mode 100644
index 0000000000..c553669fc3
--- /dev/null
+++ b/backends/platform/psp/powerman.cpp
@@ -0,0 +1,297 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "./powerman.h"
+#include "./trace.h"
+
+DECLARE_SINGLETON(PowerManager);
+
+ /*******************************************
+*
+* Constructor
+*
+********************************************/
+PowerManager::PowerManager() {
+ _flagMutex = NULL; /* Init mutex handle */
+ _listMutex = NULL; /* Init mutex handle */
+ _condSuspendable = NULL; /* Init condition variable */
+ _condPM = NULL;
+
+ _condSuspendable = SDL_CreateCond();
+ if (_condSuspendable <= 0) {
+ PSPDebugTrace("PowerManager::PowerManager(): Couldn't create condSuspendable\n");
+ }
+
+ _condPM = SDL_CreateCond();
+ if (_condPM <= 0) {
+ PSPDebugTrace("PowerManager::PowerManager(): Couldn't create condPM\n");
+ }
+
+ _flagMutex = SDL_CreateMutex();
+ if (_flagMutex <= 0) {
+ PSPDebugTrace("PowerManager::PowerManager(): Couldn't create flagMutex\n");
+ }
+
+ _listMutex = SDL_CreateMutex();
+ if (_listMutex <= 0) {
+ PSPDebugTrace("PowerManager::PowerManager(): Couldn't create listMutex\n");
+ }
+
+ _suspendFlag = false;
+ _criticalCounter = 0;
+ }
+
+/*******************************************
+*
+* Function to register to be notified when suspend/resume time comes
+*
+********************************************/
+int PowerManager::registerSuspend(Suspendable *item) {
+ // Register in list
+ PSPDebugTrace("In registerSuspend\n");
+
+ if (SDL_mutexP(_listMutex) != 0) {
+ PSPDebugTrace("PowerManager::registerSuspend(): Couldn't lock _listMutex %d\n", _listMutex);
+ }
+
+ _suspendList.push_front(item);
+
+ if (SDL_mutexV(_listMutex) != 0) {
+ PSPDebugTrace("PowerManager::registerSuspend(): Couldn't unlock _listMutex %d\n", _listMutex);
+ }
+
+ PSPDebugTrace("Out of registerSuspend\n");
+
+ return 0;
+}
+
+/*******************************************
+*
+* Function to unregister to be notified when suspend/resume time comes
+*
+********************************************/
+int PowerManager::unregisterSuspend(Suspendable *item) {
+
+ PSPDebugTrace("In unregisterSuspend\n");
+
+ // Unregister from stream list
+ if (SDL_mutexP(_listMutex) != 0) {
+ PSPDebugTrace("PowerManager::unregisterSuspend(): Couldn't unlock _listMutex %d\n", _listMutex);
+ }
+
+ _suspendList.remove(item);
+
+ if (SDL_mutexV(_listMutex) != 0) {
+ PSPDebugTrace("PowerManager::unregisterSuspend(): Couldn't unlock _listMutex %d\n", _listMutex);
+ }
+
+ PSPDebugTrace("Out of unregisterSuspend\n");
+
+ return 0;
+ }
+
+ /*******************************************
+*
+* Destructor
+*
+********************************************/
+ PowerManager::~PowerManager() {
+ SDL_DestroyCond(_condSuspendable);
+ _condSuspendable = 0;
+
+ SDL_DestroyCond(_condPM);
+ _condPM = 0;
+
+ SDL_DestroyMutex(_flagMutex);
+ _flagMutex = 0;
+
+ SDL_DestroyMutex(_listMutex);
+ _listMutex = 0;
+ }
+
+
+ /*******************************************
+*
+* Function to be called by threads wanting to block on the PSP entering suspend
+*
+********************************************/
+ int PowerManager::blockOnSuspend() {
+ return beginCriticalSection(true);
+}
+
+ /*
+ * Function to block on a suspend, then start a non-suspendable critical section
+ */
+int PowerManager::beginCriticalSection(bool justBlock) {
+ int ret = PowerManager::NotBlocked;
+
+ if (SDL_mutexP(_flagMutex) != 0) {
+ PSPDebugTrace("PowerManager::blockOnSuspend(): Couldn't lock flagMutex %d\n", _flagMutex);
+ ret = PowerManager::Error;
+ }
+
+ // Check the access flag
+ if (_suspendFlag == true) {
+ PSPDebugTrace("Blocking!!\n");
+ ret = PowerManager::Blocked;
+
+ // If it's true, we wait for a signal to continue
+ if( SDL_CondWait(_condSuspendable, _flagMutex) != 0) {
+ PSPDebugTrace("PowerManager::blockOnSuspend(): Couldn't wait on cond %d\n", _condSuspendable);
+ }
+
+ PSPDebugTrace("We got blocked!!\n");
+ }
+
+ // Now put the pm to sleep
+ if (justBlock == false)
+ _criticalCounter++;
+
+ if (SDL_mutexV(_flagMutex) != 0) {
+ PSPDebugTrace("PowerManager::blockOnSuspend(): Couldn't unlock flagMutex %d\n", _flagMutex);
+ ret = PowerManager::Error;
+ }
+
+ return ret;
+}
+
+int PowerManager::endCriticalSection() {
+ int ret = 0;
+
+ if (SDL_mutexP(_flagMutex) != 0) {
+ PSPDebugTrace("PowerManager::endCriticalSection(): Couldn't lock flagMutex %d\n", _flagMutex);
+ ret = PowerManager::Error;
+ }
+
+ // We're done with our critical section
+ _criticalCounter--;
+
+ if (_criticalCounter <= 0) {
+ if(_suspendFlag == true) PSPDebugTrace("Waking up the PM and suspendFlag is true\n");
+
+ SDL_CondBroadcast(_condPM);
+
+ if (_criticalCounter < 0) {
+ PSPDebugTrace("PowerManager::endCriticalSection(): Error! Critical counter is %d\n", _criticalCounter);
+ }
+ }
+
+ if (SDL_mutexV(_flagMutex) != 0) {
+ PSPDebugTrace("PowerManager::endCriticalSection(): Couldn't unlock flagMutex %d\n", _flagMutex);
+ ret = PowerManager::Error;
+ }
+
+ return ret;
+}
+
+ /*******************************************
+*
+* Callback function to be called to put every Suspendable to suspend
+*
+********************************************/
+int PowerManager::suspend() {
+ int ret = 0;
+
+ // First we set the suspend flag to true
+ if (SDL_mutexP(_flagMutex) != 0) {
+ PSPDebugTrace("PowerManager::suspend(): Couldn't lock flagMutex %d\n", _flagMutex);
+ ret = -1;
+ }
+
+ _suspendFlag = true;
+
+ if (_criticalCounter > 0)
+ SDL_CondWait(_condPM, _flagMutex);
+
+ if (SDL_mutexV(_flagMutex) != 0) {
+ PSPDebugTrace("PowerManager::suspend(): Couldn't unlock flagMutex %d\n", _flagMutex);
+ ret = -1;
+ }
+
+ // Loop over list, calling suspend()
+ if (SDL_mutexP(_listMutex) != 0) {
+ PSPDebugTrace("PowerManager::suspend(): Couldn't lock listMutex %d\n", _listMutex);
+ ret = -1;
+ }
+
+ Common::List<Suspendable *>::iterator i = _suspendList.begin();
+
+ for (; i != _suspendList.end(); i++) {
+ (*i)->suspend();
+ }
+
+ if (SDL_mutexV(_listMutex) != 0) {
+ PSPDebugTrace("PowerManager::suspend(): Couldn't unlock listMutex %d\n", _listMutex);
+ ret = -1;
+ }
+
+ return ret;
+}
+
+/*******************************************
+*
+* Callback function to resume every Suspendable
+*
+********************************************/
+int PowerManager::resume() {
+ int ret = 0;
+
+ // First we notify our Suspendables. Loop over list, calling resume()
+ if (SDL_mutexP(_listMutex) != 0) {
+ PSPDebugTrace("PowerManager::resume(): Couldn't lock listMutex %d\n", _listMutex);
+ ret = -1;
+ }
+
+ Common::List<Suspendable *>::iterator i = _suspendList.begin();
+
+ for (; i != _suspendList.end(); i++) {
+ (*i)->resume();
+ }
+
+ if (SDL_mutexV(_listMutex) != 0) {
+ PSPDebugTrace("PowerManager::resume(): Couldn't unlock listMutex %d\n", _listMutex);
+ ret = -1;
+ }
+
+ // Now we set the suspend flag to false
+ if (SDL_mutexP(_flagMutex) != 0) {
+ PSPDebugTrace("PowerManager::resume(): Couldn't lock flagMutex %d\n", _flagMutex);
+ ret = -1;
+ }
+ _suspendFlag = false;
+
+ // Signal the other threads to wake up
+ if (SDL_CondBroadcast(_condSuspendable) != 0) {
+ PSPDebugTrace("PowerManager::resume(): Couldn't broadcast condition %d\n", _condSuspendable);
+ ret = -1;
+ }
+
+ if (SDL_mutexV(_flagMutex) != 0) {
+ PSPDebugTrace("PowerManager::resume(): Couldn't unlock flagMutex %d\n", _flagMutex);
+ ret = -1;
+ }
+
+ return ret;
+}
diff --git a/backends/platform/psp/powerman.h b/backends/platform/psp/powerman.h
new file mode 100644
index 0000000000..0a5f7a2361
--- /dev/null
+++ b/backends/platform/psp/powerman.h
@@ -0,0 +1,87 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef POWERMAN_H
+#define POWERMAN_H
+
+#include <SDL/SDL_thread.h>
+#include <SDL/SDL_mutex.h>
+#include "common/singleton.h"
+#include "common/list.h"
+
+ /*
+ * Implement this class (interface) if you want to use PowerManager's suspend callback functionality
+ *
+ */
+ class Suspendable {
+ public:
+ virtual ~Suspendable() {}
+ virtual int suspend() = 0;
+ virtual int resume() = 0;
+ };
+
+ /******************************************************************************************************
+ *
+ * This class will call a Suspendable when the PSP goes to suspend/resumes. It also provides the ability to block
+ * a thread when the PSP is going to suspend/suspending, and to wake it up when the PSP is resumed.
+ * This ability is very useful for managing the PSPIoStream class, but may be found useful by other classes as well.
+ *
+ *******************************************************************************************************/
+ class PowerManager: public Common::Singleton<PowerManager> {
+private:
+ friend class Common::Singleton<PowerManager>;
+ PowerManager();
+ ~PowerManager();
+
+ Common::List<Suspendable *> _suspendList; /* list to register in */
+
+ bool _suspendFlag; /* protected variable */
+ SDL_mutex *_flagMutex; /* mutex to access access flag */
+ SDL_mutex *_listMutex; /* mutex to access Suspendable list */
+ SDL_cond *_condSuspendable; /* signal to synchronize accessing threads */
+ SDL_cond *_condPM; /* signal to wake up the PM from a critical section */
+ int _criticalCounter; /* Counter of how many threads are in a critical section */
+
+public:
+ int blockOnSuspend(); /* block if suspending */
+ int beginCriticalSection(bool justBlock = false); /* Use a critical section to block (if suspend was already pressed) */
+ int endCriticalSection(); /* and to prevent the PSP from suspending in a particular section */
+ int registerSuspend(Suspendable *item); /* register to be called to suspend/resume */
+ int unregisterSuspend(Suspendable *item); /* remove from suspend/resume list */
+ int suspend(); /* callback to have all items in list suspend */
+ int resume(); /* callback to have all items in list resume */
+
+ enum {
+ Error = -1,
+ NotBlocked = 0,
+ Blocked = 1
+ };
+
+ };
+
+ // For easy access
+#define PowerMan PowerManager::instance()
+
+ #endif /* POWERMAN_H */
diff --git a/backends/platform/psp/psp.spec b/backends/platform/psp/psp.spec
index 807b8f93b7..e319b022f7 100644
--- a/backends/platform/psp/psp.spec
+++ b/backends/platform/psp/psp.spec
@@ -1,3 +1,3 @@
%rename lib old_lib
*lib:
-%(old_lib) -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet -lz -lstdc++ -lc -lpspdisplay -lpspgu -lpspctrl -lpspsdk -lpspnet -lpspnet_inet -lpsputility -lpspsdk -lpspuser
+%(old_lib) -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet -lz -lstdc++ -lc -lpspdisplay -lpspgu -lpspctrl -lpspsdk -lpspnet -lpspnet_inet -lpsputility -lpspuser -lpsppower
diff --git a/backends/platform/psp/psp_main.cpp b/backends/platform/psp/psp_main.cpp
index 0af7ebf269..3ea6c55368 100644
--- a/backends/platform/psp/psp_main.cpp
+++ b/backends/platform/psp/psp_main.cpp
@@ -31,10 +31,14 @@
#include <pspdebug.h>
#endif
+#include <psppower.h>
+
#include <common/system.h>
#include <engines/engine.h>
#include <base/main.h>
#include <base/plugins.h>
+#include "backends/platform/psp/powerman.h"
+
#include "osys_psp_gu.h"
#include "./trace.h"
@@ -91,17 +95,36 @@ void loaderInit() {
#endif
/* Exit callback */
-SceKernelCallbackFunction exit_callback(int /*arg1*/, int /*arg2*/, void * /*common*/) {
+int exit_callback(void) {
sceKernelExitGame();
return 0;
}
+/* Function for handling suspend/resume */
+void power_callback(int , int powerinfo) {
+ if (powerinfo & PSP_POWER_CB_POWER_SWITCH || powerinfo & PSP_POWER_CB_SUSPENDING) {
+ PowerMan.suspend();
+ } else if (powerinfo & PSP_POWER_CB_RESUME_COMPLETE) {
+ PowerMan.resume();
+ }
+}
+
/* Callback thread */
int CallbackThread(SceSize /*size*/, void *arg) {
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", (SceKernelCallbackFunction)exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
+ /* Set up callbacks for PSPIoStream */
+
+ cbid = sceKernelCreateCallback("Power Callback", (SceKernelCallbackFunction)power_callback, 0);
+ if (cbid >= 0) {
+ if(scePowerRegisterCallback(-1, cbid) < 0) {
+ PSPDebugTrace("SetupCallbacks(): Couldn't register callback for power_callback\n");
+ }
+ } else {
+ PSPDebugTrace("SetupCallbacks(): Couldn't create a callback for power_callback\n");
+ }
sceKernelSleepThreadCB();
return 0;
@@ -119,8 +142,13 @@ int SetupCallbacks(void) {
#undef main
int main(void) {
+ PowerManager::instance(); // Setup power manager
+
SetupCallbacks();
+ //change clock rate to 333mhz
+ scePowerSetClockFrequency(333, 333, 166);
+
static const char *argv[] = { "scummvm", NULL };
static int argc = sizeof(argv)/sizeof(char *)-1;
@@ -131,6 +159,8 @@ int main(void) {
g_system->quit(); // TODO: Consider removing / replacing this!
+ PowerManager::destroy(); // get rid of PowerManager
+
sceKernelSleepThread();
return res;