aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/symbian
diff options
context:
space:
mode:
Diffstat (limited to 'backends/platform/symbian')
-rw-r--r--backends/platform/symbian/AdaptAllMMPs.pl7
-rw-r--r--backends/platform/symbian/BuildPackageUpload_LocalSettings.pl8
-rw-r--r--backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in3
-rw-r--r--backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in3
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in5
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in4
-rw-r--r--backends/platform/symbian/mmp/scummvm_base.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_toon.mmp.in64
-rw-r--r--backends/platform/symbian/src/SymbianOS.cpp465
-rw-r--r--backends/platform/symbian/src/SymbianOS.h118
-rw-r--r--backends/platform/symbian/src/Symbianmain.cpp99
-rw-r--r--backends/platform/symbian/src/portdefs.h7
12 files changed, 600 insertions, 195 deletions
diff --git a/backends/platform/symbian/AdaptAllMMPs.pl b/backends/platform/symbian/AdaptAllMMPs.pl
index 8e97f469f9..8786ecff32 100644
--- a/backends/platform/symbian/AdaptAllMMPs.pl
+++ b/backends/platform/symbian/AdaptAllMMPs.pl
@@ -34,6 +34,7 @@ chdir("../../../");
"mmp/scummvm_teenagent.mmp",
"mmp/scummvm_mohawk.mmp",
"mmp/scummvm_hugo.mmp",
+ "mmp/scummvm_toon.mmp",
# Target Platform Project Files
"S60/ScummVM_S60.mmp",
"S60v3/ScummVM_S60v3.mmp",
@@ -92,6 +93,9 @@ my @excludes_graphics = (
"iff.cpp"
);
+my @excludes_gui = (
+);
+
# the USE_ARM_* defines not parsed correctly, exclude manually:
my @excludes_scumm = (
".*ARM.*", # the *ARM.s files are added in .mpp files based on WINS/ARM build!
@@ -104,7 +108,7 @@ my @excludes_scumm = (
#arseModule(mmpStr, dirStr, ifdefArray, [exclusionsArray])
ParseModule("_base", "base", \@section_empty); # now in ./TRG/ScummVM_TRG.mmp, these never change anyways...
ParseModule("_base", "common", \@section_empty);
-ParseModule("_base", "gui", \@section_empty);
+ParseModule("_base", "gui", \@section_empty, \@excludes_gui);
ParseModule("_base", "graphics", \@section_empty, \@excludes_graphics);
ParseModule("_base", "sound", \@section_empty, \@excludes_snd);
@@ -135,6 +139,7 @@ ParseModule("_draci", "draci", \@section_empty);
ParseModule("_teenagent","teenagent", \@section_empty);
ParseModule("_mohawk" ,"mohawk", \@section_empty);
ParseModule("_hugo" ,"hugo", \@section_empty);
+ParseModule("_toon" ,"toon", \@section_empty);
print "
=======================================================================================
Done. Enjoy :P
diff --git a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
index a0ec338ca0..bf80c36a0e 100644
--- a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
+++ b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
@@ -4,7 +4,7 @@
@WorkingEngines = qw(
scumm agos sky queen gob groovie saga drascula
kyra lure agi touche parallaction cine
- cruise made m4 tinsel tucker sword1 sword2 draci sci teenagent mohawk hugo
+ cruise made m4 tinsel tucker sword1 sword2 draci sci teenagent mohawk hugo toon
);
@WorkingEngines_1st = qw(
@@ -16,7 +16,7 @@
@WorkingEngines_2nd = qw(
agos sky gob
kyra lure agi tinsel
- sword1 sword2 draci sci teenagent hugo
+ sword1 sword2 draci sci teenagent hugo toon
);
@TestingEngines = qw(
@@ -302,8 +302,8 @@
# the first one includes all SDKs & release-ready engines
$VariationSets{'ALL'}{'all'} = "$DefaultFeatures @WorkingEngines @EnablableSubEngines";
- $VariationSets{'ALL'}{'1St'} = "$DefaultFeatures @WorkingEngines_1st @EnablableSubEngines";
- $VariationSets{'ALL'}{'2nd'} = "$DefaultFeatures @WorkingEngines_2nd @EnablableSubEngines";
+# $VariationSets{'ALL'}{'1St'} = "$DefaultFeatures @WorkingEngines_1st @EnablableSubEngines";
+# $VariationSets{'ALL'}{'2nd'} = "$DefaultFeatures @WorkingEngines_2nd @EnablableSubEngines";
# now one for each ready-for-release engine
if (0)
{
diff --git a/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in b/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
index 12193a8781..d044b33bb0 100644
--- a/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
+++ b/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
@@ -115,13 +115,14 @@ SOURCEPATH ..\..\..\..\base
SOURCEPATH ..\..\..\..
// backend EPOC/SDL/ESDL specific includes
+SOURCE backends\platform\sdl\events.cpp
+SOURCE backends\platform\sdl\graphics.cpp
SOURCE backends\platform\sdl\hardwarekeys.cpp
SOURCE backends\platform\sdl\sdl.cpp
SOURCE backends\fs\symbian\symbian-fs-factory.cpp
SOURCE backends\platform\symbian\src\SymbianOS.cpp
SOURCE backends\platform\symbian\src\SymbianActions.cpp
SOURCE backends\platform\symbian\src\ScummApp.cpp
-SOURCE backends\platform\symbian\src\SymbianMain.cpp
SOURCE gui\Key.cpp
SOURCE gui\KeysDialog.cpp
diff --git a/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in b/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
index 31c98b90f1..bcc00017ab 100644
--- a/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
+++ b/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
@@ -115,13 +115,14 @@ SOURCEPATH ..\..\..\..\base
SOURCEPATH ..\..\..\..
// backend EPOC/SDL/ESDL specific includes
+SOURCE backends\platform\sdl\events.cpp
+SOURCE backends\platform\sdl\graphics.cpp
SOURCE backends\platform\sdl\hardwarekeys.cpp
SOURCE backends\platform\sdl\sdl.cpp
SOURCE backends\fs\symbian\symbian-fs-factory.cpp
SOURCE backends\platform\symbian\src\SymbianOS.cpp
SOURCE backends\platform\symbian\src\SymbianActions.cpp
SOURCE backends\platform\symbian\src\ScummApp.cpp
-SOURCE backends\platform\symbian\src\SymbianMain.cpp
SOURCE gui\Key.cpp
SOURCE gui\KeysDialog.cpp
diff --git a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
index 2e50c12cc3..83ce9bc599 100644
--- a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
+++ b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
@@ -36,6 +36,7 @@
TARGET ScummVM_A0000658.exe
TARGETPATH sys\bin
TARGETTYPE exe
+
OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
UID 0x100039ce 0xA0000658
@@ -112,14 +113,14 @@ SOURCEPATH ..\..\..\..\base
SOURCEPATH ..\..\..\..
// backend EPOC/SDL/ESDL specific includes
-SOURCE backends\platform\sdl\hardwarekeys.cpp
+SOURCE backends\platform\sdl\events.cpp
+SOURCE backends\platform\sdl\graphics.cpp
SOURCE backends\platform\sdl\hardwarekeys.cpp
SOURCE backends\platform\sdl\sdl.cpp
SOURCE backends\fs\symbian\symbian-fs-factory.cpp
SOURCE backends\platform\symbian\src\SymbianOS.cpp
SOURCE backends\platform\symbian\src\SymbianActions.cpp
SOURCE backends\platform\symbian\src\ScummApp.cpp
-SOURCE backends\platform\symbian\src\SymbianMain.cpp
SOURCE gui\Key.cpp
SOURCE gui\KeysDialog.cpp
diff --git a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
index b00c848667..3c8e41784a 100644
--- a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
+++ b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
@@ -113,14 +113,14 @@ SOURCEPATH ..\..\..\..\base
SOURCEPATH ..\..\..\..
// backend EPOC/SDL/ESDL specific includes
-SOURCE backends\platform\sdl\hardwarekeys.cpp
+SOURCE backends\platform\sdl\events.cpp
+SOURCE backends\platform\sdl\graphics.cpp
SOURCE backends\platform\sdl\hardwarekeys.cpp
SOURCE backends\platform\sdl\sdl.cpp
SOURCE backends\fs\symbian\symbian-fs-factory.cpp
SOURCE backends\platform\symbian\src\SymbianOS.cpp
SOURCE backends\platform\symbian\src\SymbianActions.cpp
SOURCE backends\platform\symbian\src\ScummApp.cpp
-SOURCE backends\platform\symbian\src\SymbianMain.cpp
SOURCE gui\Key.cpp
SOURCE gui\KeysDialog.cpp
diff --git a/backends/platform/symbian/mmp/scummvm_base.mmp.in b/backends/platform/symbian/mmp/scummvm_base.mmp.in
index e799975385..8f51e3c7b5 100644
--- a/backends/platform/symbian/mmp/scummvm_base.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_base.mmp.in
@@ -125,24 +125,12 @@ SOURCE engines\game.cpp
SOURCE engines\advanceddetector.cpp
SOURCE engines\savestate.cpp
// backend specific includes
-SOURCE backends\modular-backend.cpp
-SOURCE backends\audiocd\default\default-audiocd.cpp
-SOURCE backends\audiocd\sdl\sdl-audiocd.cpp
-SOURCE backends\events\sdl\sdl-events.cpp
-SOURCE backends\events\symbiansdl\symbiansdl-events.cpp
SOURCE backends\fs\abstract-fs.cpp
SOURCE backends\fs\symbian\symbianstream.cpp
-SOURCE backends\graphics\sdl\sdl-graphics.cpp
-SOURCE backends\graphics\symbiansdl\symbiansdl-graphics.cpp
SOURCE backends\keymapper\action.cpp
SOURCE backends\keymapper\keymap.cpp
SOURCE backends\keymapper\keymapper.cpp
SOURCE backends\keymapper\remap-dialog.cpp
-SOURCE backends\mixer\sdl\sdl-mixer.cpp
-SOURCE backends\mixer\symbiansdl\symbiansdl-mixer.cpp
-SOURCE backends\mutex\sdl\sdl-mutex.cpp
-SOURCE backends\timer\sdl\sdl-timer.cpp
-
// Source files for virtual keyboard
SOURCE backends\vkeybd\image-map.cpp
SOURCE backends\vkeybd\polygon.cpp
diff --git a/backends/platform/symbian/mmp/scummvm_toon.mmp.in b/backends/platform/symbian/mmp/scummvm_toon.mmp.in
new file mode 100644
index 0000000000..7b907fd92f
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_toon.mmp.in
@@ -0,0 +1,64 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2010 The ScummVM project
+ *
+ * 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$
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_toon.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\toon
+
+//START_AUTO_OBJECTS_TOON_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_TOON_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\sound ..\src
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/symbian/src/SymbianOS.cpp b/backends/platform/symbian/src/SymbianOS.cpp
index d86adbf354..50ab7e00b1 100644
--- a/backends/platform/symbian/src/SymbianOS.cpp
+++ b/backends/platform/symbian/src/SymbianOS.cpp
@@ -26,17 +26,26 @@
#include <sdlapp.h> // for CSDLApp::GetExecutablePathCStr() @ Symbian::GetExecutablePath()
#include <bautils.h>
+#include "backends/fs/symbian/symbian-fs-factory.h"
#include "backends/platform/symbian/src/SymbianOS.h"
#include "backends/platform/symbian/src/SymbianActions.h"
+#include "backends/saves/default/default-saves.h"
+
+#include "base/main.h"
+
#include "common/config-manager.h"
#include "common/scummsys.h"
+#include "common/translation.h"
+
#include "gui/message.h"
-#include "backends/fs/symbian/symbian-fs-factory.h"
-#include "backends/saves/default/default-saves.h"
-#include "backends/events/symbiansdl/symbiansdl-events.h"
-#include "backends/graphics/symbiansdl/symbiansdl-graphics.h"
-#include "backends/mixer/symbiansdl/symbiansdl-mixer.h"
+#include "sound/mixer_intern.h"
+
+#ifdef SAMPLES_PER_SEC_8000 // the GreanSymbianMMP format cannot handle values for defines :(
+ #define SAMPLES_PER_SEC 8000
+#else
+ #define SAMPLES_PER_SEC 16000
+#endif
#define DEFAULT_CONFIG_FILE "scummvm.ini"
#define DEFAULT_SAVE_PATH "Savegames"
@@ -49,7 +58,8 @@ void FatalError(const char *msg) {
TPtrC8 msgPtr((const TUint8 *)msg);
TBuf<512> msg16Bit;
msg16Bit.Copy(msgPtr);
-#ifndef S60
+#ifdef S60
+#else
CEikonEnv::Static()->InfoWinL(_L("ScummVM Fatal Error"), msg16Bit);
#endif
if (g_system)
@@ -57,7 +67,7 @@ void FatalError(const char *msg) {
}
// make this easily available everywhere
-char *GetExecutablePath() {
+char* GetExecutablePath() {
return CSDLApp::GetExecutablePathCStr();
}
@@ -65,13 +75,66 @@ char *GetExecutablePath() {
////////// OSystem_SDL_Symbian //////////////////////////////////////////
-OSystem_SDL_Symbian::OSystem_SDL_Symbian()
- :
- _RFs(0) {
-
+static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
+ {"1x", "Fullscreen", GFX_NORMAL},
+ {0, 0, 0}
+};
+
+bool OSystem_SDL_Symbian::hasFeature(Feature f) {
+ switch (f) {
+ case kFeatureFullscreenMode:
+ case kFeatureAspectRatioCorrection:
+ case kFeatureCursorHasPalette:
+#ifdef USE_VIBRA_SE_PXXX
+ case kFeatureVibration:
+#endif
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+void OSystem_SDL_Symbian::setFeatureState(Feature f, bool enable) {
+ switch (f) {
+ case kFeatureVirtualKeyboard:
+ if (enable) {
+ }
+ else {
+
+ }
+ break;
+ case kFeatureDisableKeyFiltering:
+ GUI::Actions::Instance()->beginMapping(enable);
+ break;
+ default:
+ OSystem_SDL::setFeatureState(f, enable);
+ }
}
-void OSystem_SDL_Symbian::init() {
+static Common::String getDefaultConfigFileName() {
+ char configFile[MAXPATHLEN];
+ strcpy(configFile, Symbian::GetExecutablePath());
+ strcat(configFile, DEFAULT_CONFIG_FILE);
+ return configFile;
+}
+
+Common::SeekableReadStream *OSystem_SDL_Symbian::createConfigReadStream() {
+ Common::FSNode file(getDefaultConfigFileName());
+ return file.createReadStream();
+}
+
+Common::WriteStream *OSystem_SDL_Symbian::createConfigWriteStream() {
+ Common::FSNode file(getDefaultConfigFileName());
+ return file.createWriteStream();
+}
+
+OSystem_SDL_Symbian::zoneDesc OSystem_SDL_Symbian::_zones[TOTAL_ZONES] = {
+ { 0, 0, 320, 145 },
+ { 0, 145, 150, 55 },
+ { 150, 145, 170, 55 }
+};
+OSystem_SDL_Symbian::OSystem_SDL_Symbian() :_channels(0),_stereo_mix_buffer(0) {
_RFs = &CEikonEnv::Static()->FsSession();
_fsFactory = new SymbianFilesystemFactory();
}
@@ -81,19 +144,20 @@ void OSystem_SDL_Symbian::initBackend() {
Common::String savePath;
savePath = Symbian::GetExecutablePath();
savePath += DEFAULT_SAVE_PATH "\\";
- _savefileManager = new DefaultSaveFileManager(savePath);
+ _savefile = new DefaultSaveFileManager(savePath);
// If savepath has not already been set then set it
if (!ConfMan.hasKey("savepath")) {
ConfMan.set("savepath", savePath);
+
}
// Ensure that the current set path (might have been altered by the user) exists
Common::String currentPath = ConfMan.get("savepath");
TFileName fname;
- TPtrC8 ptr((const unsigned char*)currentPath.c_str(), currentPath.size());
+ TPtrC8 ptr((const unsigned char*)currentPath.c_str(),currentPath.size());
fname.Copy(ptr);
- BaflUtils::EnsurePathExistsL(static_cast<OSystem_SDL_Symbian *>(g_system)->FsSession(), fname);
+ BaflUtils::EnsurePathExistsL(static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession(), fname);
ConfMan.setBool("FM_high_quality", false);
#if !defined(S60) || defined(S60V3) // S60 has low quality as default
@@ -101,26 +165,11 @@ void OSystem_SDL_Symbian::initBackend() {
#else
ConfMan.setBool("FM_medium_quality", false);
#endif
- // Symbian OS should have joystick_num set to 0 in the ini file,
- // but uiq devices might refuse opening the joystick
- ConfMan.setInt("joystick_num", 0);
+ ConfMan.setInt("joystick_num", 0); // Symbian OS should have joystick_num set to 0 in the ini file , but uiq devices might refuse opening the joystick
ConfMan.flushToDisk();
GUI::Actions::init();
- // Creates the backend managers
- if (_eventManager == 0)
- _eventManager = new SymbianSdlEventManager(this);
- if (_mixerManager == 0) {
- _mixerManager = new SymbianSdlMixerManager();
-
- // Setup and start mixer
- _mixerManager->init();
- }
- if (_graphicsManager == 0)
- _graphicsManager = new SymbianSdlGraphicsManager();
-
- // Call parent implementation of this method
OSystem_SDL::initBackend();
// Initialize global key mapping for Smartphones
@@ -128,6 +177,7 @@ void OSystem_SDL_Symbian::initBackend() {
actions->initInstanceMain(this);
actions->loadMapping();
+ initZones();
}
void OSystem_SDL_Symbian::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) {
@@ -137,23 +187,286 @@ void OSystem_SDL_Symbian::addSysArchivesToSearchSet(Common::SearchSet &s, int pr
}
}
+OSystem_SDL_Symbian::~OSystem_SDL_Symbian() {
+ delete[] _stereo_mix_buffer;
+}
+
+int OSystem_SDL_Symbian::getDefaultGraphicsMode() const {
+ return GFX_NORMAL;
+}
+
+const OSystem::GraphicsMode *OSystem_SDL_Symbian::getSupportedGraphicsModes() const {
+ return s_supportedGraphicsModes;
+}
+
+// make sure we always go to normal, even if the string might be set wrong!
+bool OSystem_SDL_Symbian::setGraphicsMode(const char * /*name*/) {
+ // let parent OSystem_SDL handle it
+ return OSystem_SDL::setGraphicsMode(getDefaultGraphicsMode());
+}
+
void OSystem_SDL_Symbian::quitWithErrorMsg(const char * /*aMsg*/) {
+
CEikonEnv::Static()->AlertWin(_L("quitWithErrorMsg()")) ;
if (g_system)
g_system->quit();
}
+// Overloaded from SDL_Commmon
void OSystem_SDL_Symbian::quit() {
delete GUI_Actions::Instance();
-
- // Call parent implementation of this method
OSystem_SDL::quit();
}
+void OSystem_SDL_Symbian::setupMixer() {
+
+ SDL_AudioSpec desired;
+ SDL_AudioSpec obtained;
+
+ // Determine the desired output sampling frequency.
+ uint32 samplesPerSec = 0;
+ if (ConfMan.hasKey("output_rate"))
+ samplesPerSec = ConfMan.getInt("output_rate");
+ if (samplesPerSec <= 0)
+ samplesPerSec = SAMPLES_PER_SEC;
+
+ // Determine the sample buffer size. We want it to store enough data for
+ // at least 1/16th of a second (though at most 8192 samples). Note
+ // that it must be a power of two. So e.g. at 22050 Hz, we request a
+ // sample buffer size of 2048.
+ uint32 samples = 8192;
+ while (samples * 16 > samplesPerSec * 2)
+ samples >>= 1;
+
+ memset(&desired, 0, sizeof(desired));
+ desired.freq = samplesPerSec;
+ desired.format = AUDIO_S16SYS;
+ desired.channels = 2;
+ desired.samples = (uint16)samples;
+ desired.callback = symbianMixCallback;
+ desired.userdata = this;
+
+ assert(!_mixer);
+ if (SDL_OpenAudio(&desired, &obtained) != 0) {
+ warning("Could not open audio device: %s", SDL_GetError());
+ _mixer = new Audio::MixerImpl(this, samplesPerSec);
+ assert(_mixer);
+ _mixer->setReady(false);
+ } else {
+ // Note: This should be the obtained output rate, but it seems that at
+ // least on some platforms SDL will lie and claim it did get the rate
+ // even if it didn't. Probably only happens for "weird" rates, though.
+ samplesPerSec = obtained.freq;
+ _channels = obtained.channels;
+
+ // Need to create mixbuffer for stereo mix to downmix
+ if (_channels != 2) {
+ _stereo_mix_buffer = new byte [obtained.size*2];//*2 for stereo values
+ }
+
+ // Create the mixer instance and start the sound processing
+ _mixer = new Audio::MixerImpl(this, samplesPerSec);
+ assert(_mixer);
+ _mixer->setReady(true);
+ SDL_PauseAudio(0);
+ }
+}
+
+/**
+ * The mixer callback function.
+ */
+void OSystem_SDL_Symbian::symbianMixCallback(void *sys, byte *samples, int len) {
+ OSystem_SDL_Symbian *this_ = (OSystem_SDL_Symbian *)sys;
+ assert(this_);
+
+ if (!this_->_mixer)
+ return;
+
+#if defined (S60) && !defined(S60V3)
+ // If not stereo then we need to downmix
+ if (this_->_mixer->_channels != 2) {
+ this_->_mixer->mixCallback(_stereo_mix_buffer, len * 2);
+
+ int16 *bitmixDst = (int16 *)samples;
+ int16 *bitmixSrc = (int16 *)_stereo_mix_buffer;
+
+ for (int loop = len / 2; loop >= 0; loop --) {
+ *bitmixDst = (*bitmixSrc + *(bitmixSrc + 1)) >> 1;
+ bitmixDst++;
+ bitmixSrc += 2;
+ }
+ } else
+#else
+ this_->_mixer->mixCallback(samples, len);
+#endif
+}
+
+
+/**
+ * This is an implementation by the remapKey function
+ * @param SDL_Event to remap
+ * @param ScumVM event to modify if special result is requested
+ * @return true if Common::Event has a valid return status
+ */
+bool OSystem_SDL_Symbian::remapKey(SDL_Event &ev, Common::Event &event) {
+ if (GUI::Actions::Instance()->mappingActive() || ev.key.keysym.sym <= SDLK_UNKNOWN)
+ return false;
+
+ for (TInt loop = 0; loop < GUI::ACTION_LAST; loop++) {
+ if (GUI::Actions::Instance()->getMapping(loop) == ev.key.keysym.sym &&
+ GUI::Actions::Instance()->isEnabled(loop)) {
+ // Create proper event instead
+ switch (loop) {
+ case GUI::ACTION_UP:
+ if (ev.type == SDL_KEYDOWN) {
+ _km.y_vel = -1;
+ _km.y_down_count = 1;
+ } else {
+ _km.y_vel = 0;
+ _km.y_down_count = 0;
+ }
+ event.type = Common::EVENT_MOUSEMOVE;
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+
+ case GUI::ACTION_DOWN:
+ if (ev.type == SDL_KEYDOWN) {
+ _km.y_vel = 1;
+ _km.y_down_count = 1;
+ } else {
+ _km.y_vel = 0;
+ _km.y_down_count = 0;
+ }
+ event.type = Common::EVENT_MOUSEMOVE;
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+
+ case GUI::ACTION_LEFT:
+ if (ev.type == SDL_KEYDOWN) {
+ _km.x_vel = -1;
+ _km.x_down_count = 1;
+ } else {
+ _km.x_vel = 0;
+ _km.x_down_count = 0;
+ }
+ event.type = Common::EVENT_MOUSEMOVE;
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+
+ case GUI::ACTION_RIGHT:
+ if (ev.type == SDL_KEYDOWN) {
+ _km.x_vel = 1;
+ _km.x_down_count = 1;
+ } else {
+ _km.x_vel = 0;
+ _km.x_down_count = 0;
+ }
+ event.type = Common::EVENT_MOUSEMOVE;
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+
+ case GUI::ACTION_LEFTCLICK:
+ event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_LBUTTONDOWN : Common::EVENT_LBUTTONUP);
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+
+ case GUI::ACTION_RIGHTCLICK:
+ event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_RBUTTONDOWN : Common::EVENT_RBUTTONUP);
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+
+ case GUI::ACTION_ZONE:
+ if (ev.type == SDL_KEYDOWN) {
+ int i;
+
+ for (i=0; i < TOTAL_ZONES; i++)
+ if (_km.x >= _zones[i].x && _km.y >= _zones[i].y &&
+ _km.x <= _zones[i].x + _zones[i].width && _km.y <= _zones[i].y + _zones[i].height
+ ) {
+ _mouseXZone[i] = _km.x;
+ _mouseYZone[i] = _km.y;
+ break;
+ }
+ _currentZone++;
+ if (_currentZone >= TOTAL_ZONES)
+ _currentZone = 0;
+ event.type = Common::EVENT_MOUSEMOVE;
+ fillMouseEvent(event, _mouseXZone[_currentZone], _mouseYZone[_currentZone]);
+ SDL_WarpMouse(event.mouse.x, event.mouse.y);
+ }
+
+ return true;
+ case GUI::ACTION_MULTI: {
+ GUI::Key &key = GUI::Actions::Instance()->getKeyAction(loop);
+ // if key code is pause, then change event to interactive or just fall through
+ if (key.keycode() == SDLK_PAUSE) {
+ event.type = Common::EVENT_PREDICTIVE_DIALOG;
+ return true;
+ }
+ }
+ case GUI::ACTION_SAVE:
+ case GUI::ACTION_SKIP:
+ case GUI::ACTION_SKIP_TEXT:
+ case GUI::ACTION_PAUSE:
+ case GUI::ACTION_SWAPCHAR:
+ case GUI::ACTION_FASTMODE:
+ case GUI::ACTION_DEBUGGER:
+ case GUI::ACTION_MAINMENU:
+ case GUI::ACTION_VKB:
+ case GUI::ACTION_KEYMAPPER:{
+ GUI::Key &key = GUI::Actions::Instance()->getKeyAction(loop);
+ ev.key.keysym.sym = (SDLKey) key.keycode();
+ ev.key.keysym.scancode = 0;
+ ev.key.keysym.mod = (SDLMod) key.flags();
+
+ // Translate from SDL keymod event to Scummvm Key Mod Common::Event.
+ // This codes is also present in GP32 backend and in SDL backend as a static function
+ // Perhaps it should be shared.
+ if (key.flags() != 0) {
+ event.kbd.flags = 0;
+
+ if (ev.key.keysym.mod & KMOD_SHIFT)
+ event.kbd.flags |= Common::KBD_SHIFT;
+
+ if (ev.key.keysym.mod & KMOD_ALT)
+ event.kbd.flags |= Common::KBD_ALT;
+
+ if (ev.key.keysym.mod & KMOD_CTRL)
+ event.kbd.flags |= Common::KBD_CTRL;
+ }
+
+ return false;
+ }
+
+ case GUI::ACTION_QUIT:
+ {
+ GUI::MessageDialog alert(_("Do you want to quit ?"), _("Yes"), _("No"));
+ if (alert.runModal() == GUI::kMessageOK)
+ quit();
+
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+void OSystem_SDL_Symbian::setWindowCaption(const char *caption) {
+ OSystem_SDL::setWindowCaption(caption);
+}
+
void OSystem_SDL_Symbian::engineInit() {
// Check mappings for the engine just started
- checkMappings();
+ check_mappings();
}
void OSystem_SDL_Symbian::engineDone() {
@@ -161,26 +474,22 @@ void OSystem_SDL_Symbian::engineDone() {
GUI::Actions::Instance()->initInstanceMain(this);
}
-void OSystem_SDL_Symbian::checkMappings() {
+void OSystem_SDL_Symbian::check_mappings() {
if (ConfMan.get("gameid").empty() || GUI::Actions::Instance()->initialized())
return;
GUI::Actions::Instance()->initInstanceGame();
}
-bool OSystem_SDL_Symbian::setGraphicsMode(const char * /*name*/) {
- return _graphicsManager->setGraphicsMode(0);
-}
+void OSystem_SDL_Symbian::initZones() {
+ int i;
-Common::String OSystem_SDL_Symbian::getDefaultConfigFileName() {
- char configFile[MAXPATHLEN];
- strcpy(configFile, Symbian::GetExecutablePath());
- strcat(configFile, DEFAULT_CONFIG_FILE);
- return configFile;
-}
+ _currentZone = 0;
-void OSystem_SDL_Symbian::setupIcon() {
- // Don't for Symbian: it uses the EScummVM.aif file for the icon.
+ for (i = 0; i < TOTAL_ZONES; i++) {
+ _mouseXZone[i] = (_zones[i].x + (_zones[i].width / 2));
+ _mouseYZone[i] = (_zones[i].y + (_zones[i].height / 2));
+ }
}
RFs& OSystem_SDL_Symbian::FsSession() {
@@ -206,3 +515,67 @@ void* scumm_bsearch(const void *key, const void *base, size_t nmemb, size_t size
return NULL;
}
+
+extern "C"
+{
+// Include the snprintf and vsnprintf implementations as 'C' code
+#include "vsnprintf.h"
+}
+
+// Symbian SDL_Main implementation
+// Redirects standard io, creates Symbian specific SDL backend (inherited from main SDL)
+int main(int argc, char *argv[]) {
+ //
+ // Set up redirects for stdout/stderr under Symbian.
+ // Code copied from SDL_main.
+ //
+
+ // Symbian does not like any output to the console through any *print* function
+ char STDOUT_FILE[256], STDERR_FILE[256]; // shhh, don't tell anybody :)
+ strcpy(STDOUT_FILE, Symbian::GetExecutablePath());
+ strcpy(STDERR_FILE, Symbian::GetExecutablePath());
+ strcat(STDOUT_FILE, "scummvm.stdout.txt");
+ strcat(STDERR_FILE, "scummvm.stderr.txt");
+
+ /* Flush the output in case anything is queued */
+ fclose(stdout);
+ fclose(stderr);
+
+ /* Redirect standard input and standard output */
+ FILE *newfp = freopen(STDOUT_FILE, "w", stdout);
+ if (newfp == NULL) { /* This happens on NT */
+#if !defined(stdout)
+ stdout = fopen(STDOUT_FILE, "w");
+#else
+ newfp = fopen(STDOUT_FILE, "w");
+ if (newfp) {
+ *stdout = *newfp;
+ }
+#endif
+ }
+ newfp = freopen(STDERR_FILE, "w", stderr);
+ if (newfp == NULL) { /* This happens on NT */
+#if !defined(stderr)
+ stderr = fopen(STDERR_FILE, "w");
+#else
+ newfp = fopen(STDERR_FILE, "w");
+ if (newfp) {
+ *stderr = *newfp;
+ }
+#endif
+ }
+ setbuf(stderr, NULL); /* No buffering */
+
+ // Create our OSystem instance
+ g_system = new OSystem_SDL_Symbian();
+ assert(g_system);
+
+#ifdef DYNAMIC_MODULES
+ PluginManager::instance().addPluginProvider(new SDLPluginProvider());
+#endif
+
+ // Invoke the actual ScummVM main entry point:
+ int res = scummvm_main(argc, argv);
+ g_system->quit(); // TODO: Consider removing / replacing this!
+ return res;
+}
diff --git a/backends/platform/symbian/src/SymbianOS.h b/backends/platform/symbian/src/SymbianOS.h
index 0142054492..85b5e131da 100644
--- a/backends/platform/symbian/src/SymbianOS.h
+++ b/backends/platform/symbian/src/SymbianOS.h
@@ -22,52 +22,73 @@
* $Id$
*/
-#ifndef PLATFORM_SDL_SYMBIAN_H
-#define PLATFORM_SDL_SYMBIAN_H
+#ifndef SDLSYMBIAN_H
+#define SDLSYMBIAN_H
#include "backends/platform/sdl/sdl.h"
+#define TOTAL_ZONES 3
class RFs;
class OSystem_SDL_Symbian : public OSystem_SDL {
public:
OSystem_SDL_Symbian();
+ virtual ~OSystem_SDL_Symbian();
- // Override from OSystem_SDL
- virtual void init();
- virtual void initBackend();
- virtual void quit();
- virtual void engineInit();
- virtual void engineDone();
- virtual bool setGraphicsMode(const char *name);
- virtual Common::String getDefaultConfigFileName();
- virtual void setupIcon();
-
+public:
/**
- * Returns reference to File session
+ * The following method is called once, from main.cpp, after all
+ * config data (including command line params etc.) are fully loaded.
*/
- RFs& FsSession();
+ virtual void initBackend();
+ int getDefaultGraphicsMode() const;
+ const OSystem::GraphicsMode *getSupportedGraphicsModes() const;
+ bool setGraphicsMode(const char *name);
void quitWithErrorMsg(const char *msg);
+ virtual bool hasFeature(Feature f);
+ void setFeatureState(Feature f, bool enable);
+
+ // Set function that generates samples
+ //
+ // This function is overridden by the symbian port in order to provide MONO audio
+ // downmix is done by supplying our own audiocallback
+ //
+ virtual void setupMixer(); // overloaded by CE backend
+
+ // Overloaded from SDL_Commmon
+ void quit();
+
+ // Returns reference to File session
+ RFs& FsSession();
void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);
+protected:
+ //
+ // The mixer callback function.
+ //
+ static void symbianMixCallback(void *s, byte *samples, int len);
+
- // Vibration support
+ virtual Common::SeekableReadStream *createConfigReadStream();
+ virtual Common::WriteStream *createConfigWriteStream();
+public:
+ // vibration support
#ifdef USE_VIBRA_SE_PXXX
- /**
- * Intialize the vibration api used if present and supported
- */
+ //
+ // Intialize the vibration api used if present and supported
+ //
void initializeVibration();
- /**
- * Turn vibration on, repeat no time
- * @param vibraLength number of repetitions
- */
+ //
+ // Turn vibration on, repeat no time
+ // @param vibraLength number of repetitions
+ //
void vibrationOn(int vibraLength);
- /**
- * Turns the vibration off
- */
+ //
+ // Turns the vibration off
+ //
void vibrationOff();
protected:
@@ -75,11 +96,54 @@ protected:
#endif // USE_VIBRA_SE_PXXX
protected:
+
+ //
+ // This is an implementation by the remapKey function
+ // @param SDL_Event to remap
+ // @param ScumVM event to modify if special result is requested
+ // @return true if Common::Event has a valid return status
+ //
+ bool remapKey(SDL_Event &ev, Common::Event &event);
+
+ void setWindowCaption(const char *caption);
+
/**
- * Used to intialized special game mappings
+ * Allows the backend to perform engine specific init.
+ * Called just before the engine is run.
*/
- void checkMappings();
+ virtual void engineInit();
+
+ /**
+ * Allows the backend to perform engine specific de-init.
+ * Called after the engine finishes.
+ */
+ virtual void engineDone();
+
+ //
+ // Used to intialized special game mappings
+ //
+ void check_mappings();
+
+ void initZones();
+
+ // Audio
+ int _channels;
+
+ byte *_stereo_mix_buffer;
+
+ // Used to handle joystick navi zones
+ int _mouseXZone[TOTAL_ZONES];
+ int _mouseYZone[TOTAL_ZONES];
+ int _currentZone;
+
+ struct zoneDesc {
+ int x;
+ int y;
+ int width;
+ int height;
+ };
+ static zoneDesc _zones[TOTAL_ZONES];
RFs* _RFs;
};
diff --git a/backends/platform/symbian/src/Symbianmain.cpp b/backends/platform/symbian/src/Symbianmain.cpp
deleted file mode 100644
index 4aaa05926f..0000000000
--- a/backends/platform/symbian/src/Symbianmain.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/* 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 "base/main.h"
-#include "backends/platform/symbian/src/SymbianOS.h"
-#include "backends/platform/symbian/src/portdefs.h"
-
-extern "C"
-{
-// Include the snprintf and vsnprintf implementations as 'C' code
-#include "vsnprintf.h"
-}
-
-// Symbian SDL_Main implementation
-// Redirects standard io, creates Symbian specific SDL backend (inherited from main SDL)
-int main(int argc, char *argv[]) {
- //
- // Set up redirects for stdout/stderr under Symbian.
- // Code copied from SDL_main.
- //
-
- // Symbian does not like any output to the console through any *print* function
- char STDOUT_FILE[256], STDERR_FILE[256]; // shhh, don't tell anybody :)
- strcpy(STDOUT_FILE, Symbian::GetExecutablePath());
- strcpy(STDERR_FILE, Symbian::GetExecutablePath());
- strcat(STDOUT_FILE, "scummvm.stdout.txt");
- strcat(STDERR_FILE, "scummvm.stderr.txt");
-
- /* Flush the output in case anything is queued */
- fclose(stdout);
- fclose(stderr);
-
- /* Redirect standard input and standard output */
- FILE *newfp = freopen(STDOUT_FILE, "w", stdout);
- if (newfp == NULL) { /* This happens on NT */
-#if !defined(stdout)
- stdout = fopen(STDOUT_FILE, "w");
-#else
- newfp = fopen(STDOUT_FILE, "w");
- if (newfp) {
- *stdout = *newfp;
- }
-#endif
- }
- newfp = freopen(STDERR_FILE, "w", stderr);
- if (newfp == NULL) { /* This happens on NT */
-#if !defined(stderr)
- stderr = fopen(STDERR_FILE, "w");
-#else
- newfp = fopen(STDERR_FILE, "w");
- if (newfp) {
- *stderr = *newfp;
- }
-#endif
- }
- setbuf(stderr, NULL); /* No buffering */
-
- // Create our OSystem instance
- g_system = new OSystem_SDL_Symbian();
- assert(g_system);
-
- // Pre initialize the backend
- ((OSystem_SDL_Symbian *)g_system)->init();
-
-#ifdef DYNAMIC_MODULES
- PluginManager::instance().addPluginProvider(new SDLPluginProvider());
-#endif
-
- // Invoke the actual ScummVM main entry point:
- int res = scummvm_main(argc, argv);
-
- // Free OSystem
- delete (OSystem_SDL_Symbian *)g_system;
-
- return res;
-}
-
diff --git a/backends/platform/symbian/src/portdefs.h b/backends/platform/symbian/src/portdefs.h
index 2a26771a0a..6868faaa89 100644
--- a/backends/platform/symbian/src/portdefs.h
+++ b/backends/platform/symbian/src/portdefs.h
@@ -45,6 +45,13 @@
// and we _really_ don't wanna link with any other windows LIBC library!
#if defined(__GCC32__)
+ FIXME: If the following macros are ever used, then this will lead
+ to serious errors, e.g. an almost guaranteed buffer overflow
+ in Common::String::format(). Do *NOT* re-#define vsnprintf to
+ vsprintf, it will lead to disaster!
+ This shouldn't be necessary anyway, since we have
+ backends/platform/symbian/src/vsnprintf.h
+
#define snprintf(buf,len,args...) sprintf(buf,args)
#define vsnprintf(buf,len,format,valist) vsprintf(buf,format,valist)