aboutsummaryrefslogtreecommitdiff
path: root/backends/morphos/morphos.cpp
diff options
context:
space:
mode:
authorRuediger Hanke2003-08-23 18:01:21 +0000
committerRuediger Hanke2003-08-23 18:01:21 +0000
commitfda9c872188128862936da88f2a1ec41af5d5dd9 (patch)
treea1a791d8cdb355778e341617fac7cc6f8c3411c4 /backends/morphos/morphos.cpp
parent6768da3e7689224e5b8fb0c0961b6f0829dd17c9 (diff)
downloadscummvm-rg350-fda9c872188128862936da88f2a1ec41af5d5dd9.tar.gz
scummvm-rg350-fda9c872188128862936da88f2a1ec41af5d5dd9.tar.bz2
scummvm-rg350-fda9c872188128862936da88f2a1ec41af5d5dd9.zip
little bugfix, safer code
svn-id: r9832
Diffstat (limited to 'backends/morphos/morphos.cpp')
-rw-r--r--backends/morphos/morphos.cpp127
1 files changed, 95 insertions, 32 deletions
diff --git a/backends/morphos/morphos.cpp b/backends/morphos/morphos.cpp
index d90205c750..d565a57d6c 100644
--- a/backends/morphos/morphos.cpp
+++ b/backends/morphos/morphos.cpp
@@ -79,6 +79,12 @@ OSystem_MorphOS *OSystem_MorphOS::create(SCALERTYPE gfx_scaler, bool full_screen
{
OSystem_MorphOS *syst = new OSystem_MorphOS(gfx_scaler, full_screen);
+ if (!syst || !syst->Initialise())
+ {
+ delete syst;
+ error("Failed to create system object. Exiting.");
+ }
+
return syst;
}
@@ -117,7 +123,18 @@ OSystem_MorphOS::OSystem_MorphOS(SCALERTYPE gfx_mode, bool full_screen)
TimerIORequest = NULL;
InputMsgPort = NULL;
InputIORequest = NULL;
+ ThreadPort = NULL;
+ OvlCMap = NULL;
+ OvlBitMap = NULL;
+ OvlSavedBuffer = NULL;
+ TimerBase = NULL;
+ ScummNoCursor = NULL;
+ UpdateRegion = NULL;
+ NewUpdateRegion = NULL;
+}
+bool OSystem_MorphOS::Initialise()
+{
OpenATimer(&TimerMsgPort, (IORequest **) &TimerIORequest, UNIT_MICROHZ);
if ((InputMsgPort = CreateMsgPort()))
@@ -140,11 +157,19 @@ OSystem_MorphOS::OSystem_MorphOS(SCALERTYPE gfx_mode, bool full_screen)
}
if (!InputIORequest)
+ {
warning("input.device could not be opened");
+ return false;
+ }
+
+ ThreadPort = CreateMsgPort();
+ if (!ThreadPort)
+ {
+ warning("Unable to create a message port");
+ return false;
+ }
OvlCMap = GetColorMap(256);
- OvlBitMap = NULL;
- OvlSavedBuffer = NULL;
InitSemaphore(&CritSec);
@@ -153,11 +178,22 @@ OSystem_MorphOS::OSystem_MorphOS(SCALERTYPE gfx_mode, bool full_screen)
UpdateRegion = NewRegion();
NewUpdateRegion = NewRegion();
if (!UpdateRegion || !NewUpdateRegion)
- error("Could not create region for screen update");
+ {
+ warning("Could not create region for screen update");
+ return false;
+ }
if (!OvlCMap)
- error("Could not allocate overlay color map");
+ {
+ warning("Could not allocate overlay color map");
+ return false;
+ }
if (!ScummNoCursor)
- error("Could not allocate empty cursor image");
+ {
+ warning("Could not allocate empty cursor image");
+ return false;
+ }
+
+ return true;
}
OSystem_MorphOS::~OSystem_MorphOS()
@@ -172,13 +208,9 @@ OSystem_MorphOS::~OSystem_MorphOS()
}
if (OvlCMap)
- {
FreeColorMap(OvlCMap);
- OvlCMap = NULL;
- }
- if (Scaler)
- delete Scaler;
+ delete Scaler;
if (UpdateRegion)
DisposeRegion(UpdateRegion);
@@ -186,6 +218,9 @@ OSystem_MorphOS::~OSystem_MorphOS()
if (NewUpdateRegion)
DisposeRegion(NewUpdateRegion);
+ if (ThreadPort)
+ DeleteMsgPort(ThreadPort);
+
if (CDrive && CDDABase)
{
CDDA_Stop(CDrive);
@@ -210,23 +245,6 @@ OSystem_MorphOS::~OSystem_MorphOS()
if (TimerMsgPort)
DeleteMsgPort(TimerMsgPort);
- if (ScummMusicThread)
- {
- if (!AttemptSemaphore(&ScummMusicThreadRunning))
- {
- Signal((Task *) ScummMusicThread, SIGBREAKF_CTRL_C);
- ObtainSemaphore(&ScummMusicThreadRunning); /* Wait for thread to finish */
- }
- ReleaseSemaphore(&ScummMusicThreadRunning);
- }
-
- if (ScummSoundThread)
- {
- Signal((Task *) ScummSoundThread, SIGBREAKF_CTRL_C);
- ObtainSemaphore(&ScummSoundThreadRunning); /* Wait for thread to finish */
- ReleaseSemaphore(&ScummSoundThreadRunning);
- }
-
if (ScummNoCursor)
FreeVec(ScummNoCursor);
@@ -312,9 +330,14 @@ void OSystem_MorphOS::set_timer(int timer, int (*callback)(int))
void OSystem_MorphOS::create_thread(ThreadProc *proc, void *param)
{
+ MusicStartup.mn_Node.ln_Type = NT_MESSAGE;
+ MusicStartup.mn_ReplyPort = ThreadPort;
+ MusicStartup.mn_Length = sizeof(MusicStartup);
+
ScummMusicThread = CreateNewProcTags(NP_Entry, (ULONG) proc, NP_CodeType, CODETYPE_PPC,
NP_Name, (ULONG) "ScummVM Music Thread",
- NP_Priority, 60, NP_StackSize, 32000,
+ NP_Priority, 40, NP_StackSize, 32000,
+ NP_StartupMsg, &MusicStartup,
NP_PPC_Arg1, (ULONG) param, TAG_DONE);
}
@@ -349,6 +372,9 @@ uint32 OSystem_MorphOS::property(int param, Property *value)
switch (param)
{
+ case PROP_GET_FULLSCREEN:
+ return ScummScreen != NULL;
+
case PROP_TOGGLE_FULLSCREEN:
CreateScreen(CSDSPTYPE_TOGGLE);
return 1;
@@ -490,6 +516,31 @@ void OSystem_MorphOS::update_cdrom()
void OSystem_MorphOS::quit()
{
+ int num_threads = 0;
+
+ if (ScummMusicThread)
+ {
+ num_threads++;
+ Signal((Task *) ScummMusicThread, SIGBREAKF_CTRL_C);
+ ScummMusicThread = NULL;
+ }
+
+ if (ScummSoundThread)
+ {
+ num_threads++;
+ Signal((Task *) ScummSoundThread, SIGBREAKF_CTRL_C);
+ ScummSoundThread = NULL;
+ }
+
+ while (num_threads > 0)
+ {
+ Message* msg;
+
+ WaitPort(ThreadPort);
+ while (msg = GetMsg(ThreadPort))
+ num_threads--;
+ }
+
exit(0);
}
@@ -960,8 +1011,8 @@ void OSystem_MorphOS::warp_mouse(int x, int y)
if ((NewPixel = (IEPointerPixel*) AllocVec(sizeof (IEPointerPixel), MEMF_PUBLIC)))
{
NewPixel->iepp_Screen = ScummWindow->WScreen;
- NewPixel->iepp_Position.X = x + ScummWindow->LeftEdge + ScummWindow->BorderLeft;
- NewPixel->iepp_Position.Y = x+ScummWindow->TopEdge + ScummWindow->BorderTop;
+ NewPixel->iepp_Position.X = (x << ScummScale) + ScummWindow->LeftEdge + ScummWindow->BorderLeft;
+ NewPixel->iepp_Position.Y = (y << ScummScale) + ScummWindow->TopEdge + ScummWindow->BorderTop;
FakeIE->ie_EventAddress = NewPixel;
FakeIE->ie_NextEvent = NULL;
@@ -1414,15 +1465,27 @@ void OSystem_MorphOS::set_mouse_cursor(const byte *buf, uint w, uint h, int hots
bool OSystem_MorphOS::set_sound_proc(OSystem::SoundProc *proc, void *param, OSystem::SoundFormat format)
{
+ if (ScummSoundThread)
+ {
+ if (SoundProc == proc)
+ return true;
+ clear_sound_proc();
+ }
+
SoundProc = proc;
SoundParam = param;
/*
* Create Sound Thread
*/
+ SoundStartup.mn_Node.ln_Type = NT_MESSAGE;
+ SoundStartup.mn_ReplyPort = ThreadPort;
+ SoundStartup.mn_Length = sizeof(SoundStartup);
+
ScummSoundThread = CreateNewProcTags(NP_Entry, (ULONG) &morphos_sound_thread,
NP_CodeType, CODETYPE_PPC,
NP_Name, (ULONG) "ScummVM Sound Thread",
+ NP_StartupMsg, &SoundStartup,
NP_PPC_Arg1, (ULONG) this,
NP_PPC_Arg2, AHIST_S16S, TAG_DONE);
if (!ScummSoundThread)
@@ -1448,9 +1511,9 @@ void OSystem_MorphOS::clear_sound_proc()
if (ScummSoundThread)
{
Signal((Task *) ScummSoundThread, SIGBREAKF_CTRL_C);
- ObtainSemaphore(&ScummSoundThreadRunning); /* Wait for thread to finish */
- ReleaseSemaphore(&ScummSoundThreadRunning);
ScummSoundThread = NULL;
+ /* Wait for thread to finish */
+ WaitPort(ThreadPort);
}
}