Modularized GP2X backend. Renamed GP2XWIZSdlEventManager to GP2XSdlEventManager, and added GP2X code.
svn-id: r50542
This commit is contained in:
parent
1bc87e3bee
commit
a35db656d3
15 changed files with 406 additions and 3170 deletions
|
@ -23,11 +23,17 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef GP2XWIZ
|
||||
#if defined(GP2X) || defined(GP2XWIZ)
|
||||
|
||||
#include "backends/events/gp2xwizsdl/gp2xwizsdl-events.h"
|
||||
#include "backends/events/gp2xsdl/gp2xsdl-events.h"
|
||||
#if defined(GP2X)
|
||||
#include "backends/platform/gp2x/gp2x-hw.h"
|
||||
#include "backends/graphics/gp2xsdl/gp2xsdl-graphics.h"
|
||||
#else
|
||||
#include "backends/platform/gp2xwiz/gp2xwiz-hw.h"
|
||||
#include "backends/platform/gp2xwiz/gp2xwiz-sdl.h"
|
||||
#endif
|
||||
|
||||
#include "backends/platform/sdl/sdl.h"
|
||||
|
||||
// FIXME move joystick defines out and replace with confile file options
|
||||
// we should really allow users to map any key to a joystick button using the keymapper.
|
||||
|
@ -36,7 +42,7 @@
|
|||
#define JOY_XAXIS 0
|
||||
#define JOY_YAXIS 1
|
||||
|
||||
/* GP2X Wiz: Main Joystick Mappings */
|
||||
/* GP2X: Main Joystick Mappings */
|
||||
enum {
|
||||
GP2X_BUTTON_UP = 0,
|
||||
GP2X_BUTTON_UPLEFT = 1,
|
||||
|
@ -55,17 +61,18 @@ enum {
|
|||
GP2X_BUTTON_X = 14,
|
||||
GP2X_BUTTON_Y = 15,
|
||||
GP2X_BUTTON_VOLUP = 16,
|
||||
GP2X_BUTTON_VOLDOWN = 17
|
||||
GP2X_BUTTON_VOLDOWN = 17,
|
||||
GP2X_BUTTON_CLICK = 18
|
||||
};
|
||||
|
||||
GP2XWIZSdlEventManager::GP2XWIZSdlEventManager(Common::EventSource *boss)
|
||||
GP2XSdlEventManager::GP2XSdlEventManager(Common::EventSource *boss)
|
||||
:
|
||||
_buttonStateL(false),
|
||||
SdlEventManager(boss) {
|
||||
|
||||
}
|
||||
|
||||
void GP2XWIZSdlEventManager::SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) {
|
||||
void GP2XSdlEventManager::SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) {
|
||||
event.kbd.flags = 0;
|
||||
|
||||
if (mod & KMOD_SHIFT)
|
||||
|
@ -76,7 +83,7 @@ void GP2XWIZSdlEventManager::SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &
|
|||
event.kbd.flags |= Common::KBD_CTRL;
|
||||
}
|
||||
|
||||
void GP2XWIZSdlEventManager::moveStick() {
|
||||
void GP2XSdlEventManager::moveStick() {
|
||||
bool stickBtn[32];
|
||||
|
||||
memcpy(stickBtn, _stickBtn, sizeof(stickBtn));
|
||||
|
@ -119,7 +126,7 @@ void GP2XWIZSdlEventManager::moveStick() {
|
|||
}
|
||||
}
|
||||
|
||||
/* GP2X Wiz Input mappings.
|
||||
/* GP2X Input mappings.
|
||||
Single Button
|
||||
|
||||
Movement:
|
||||
|
@ -136,6 +143,7 @@ GP2X_BUTTON_DOWNRIGHT Cursor Down Right
|
|||
|
||||
Button Emulation:
|
||||
|
||||
GP2X_BUTTON_CLICK Left Mouse Click (GP2X only)
|
||||
GP2X_BUTTON_A . (Period)
|
||||
GP2X_BUTTON_B Left Mouse Click
|
||||
GP2X_BUTTON_Y Space Bar
|
||||
|
@ -153,9 +161,10 @@ GP2X_BUTTON_VOLUP & GP2X_BUTTON_VOLDOWN 0 (For Monkey 2 CP) or Virtual Keyboard
|
|||
GP2X_BUTTON_L & GP2X_BUTTON_SELECT Common::EVENT_QUIT (Calls Sync() to make sure SD is flushed)
|
||||
GP2X_BUTTON_L & GP2X_BUTTON_MENU Common::EVENT_MAINMENU (ScummVM Global Main Menu)
|
||||
GP2X_BUTTON_L & GP2X_BUTTON_A Common::EVENT_PREDICTIVE_DIALOG for predictive text entry box (AGI games)
|
||||
GP2X_BUTTON_L & GP2X_BUTTON_Y Toggles setZoomOnMouse() for larger then 320*240 games to scale to the point + raduis. (GP2X only)
|
||||
*/
|
||||
|
||||
bool GP2XWIZSdlEventManager::handleKeyDown(SDL_Event &ev, Common::Event &event) {
|
||||
bool GP2XSdlEventManager::handleKeyDown(SDL_Event &ev, Common::Event &event) {
|
||||
SDLModToOSystemKeyFlags(SDL_GetModState(), event);
|
||||
|
||||
if (remapKey(ev, event))
|
||||
|
@ -168,7 +177,7 @@ bool GP2XWIZSdlEventManager::handleKeyDown(SDL_Event &ev, Common::Event &event)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool GP2XWIZSdlEventManager::handleKeyUp(SDL_Event &ev, Common::Event &event) {
|
||||
bool GP2XSdlEventManager::handleKeyUp(SDL_Event &ev, Common::Event &event) {
|
||||
if (remapKey(ev, event))
|
||||
return true;
|
||||
|
||||
|
@ -186,11 +195,16 @@ bool GP2XWIZSdlEventManager::handleKeyUp(SDL_Event &ev, Common::Event &event) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool GP2XWIZSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
|
||||
bool GP2XSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
|
||||
_stickBtn[ev.jbutton.button] = 1;
|
||||
if (ev.jbutton.button == GP2X_BUTTON_B) {
|
||||
event.type = Common::EVENT_LBUTTONDOWN;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
#ifdef GP2X
|
||||
} else if (ev.jbutton.button == GP2X_BUTTON_CLICK) {
|
||||
event.type = Common::EVENT_LBUTTONDOWN;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
#endif
|
||||
} else if (ev.jbutton.button == GP2X_BUTTON_X) {
|
||||
event.type = Common::EVENT_RBUTTONDOWN;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
|
@ -208,7 +222,7 @@ bool GP2XWIZSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &e
|
|||
_buttonStateL = true;
|
||||
break;
|
||||
case GP2X_BUTTON_R:
|
||||
if (_buttonStateL == true) {
|
||||
if (_buttonStateL) {
|
||||
#ifdef ENABLE_VKEYBD
|
||||
event.kbd.keycode = Common::KEYCODE_F7;
|
||||
event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0);
|
||||
|
@ -222,7 +236,7 @@ bool GP2XWIZSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &e
|
|||
}
|
||||
break;
|
||||
case GP2X_BUTTON_SELECT:
|
||||
if (_buttonStateL == true) {
|
||||
if (_buttonStateL) {
|
||||
event.type = Common::EVENT_QUIT;
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_ESCAPE;
|
||||
|
@ -230,7 +244,7 @@ bool GP2XWIZSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &e
|
|||
}
|
||||
break;
|
||||
case GP2X_BUTTON_A:
|
||||
if (_buttonStateL == true) {
|
||||
if (_buttonStateL) {
|
||||
event.type = Common::EVENT_PREDICTIVE_DIALOG;
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_PERIOD;
|
||||
|
@ -238,11 +252,19 @@ bool GP2XWIZSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &e
|
|||
}
|
||||
break;
|
||||
case GP2X_BUTTON_Y:
|
||||
#ifdef GP2X
|
||||
if (_buttonStateL) {
|
||||
((GP2XSdlGraphicsManager *)((OSystem_SDL *)g_system)->getGraphicsManager())->toggleZoomOnMouse();
|
||||
} else {
|
||||
#endif
|
||||
event.kbd.keycode = Common::KEYCODE_SPACE;
|
||||
event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
|
||||
#ifdef GP2X
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case GP2X_BUTTON_MENU:
|
||||
if (_buttonStateL == true) {
|
||||
if (_buttonStateL) {
|
||||
event.type = Common::EVENT_MAINMENU;
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_F5;
|
||||
|
@ -250,8 +272,13 @@ bool GP2XWIZSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &e
|
|||
}
|
||||
break;
|
||||
case GP2X_BUTTON_VOLUP:
|
||||
#ifdef GP2X
|
||||
GP2X_HW::mixerMoveVolume(2);
|
||||
if (GP2X_HW::volumeLevel == 100) {
|
||||
#else
|
||||
WIZ_HW::mixerMoveVolume(2);
|
||||
if (WIZ_HW::volumeLevel == 100) {
|
||||
#endif
|
||||
g_system->displayMessageOnOSD("Maximum Volume");
|
||||
} else {
|
||||
g_system->displayMessageOnOSD("Increasing Volume");
|
||||
|
@ -259,8 +286,13 @@ bool GP2XWIZSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &e
|
|||
break;
|
||||
|
||||
case GP2X_BUTTON_VOLDOWN:
|
||||
#ifdef GP2X
|
||||
GP2X_HW::mixerMoveVolume(1);
|
||||
if (GP2X_HW::volumeLevel == 0) {
|
||||
#else
|
||||
WIZ_HW::mixerMoveVolume(1);
|
||||
if (WIZ_HW::volumeLevel == 0) {
|
||||
#endif
|
||||
g_system->displayMessageOnOSD("Minimal Volume");
|
||||
} else {
|
||||
g_system->displayMessageOnOSD("Decreasing Volume");
|
||||
|
@ -271,11 +303,16 @@ bool GP2XWIZSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &e
|
|||
return true;
|
||||
}
|
||||
|
||||
bool GP2XWIZSdlEventManager::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
|
||||
bool GP2XSdlEventManager::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
|
||||
_stickBtn[ev.jbutton.button] = 0;
|
||||
if (ev.jbutton.button == GP2X_BUTTON_B) {
|
||||
event.type = Common::EVENT_LBUTTONUP;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
#ifdef GP2X
|
||||
} else if (ev.jbutton.button == GP2X_BUTTON_CLICK) {
|
||||
event.type = Common::EVENT_LBUTTONUP;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
#endif
|
||||
} else if (ev.jbutton.button == GP2X_BUTTON_X) {
|
||||
event.type = Common::EVENT_RBUTTONUP;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
|
@ -23,14 +23,14 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#if !defined(BACKEND_EVENTS_SDL_GP2XWIZ_H) && !defined(DISABLE_DEFAULT_EVENTMANAGER)
|
||||
#define BACKEND_EVENTS_SDL_GP2XWIZ_H
|
||||
#if !defined(BACKEND_EVENTS_SDL_GP2X_H) && !defined(DISABLE_DEFAULT_EVENTMANAGER)
|
||||
#define BACKEND_EVENTS_SDL_GP2X_H
|
||||
|
||||
#include "backends/events/sdl/sdl-events.h"
|
||||
|
||||
class GP2XWIZSdlEventManager : public SdlEventManager {
|
||||
class GP2XSdlEventManager : public SdlEventManager {
|
||||
public:
|
||||
GP2XWIZSdlEventManager(Common::EventSource *boss);
|
||||
GP2XSdlEventManager(Common::EventSource *boss);
|
||||
|
||||
protected:
|
||||
bool _stickBtn[32];
|
183
backends/graphics/gp2xsdl/gp2xsdl-graphics.cpp
Normal file
183
backends/graphics/gp2xsdl/gp2xsdl-graphics.cpp
Normal file
|
@ -0,0 +1,183 @@
|
|||
/* 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$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef GP2X
|
||||
|
||||
#include "backends/graphics/gp2xsdl/gp2xsdl-graphics.h"
|
||||
#include "graphics/scaler/aspect.h"
|
||||
#include <SDL_gp2x.h>
|
||||
|
||||
static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
|
||||
{"Fullscreen", "1x", GFX_NORMAL},
|
||||
{0, 0, 0}
|
||||
};
|
||||
|
||||
GP2XSdlGraphicsManager::GP2XSdlGraphicsManager()
|
||||
:
|
||||
_adjustZoomOnMouse(false) {
|
||||
|
||||
}
|
||||
|
||||
const OSystem::GraphicsMode *GP2XSdlGraphicsManager::getSupportedGraphicsModes() const {
|
||||
return s_supportedGraphicsModes;
|
||||
}
|
||||
|
||||
int GP2XSdlGraphicsManager::getDefaultGraphicsMode() const {
|
||||
return GFX_NORMAL;
|
||||
}
|
||||
|
||||
|
||||
bool GP2XSdlGraphicsManager::hasFeature(OSystem::Feature f) {
|
||||
if (f == OSystem::kFeatureIconifyWindow)
|
||||
return false;
|
||||
|
||||
return SdlGraphicsManager::hasFeature(f);
|
||||
}
|
||||
|
||||
void GP2XSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
|
||||
if (f != OSystem::kFeatureIconifyWindow)
|
||||
SdlGraphicsManager::setFeatureState(f, enable);
|
||||
}
|
||||
|
||||
void GP2XSdlGraphicsManager::drawMouse() {
|
||||
if (!_mouseVisible || !_mouseSurface) {
|
||||
_mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_Rect zoomdst;
|
||||
SDL_Rect dst;
|
||||
int scale;
|
||||
int hotX, hotY;
|
||||
int tmpScreenWidth, tmpScreenHeight;
|
||||
|
||||
// Temp vars to ensure we zoom to the LCD resolution or greater.
|
||||
tmpScreenWidth = _videoMode.screenWidth;
|
||||
tmpScreenHeight = _videoMode.screenHeight;
|
||||
|
||||
if (_videoMode.screenHeight <= 240) {
|
||||
tmpScreenHeight = 240;
|
||||
}
|
||||
|
||||
if (_videoMode.screenWidth <= 320) {
|
||||
tmpScreenWidth = 320;
|
||||
}
|
||||
|
||||
dst.x = _mouseCurState.x;
|
||||
dst.y = _mouseCurState.y;
|
||||
|
||||
if (!_overlayVisible) {
|
||||
scale = _videoMode.scaleFactor;
|
||||
dst.w = _mouseCurState.vW;
|
||||
dst.h = _mouseCurState.vH;
|
||||
hotX = _mouseCurState.vHotX;
|
||||
hotY = _mouseCurState.vHotY;
|
||||
} else {
|
||||
scale = 1;
|
||||
dst.w = _mouseCurState.rW;
|
||||
dst.h = _mouseCurState.rH;
|
||||
hotX = _mouseCurState.rHotX;
|
||||
hotY = _mouseCurState.rHotY;
|
||||
}
|
||||
|
||||
// The mouse is undrawn using virtual coordinates, i.e. they may be
|
||||
// scaled and aspect-ratio corrected.
|
||||
|
||||
_mouseBackup.x = dst.x - hotX;
|
||||
_mouseBackup.y = dst.y - hotY;
|
||||
_mouseBackup.w = dst.w;
|
||||
_mouseBackup.h = dst.h;
|
||||
|
||||
// We draw the pre-scaled cursor image, so now we need to adjust for
|
||||
// scaling, shake position and aspect ratio correction manually.
|
||||
|
||||
if (!_overlayVisible) {
|
||||
dst.y += _currentShakePos;
|
||||
}
|
||||
|
||||
if (_videoMode.aspectRatioCorrection && !_overlayVisible)
|
||||
dst.y = real2Aspect(dst.y);
|
||||
|
||||
dst.x = scale * dst.x - _mouseCurState.rHotX;
|
||||
dst.y = scale * dst.y - _mouseCurState.rHotY;
|
||||
dst.w = _mouseCurState.rW;
|
||||
dst.h = _mouseCurState.rH;
|
||||
|
||||
// Hacking about with the zoom around mouse pointer stuff.
|
||||
if (_adjustZoomOnMouse){
|
||||
|
||||
zoomdst.w = (tmpScreenWidth / 2);
|
||||
zoomdst.h = (tmpScreenHeight / 2);
|
||||
|
||||
// Create a zoomed rect centered on the mouse pointer.
|
||||
// Will pan 1/4 of the screen.
|
||||
|
||||
if (dst.x > ((tmpScreenWidth / 4) * 3)) {
|
||||
zoomdst.x = (tmpScreenWidth / 2);
|
||||
} else {
|
||||
zoomdst.x = (dst.x - (tmpScreenWidth / 4));
|
||||
if (zoomdst.x < 0) {
|
||||
zoomdst.x = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (dst.y > ((tmpScreenHeight / 4) * 3)) {
|
||||
zoomdst.y = (tmpScreenHeight / 2);
|
||||
} else {
|
||||
zoomdst.y = (dst.y - (tmpScreenHeight / 4));
|
||||
if (zoomdst.y < 0) {
|
||||
zoomdst.y = 0;
|
||||
}
|
||||
}
|
||||
SDL_GP2X_Display(&zoomdst);
|
||||
} else {
|
||||
|
||||
// Make sure we are looking at the whole screen otherwise.
|
||||
|
||||
zoomdst.x = 0;
|
||||
zoomdst.y = 0;
|
||||
zoomdst.w = (tmpScreenWidth);
|
||||
zoomdst.h = (tmpScreenHeight);
|
||||
|
||||
SDL_GP2X_Display(&zoomdst);
|
||||
};
|
||||
|
||||
// Note that SDL_BlitSurface() and addDirtyRect() will both perform any
|
||||
// clipping necessary
|
||||
|
||||
if (SDL_BlitSurface(_mouseSurface, NULL, _hwscreen, &dst) != 0)
|
||||
error("SDL_BlitSurface failed: %s", SDL_GetError());
|
||||
|
||||
// The screen will be updated using real surface coordinates, i.e.
|
||||
// they will not be scaled or aspect-ratio corrected.
|
||||
|
||||
addDirtyRect(dst.x, dst.y, dst.w, dst.h, true);
|
||||
}
|
||||
|
||||
void GP2XSdlGraphicsManager::toggleZoomOnMouse() {
|
||||
_adjustZoomOnMouse = !_adjustZoomOnMouse;
|
||||
}
|
||||
|
||||
#endif
|
50
backends/graphics/gp2xsdl/gp2xsdl-graphics.h
Normal file
50
backends/graphics/gp2xsdl/gp2xsdl-graphics.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/* 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 BACKENDS_GRAPHICS_SDL_GP2X_H
|
||||
#define BACKENDS_GRAPHICS_SDL_GP2X_H
|
||||
|
||||
#include "backends/graphics/sdl/sdl-graphics.h"
|
||||
|
||||
class GP2XSdlGraphicsManager : public SdlGraphicsManager {
|
||||
public:
|
||||
GP2XSdlGraphicsManager();
|
||||
virtual ~GP2XSdlGraphicsManager() {}
|
||||
|
||||
virtual const OSystem::GraphicsMode *getSupportedGraphicsModes() const;
|
||||
virtual int getDefaultGraphicsMode() const;
|
||||
virtual void drawMouse();
|
||||
|
||||
virtual bool hasFeature(OSystem::Feature f);
|
||||
virtual void setFeatureState(OSystem::Feature f, bool enable);
|
||||
|
||||
// Toggles zoom adjust on mouse
|
||||
void toggleZoomOnMouse();
|
||||
|
||||
protected:
|
||||
bool _adjustZoomOnMouse;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -23,10 +23,10 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifndef GP2XWIZ
|
||||
#ifdef GP2XWIZ
|
||||
|
||||
#include "backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.h"
|
||||
#include "backends/events/gp2xwizsdl/gp2xwizsdl-events.h"
|
||||
#include "backends/events/gp2xsdl/gp2xsdl-events.h"
|
||||
|
||||
#include "common/mutex.h"
|
||||
#include "graphics/scaler/aspect.h"
|
||||
|
@ -121,7 +121,7 @@ void GP2XWIZSdlGraphicsManager::initSize(uint w, uint h) {
|
|||
if (w > 320 || h > 240){
|
||||
setGraphicsMode(GFX_HALF);
|
||||
setGraphicsModeIntern();
|
||||
((GP2XWIZSdlEventManager *)g_system->getEventManager())->toggleMouseGrab();
|
||||
((GP2XSdlEventManager *)g_system->getEventManager())->toggleMouseGrab();
|
||||
}
|
||||
|
||||
_transactionDetails.sizeChanged = true;
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#if defined(MACOSX)
|
||||
#if defined(MACOSX) || defined(GP2X)
|
||||
|
||||
#include "backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h"
|
||||
|
||||
|
|
|
@ -29,8 +29,11 @@
|
|||
#include "common/system.h"
|
||||
#include "common/config-manager.h"
|
||||
|
||||
//#define SAMPLES_PER_SEC 11025
|
||||
#ifdef GP2X
|
||||
#define SAMPLES_PER_SEC 11025
|
||||
#else
|
||||
#define SAMPLES_PER_SEC 22050
|
||||
#endif
|
||||
//#define SAMPLES_PER_SEC 44100
|
||||
|
||||
SdlMixerManager::SdlMixerManager()
|
||||
|
|
|
@ -6,7 +6,7 @@ MODULE_OBJS := \
|
|||
audiocd/default/default-audiocd.o \
|
||||
audiocd/sdl/sdl-audiocd.o \
|
||||
events/default/default-events.o \
|
||||
events/gp2xwizsdl/gp2xwizsdl-events.o \
|
||||
events/gp2xsdl/gp2xsdl-events.o \
|
||||
events/linuxmotosdl/linuxmotosdl-events.o \
|
||||
events/samsungtvsdl/samsungtvsdl-events.o \
|
||||
events/sdl/sdl-events.o \
|
||||
|
@ -25,6 +25,7 @@ MODULE_OBJS := \
|
|||
fs/wii/wii-fs-factory.o \
|
||||
fs/n64/n64-fs-factory.o \
|
||||
fs/n64/romfsstream.o \
|
||||
graphics/gp2xsdl/gp2xsdl-graphics.o \
|
||||
graphics/gp2xwizsdl/gp2xwizsdl-graphics.o \
|
||||
graphics/linuxmotosdl/linuxmotosdl-graphics.o \
|
||||
graphics/sdl/sdl-graphics.o \
|
||||
|
|
|
@ -1,638 +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$
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* GP2X: Common::Event Handling.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "backends/platform/gp2x/gp2x-common.h"
|
||||
#include "backends/platform/gp2x/gp2x-hw.h"
|
||||
#include "backends/keymapper/keymapper.h"
|
||||
#include "common/util.h"
|
||||
#include "common/events.h"
|
||||
#include "graphics/scaler/aspect.h" // for aspect2Real
|
||||
|
||||
// FIXME move joystick defines out and replace with confile file options
|
||||
// we should really allow users to map any key to a joystick button using the keymapper.
|
||||
#define JOY_DEADZONE 2200
|
||||
|
||||
#define JOY_XAXIS 0
|
||||
#define JOY_YAXIS 1
|
||||
|
||||
/* GP2X Wiz: Main Joystick Mappings */
|
||||
enum {
|
||||
GP2X_BUTTON_UP = 0,
|
||||
GP2X_BUTTON_UPLEFT = 1,
|
||||
GP2X_BUTTON_LEFT = 2,
|
||||
GP2X_BUTTON_DOWNLEFT = 3,
|
||||
GP2X_BUTTON_DOWN = 4,
|
||||
GP2X_BUTTON_DOWNRIGHT = 5,
|
||||
GP2X_BUTTON_RIGHT = 6,
|
||||
GP2X_BUTTON_UPRIGHT = 7,
|
||||
GP2X_BUTTON_START = 8,
|
||||
GP2X_BUTTON_SELECT = 9,
|
||||
GP2X_BUTTON_L = 10,
|
||||
GP2X_BUTTON_R = 11,
|
||||
GP2X_BUTTON_A = 12,
|
||||
GP2X_BUTTON_B = 13,
|
||||
GP2X_BUTTON_X = 14,
|
||||
GP2X_BUTTON_Y = 15,
|
||||
GP2X_BUTTON_VOLUP = 16,
|
||||
GP2X_BUTTON_VOLDOWN = 17,
|
||||
GP2X_BUTTON_CLICK = 18
|
||||
};
|
||||
|
||||
static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) {
|
||||
if (key >= SDLK_F1 && key <= SDLK_F9) {
|
||||
return key - SDLK_F1 + Common::ASCII_F1;
|
||||
} else if (key >= SDLK_KP0 && key <= SDLK_KP9) {
|
||||
return key - SDLK_KP0 + '0';
|
||||
} else if (key >= SDLK_UP && key <= SDLK_PAGEDOWN) {
|
||||
return key;
|
||||
} else if (unicode) {
|
||||
return unicode;
|
||||
} else if (key >= 'a' && key <= 'z' && (mod & KMOD_SHIFT)) {
|
||||
return key & ~0x20;
|
||||
} else if (key >= SDLK_NUMLOCK && key <= SDLK_EURO) {
|
||||
return 0;
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
void OSystem_GP2X::fillMouseEvent(Common::Event &event, int x, int y) {
|
||||
event.mouse.x = x;
|
||||
event.mouse.y = y;
|
||||
|
||||
// Update the "keyboard mouse" coords
|
||||
_km.x = x;
|
||||
_km.y = y;
|
||||
|
||||
// Adjust for the screen scaling
|
||||
if (!_overlayVisible) {
|
||||
event.mouse.x /= _videoMode.scaleFactor;
|
||||
event.mouse.y /= _videoMode.scaleFactor;
|
||||
if (_videoMode.aspectRatioCorrection)
|
||||
event.mouse.y = aspect2Real(event.mouse.y);
|
||||
}
|
||||
}
|
||||
|
||||
void OSystem_GP2X::handleKbdMouse() {
|
||||
uint32 curTime = getMillis();
|
||||
if (curTime >= _km.last_time + _km.delay_time) {
|
||||
_km.last_time = curTime;
|
||||
if (_km.x_down_count == 1) {
|
||||
_km.x_down_time = curTime;
|
||||
_km.x_down_count = 2;
|
||||
}
|
||||
if (_km.y_down_count == 1) {
|
||||
_km.y_down_time = curTime;
|
||||
_km.y_down_count = 2;
|
||||
}
|
||||
|
||||
if (_km.x_vel || _km.y_vel) {
|
||||
if (_km.x_down_count) {
|
||||
if (curTime > _km.x_down_time + _km.delay_time * 12) {
|
||||
if (_km.x_vel > 0)
|
||||
_km.x_vel++;
|
||||
else
|
||||
_km.x_vel--;
|
||||
} else if (curTime > _km.x_down_time + _km.delay_time * 8) {
|
||||
if (_km.x_vel > 0)
|
||||
_km.x_vel = 5;
|
||||
else
|
||||
_km.x_vel = -5;
|
||||
}
|
||||
}
|
||||
if (_km.y_down_count) {
|
||||
if (curTime > _km.y_down_time + _km.delay_time * 12) {
|
||||
if (_km.y_vel > 0)
|
||||
_km.y_vel++;
|
||||
else
|
||||
_km.y_vel--;
|
||||
} else if (curTime > _km.y_down_time + _km.delay_time * 8) {
|
||||
if (_km.y_vel > 0)
|
||||
_km.y_vel = 5;
|
||||
else
|
||||
_km.y_vel = -5;
|
||||
}
|
||||
}
|
||||
|
||||
_km.x += _km.x_vel;
|
||||
_km.y += _km.y_vel;
|
||||
|
||||
if (_km.x < 0) {
|
||||
_km.x = 0;
|
||||
_km.x_vel = -1;
|
||||
_km.x_down_count = 1;
|
||||
} else if (_km.x > _km.x_max) {
|
||||
_km.x = _km.x_max;
|
||||
_km.x_vel = 1;
|
||||
_km.x_down_count = 1;
|
||||
}
|
||||
|
||||
if (_km.y < 0) {
|
||||
_km.y = 0;
|
||||
_km.y_vel = -1;
|
||||
_km.y_down_count = 1;
|
||||
} else if (_km.y > _km.y_max) {
|
||||
_km.y = _km.y_max;
|
||||
_km.y_vel = 1;
|
||||
_km.y_down_count = 1;
|
||||
}
|
||||
|
||||
SDL_WarpMouse((Uint16)_km.x, (Uint16)_km.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static byte SDLModToOSystemKeyFlags(SDLMod mod) {
|
||||
byte b = 0;
|
||||
if (mod & KMOD_SHIFT)
|
||||
b |= Common::KBD_SHIFT;
|
||||
if (mod & KMOD_ALT)
|
||||
b |= Common::KBD_ALT;
|
||||
if (mod & KMOD_CTRL)
|
||||
b |= Common::KBD_CTRL;
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
void OSystem_GP2X::moveStick() {
|
||||
bool stickBtn[32];
|
||||
|
||||
memcpy(stickBtn, _stickBtn, sizeof(stickBtn));
|
||||
|
||||
if ((stickBtn[0])||(stickBtn[2])||(stickBtn[4])||(stickBtn[6]))
|
||||
stickBtn[1] = stickBtn[3] = stickBtn[5] = stickBtn[7] = 0;
|
||||
|
||||
if ((stickBtn[1])||(stickBtn[2])||(stickBtn[3])){
|
||||
if (_km.x_down_count!=2){
|
||||
_km.x_vel = -1;
|
||||
_km.x_down_count = 1;
|
||||
}else
|
||||
_km.x_vel = -4;
|
||||
} else if ((stickBtn[5])||(stickBtn[6])||(stickBtn[7])){
|
||||
if (_km.x_down_count!=2){
|
||||
_km.x_vel = 1;
|
||||
_km.x_down_count = 1;
|
||||
} else
|
||||
_km.x_vel = 4;
|
||||
} else {
|
||||
_km.x_vel = 0;
|
||||
_km.x_down_count = 0;
|
||||
}
|
||||
|
||||
|
||||
if ((stickBtn[0])||(stickBtn[1])||(stickBtn[7])){
|
||||
if (_km.y_down_count!=2){
|
||||
_km.y_vel = -1;
|
||||
_km.y_down_count = 1;
|
||||
}else
|
||||
_km.y_vel = -4;
|
||||
} else if ((stickBtn[3])||(stickBtn[4])||(stickBtn[5])){
|
||||
if (_km.y_down_count!=2){
|
||||
_km.y_vel = 1;
|
||||
_km.y_down_count = 1;
|
||||
} else
|
||||
_km.y_vel = 4;
|
||||
} else {
|
||||
_km.y_vel = 0;
|
||||
_km.y_down_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Quick default button states for modifiers. */
|
||||
int GP2X_BUTTON_STATE_L = false;
|
||||
|
||||
bool OSystem_GP2X::pollEvent(Common::Event &event) {
|
||||
SDL_Event ev;
|
||||
int axis;
|
||||
byte b = 0;
|
||||
|
||||
handleKbdMouse();
|
||||
|
||||
// If the screen mode changed, send an Common::EVENT_SCREEN_CHANGED
|
||||
if (_modeChanged) {
|
||||
_modeChanged = false;
|
||||
event.type = Common::EVENT_SCREEN_CHANGED;
|
||||
return true;
|
||||
}
|
||||
|
||||
// GP2X Input mappings.
|
||||
|
||||
/*
|
||||
Single Button
|
||||
|
||||
Movement:
|
||||
|
||||
GP2X_BUTTON_UP Cursor Up
|
||||
GP2X_BUTTON_DOWN Cursor Down
|
||||
GP2X_BUTTON_LEFT Cursor Left
|
||||
GP2X_BUTTON_RIGHT Cursor Right
|
||||
|
||||
GP2X_BUTTON_UPLEFT Cursor Up Left
|
||||
GP2X_BUTTON_UPRIGHT Cursor Up Right
|
||||
GP2X_BUTTON_DOWNLEFT Cursor Down Left
|
||||
GP2X_BUTTON_DOWNRIGHT Cursor Down Right
|
||||
|
||||
Button Emulation:
|
||||
|
||||
GP2X_BUTTON_CLICK Left Mouse Click
|
||||
GP2X_BUTTON_A . (Period)
|
||||
GP2X_BUTTON_B Left Mouse Click
|
||||
GP2X_BUTTON_Y Space Bar
|
||||
GP2X_BUTTON_X Right Mouse Click
|
||||
GP2X_BUTTON_L Combo Modifier (Left Trigger)
|
||||
GP2X_BUTTON_R Return (Right Trigger)
|
||||
GP2X_BUTTON_START F5 (Game Menu)
|
||||
GP2X_BUTTON_SELECT Escape
|
||||
GP2X_BUTTON_VOLUP /dev/mixer Global Volume Up
|
||||
GP2X_BUTTON_VOLDOWN /dev/mixer Global Volume Down
|
||||
|
||||
Combos:
|
||||
|
||||
GP2X_BUTTON_VOLUP & GP2X_BUTTON_VOLDOWN 0 (For Monkey 2 CP) or Virtual Keyboard if enabled
|
||||
GP2X_BUTTON_L & GP2X_BUTTON_SELECT Common::EVENT_QUIT (Calls Sync() to make sure SD is flushed)
|
||||
GP2X_BUTTON_L & GP2X_BUTTON_Y Toggles setZoomOnMouse() for larger then 320*240 games to scale to the point + raduis.
|
||||
GP2X_BUTTON_L & GP2X_BUTTON_START Common::EVENT_MAINMENU (ScummVM Global Main Menu)
|
||||
GP2X_BUTTON_L & GP2X_BUTTON_A Common::EVENT_PREDICTIVE_DIALOG for predictive text entry box (AGI games)
|
||||
*/
|
||||
|
||||
while (SDL_PollEvent(&ev)) {
|
||||
|
||||
switch (ev.type) {
|
||||
case SDL_KEYDOWN:{
|
||||
b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());
|
||||
|
||||
const bool event_complete = remapKey(ev,event);
|
||||
|
||||
if (event_complete)
|
||||
return true;
|
||||
|
||||
event.type = Common::EVENT_KEYDOWN;
|
||||
event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym;
|
||||
event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
|
||||
|
||||
return true;
|
||||
}
|
||||
case SDL_KEYUP:
|
||||
{
|
||||
const bool event_complete = remapKey(ev,event);
|
||||
|
||||
if (event_complete)
|
||||
return true;
|
||||
|
||||
event.type = Common::EVENT_KEYUP;
|
||||
event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym;
|
||||
event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
|
||||
b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());
|
||||
|
||||
// Ctrl-Alt-<key> will change the GFX mode
|
||||
if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
|
||||
// Swallow these key up events
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
case SDL_MOUSEMOTION:
|
||||
event.type = Common::EVENT_MOUSEMOVE;
|
||||
fillMouseEvent(event, ev.motion.x, ev.motion.y);
|
||||
|
||||
setMousePos(event.mouse.x, event.mouse.y);
|
||||
return true;
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
if (ev.button.button == SDL_BUTTON_LEFT)
|
||||
event.type = Common::EVENT_LBUTTONDOWN;
|
||||
else if (ev.button.button == SDL_BUTTON_RIGHT)
|
||||
event.type = Common::EVENT_RBUTTONDOWN;
|
||||
#if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN)
|
||||
else if (ev.button.button == SDL_BUTTON_WHEELUP)
|
||||
event.type = Common::EVENT_WHEELUP;
|
||||
else if (ev.button.button == SDL_BUTTON_WHEELDOWN)
|
||||
event.type = Common::EVENT_WHEELDOWN;
|
||||
#endif
|
||||
#if defined(SDL_BUTTON_MIDDLE)
|
||||
else if (ev.button.button == SDL_BUTTON_MIDDLE)
|
||||
event.type = Common::EVENT_MBUTTONDOWN;
|
||||
#endif
|
||||
else
|
||||
break;
|
||||
|
||||
fillMouseEvent(event, ev.button.x, ev.button.y);
|
||||
|
||||
return true;
|
||||
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
if (ev.button.button == SDL_BUTTON_LEFT)
|
||||
event.type = Common::EVENT_LBUTTONUP;
|
||||
else if (ev.button.button == SDL_BUTTON_RIGHT)
|
||||
event.type = Common::EVENT_RBUTTONUP;
|
||||
#if defined(SDL_BUTTON_MIDDLE)
|
||||
else if (ev.button.button == SDL_BUTTON_MIDDLE)
|
||||
event.type = Common::EVENT_MBUTTONUP;
|
||||
#endif
|
||||
else
|
||||
break;
|
||||
fillMouseEvent(event, ev.button.x, ev.button.y);
|
||||
|
||||
return true;
|
||||
|
||||
// GP2X Button mapings. Main code
|
||||
|
||||
case SDL_JOYBUTTONDOWN:
|
||||
_stickBtn[ev.jbutton.button] = 1;
|
||||
if (ev.jbutton.button == GP2X_BUTTON_B) {
|
||||
event.type = Common::EVENT_LBUTTONDOWN;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
} else if (ev.jbutton.button == GP2X_BUTTON_CLICK) {
|
||||
event.type = Common::EVENT_LBUTTONDOWN;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
} else if (ev.jbutton.button == GP2X_BUTTON_X) {
|
||||
event.type = Common::EVENT_RBUTTONDOWN;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
} else if (_stickBtn[GP2X_BUTTON_L] && (ev.jbutton.button == GP2X_BUTTON_SELECT)) {
|
||||
event.type = Common::EVENT_QUIT;
|
||||
} else if (ev.jbutton.button < 8) {
|
||||
moveStick();
|
||||
event.type = Common::EVENT_MOUSEMOVE;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
} else {
|
||||
event.type = Common::EVENT_KEYDOWN;
|
||||
event.kbd.flags = 0;
|
||||
switch (ev.jbutton.button) {
|
||||
case GP2X_BUTTON_L:
|
||||
GP2X_BUTTON_STATE_L = true;
|
||||
break;
|
||||
case GP2X_BUTTON_R:
|
||||
if (GP2X_BUTTON_STATE_L == true) {
|
||||
#ifdef ENABLE_VKEYBD
|
||||
event.kbd.keycode = Common::KEYCODE_F7;
|
||||
event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0);
|
||||
#else
|
||||
event.kbd.keycode = Common::KEYCODE_0;
|
||||
event.kbd.ascii = mapKey(SDLK_0, ev.key.keysym.mod, 0);
|
||||
#endif
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_RETURN;
|
||||
event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0);
|
||||
}
|
||||
break;
|
||||
case GP2X_BUTTON_SELECT:
|
||||
if (GP2X_BUTTON_STATE_L == true) {
|
||||
event.type = Common::EVENT_QUIT;
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_ESCAPE;
|
||||
event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
|
||||
}
|
||||
break;
|
||||
case GP2X_BUTTON_A:
|
||||
if (GP2X_BUTTON_STATE_L == true) {
|
||||
event.type = Common::EVENT_PREDICTIVE_DIALOG;
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_PERIOD;
|
||||
event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
|
||||
}
|
||||
break;
|
||||
case GP2X_BUTTON_Y:
|
||||
if (GP2X_BUTTON_STATE_L == true) {
|
||||
setZoomOnMouse();
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_SPACE;
|
||||
event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
|
||||
}
|
||||
break;
|
||||
case GP2X_BUTTON_START:
|
||||
if (GP2X_BUTTON_STATE_L == true) {
|
||||
event.type = Common::EVENT_MAINMENU;
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_F5;
|
||||
event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
|
||||
}
|
||||
break;
|
||||
case GP2X_BUTTON_VOLUP:
|
||||
GP2X_HW::mixerMoveVolume(2);
|
||||
if (GP2X_HW::volumeLevel == 100) {
|
||||
displayMessageOnOSD("Maximum Volume");
|
||||
} else {
|
||||
displayMessageOnOSD("Increasing Volume");
|
||||
}
|
||||
break;
|
||||
|
||||
case GP2X_BUTTON_VOLDOWN:
|
||||
GP2X_HW::mixerMoveVolume(1);
|
||||
if (GP2X_HW::volumeLevel == 0) {
|
||||
displayMessageOnOSD("Minimal Volume");
|
||||
} else {
|
||||
displayMessageOnOSD("Decreasing Volume");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
case SDL_JOYBUTTONUP:
|
||||
_stickBtn[ev.jbutton.button] = 0;
|
||||
if (ev.jbutton.button == GP2X_BUTTON_B) {
|
||||
event.type = Common::EVENT_LBUTTONUP;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
} else if (ev.jbutton.button == GP2X_BUTTON_CLICK) {
|
||||
event.type = Common::EVENT_LBUTTONUP;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
} else if (ev.jbutton.button == GP2X_BUTTON_X) {
|
||||
event.type = Common::EVENT_RBUTTONUP;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
} else if (ev.jbutton.button < 8) {
|
||||
moveStick();
|
||||
event.type = Common::EVENT_MOUSEMOVE;
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
} else {
|
||||
event.type = Common::EVENT_KEYUP;
|
||||
event.kbd.flags = 0;
|
||||
switch (ev.jbutton.button) {
|
||||
case GP2X_BUTTON_SELECT:
|
||||
event.kbd.keycode = Common::KEYCODE_ESCAPE;
|
||||
event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
|
||||
break;
|
||||
case GP2X_BUTTON_A:
|
||||
event.kbd.keycode = Common::KEYCODE_PERIOD;
|
||||
event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
|
||||
break;
|
||||
case GP2X_BUTTON_Y:
|
||||
event.kbd.keycode = Common::KEYCODE_SPACE;
|
||||
event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
|
||||
break;
|
||||
case GP2X_BUTTON_START:
|
||||
if (GP2X_BUTTON_STATE_L == true) {
|
||||
event.type = Common::EVENT_MAINMENU;
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_F5;
|
||||
event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
|
||||
}
|
||||
break;
|
||||
case GP2X_BUTTON_L:
|
||||
GP2X_BUTTON_STATE_L = false;
|
||||
break;
|
||||
case GP2X_BUTTON_R:
|
||||
if (GP2X_BUTTON_STATE_L == true) {
|
||||
#ifdef ENABLE_VKEYBD
|
||||
event.kbd.keycode = Common::KEYCODE_F7;
|
||||
event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0);
|
||||
#else
|
||||
event.kbd.keycode = Common::KEYCODE_0;
|
||||
event.kbd.ascii = mapKey(SDLK_0, ev.key.keysym.mod, 0);
|
||||
#endif
|
||||
} else {
|
||||
event.kbd.keycode = Common::KEYCODE_RETURN;
|
||||
event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0);
|
||||
}
|
||||
break;
|
||||
case GP2X_BUTTON_VOLUP:
|
||||
break;
|
||||
case GP2X_BUTTON_VOLDOWN:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
case SDL_JOYAXISMOTION:
|
||||
axis = ev.jaxis.value;
|
||||
if ( axis > JOY_DEADZONE) {
|
||||
axis -= JOY_DEADZONE;
|
||||
event.type = Common::EVENT_MOUSEMOVE;
|
||||
} else if ( axis < -JOY_DEADZONE ) {
|
||||
axis += JOY_DEADZONE;
|
||||
event.type = Common::EVENT_MOUSEMOVE;
|
||||
} else
|
||||
axis = 0;
|
||||
|
||||
if ( ev.jaxis.axis == JOY_XAXIS) {
|
||||
if (axis != 0) {
|
||||
_km.x_vel = (axis > 0) ? 1:-1;
|
||||
_km.x_down_count = 1;
|
||||
} else {
|
||||
_km.x_vel = 0;
|
||||
_km.x_down_count = 0;
|
||||
}
|
||||
|
||||
} else if (ev.jaxis.axis == JOY_YAXIS) {
|
||||
#ifndef JOY_INVERT_Y
|
||||
axis = -axis;
|
||||
#endif
|
||||
#ifdef JOY_ANALOG
|
||||
_km.y_vel = -axis / 2000;
|
||||
_km.y_down_count = 0;
|
||||
#else
|
||||
if (axis != 0) {
|
||||
_km.y_vel = (-axis > 0) ? 1: -1;
|
||||
_km.y_down_count = 1;
|
||||
} else {
|
||||
_km.y_vel = 0;
|
||||
_km.y_down_count = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
fillMouseEvent(event, _km.x, _km.y);
|
||||
|
||||
return true;
|
||||
|
||||
case SDL_VIDEOEXPOSE:
|
||||
_forceFull = true;
|
||||
break;
|
||||
|
||||
case SDL_QUIT:
|
||||
event.type = Common::EVENT_QUIT;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool OSystem_GP2X::remapKey(SDL_Event &ev,Common::Event &event) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void OSystem_GP2X::setupKeymapper() {
|
||||
#ifdef ENABLE_KEYMAPPER
|
||||
using namespace Common;
|
||||
Keymapper *mapper = getEventManager()->getKeymapper();
|
||||
|
||||
HardwareKeySet *keySet = new HardwareKeySet();
|
||||
keySet->addHardwareKey(new HardwareKey( "a", KeyState(KEYCODE_a), "a", kActionKeyType ));
|
||||
keySet->addHardwareKey(new HardwareKey( "s", KeyState(KEYCODE_s), "s", kActionKeyType ));
|
||||
keySet->addHardwareKey(new HardwareKey( "d", KeyState(KEYCODE_d), "d", kActionKeyType ));
|
||||
keySet->addHardwareKey(new HardwareKey( "f", KeyState(KEYCODE_f), "f", kActionKeyType ));
|
||||
keySet->addHardwareKey(new HardwareKey( "n", KeyState(KEYCODE_n), "n (vk)", kTriggerLeftKeyType, kVirtualKeyboardActionType ));
|
||||
keySet->addHardwareKey(new HardwareKey( "m", KeyState(KEYCODE_m), "m (remap)", kTriggerRightKeyType, kKeyRemapActionType ));
|
||||
keySet->addHardwareKey(new HardwareKey( "[", KeyState(KEYCODE_LEFTBRACKET), "[ (select)", kSelectKeyType ));
|
||||
keySet->addHardwareKey(new HardwareKey( "]", KeyState(KEYCODE_RIGHTBRACKET), "] (start)", kStartKeyType ));
|
||||
mapper->registerHardwareKeySet(keySet);
|
||||
|
||||
Keymap *globalMap = new Keymap("global");
|
||||
Keymap *guiMap = new Keymap("gui");
|
||||
Action *act;
|
||||
Event evt ;
|
||||
|
||||
act = new Action(globalMap, "MENU", "Menu", kGenericActionType, kSelectKeyType);
|
||||
act->addKeyEvent(KeyState(KEYCODE_F5, ASCII_F5, 0));
|
||||
|
||||
act = new Action(globalMap, "SKCT", "Skip", kGenericActionType, kActionKeyType);
|
||||
act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0));
|
||||
|
||||
act = new Action(globalMap, "PAUS", "Pause", kGenericActionType, kStartKeyType);
|
||||
act->addKeyEvent(KeyState(KEYCODE_SPACE, ' ', 0));
|
||||
|
||||
act = new Action(globalMap, "SKLI", "Skip line", kGenericActionType, kActionKeyType);
|
||||
act->addKeyEvent(KeyState(KEYCODE_PERIOD, '.', 0));
|
||||
|
||||
act = new Action(globalMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType);
|
||||
act->addKeyEvent(KeyState(KEYCODE_F6, ASCII_F6, 0));
|
||||
|
||||
act = new Action(globalMap, "REMP", "Remap keys", kKeyRemapActionType);
|
||||
act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0));
|
||||
|
||||
mapper->addGlobalKeymap(globalMap);
|
||||
|
||||
act = new Action(guiMap, "CLOS", "Close", kGenericActionType, kStartKeyType);
|
||||
act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0));
|
||||
|
||||
act = new Action(guiMap, "CLIK", "Mouse click");
|
||||
act->addLeftClickEvent();
|
||||
|
||||
act = new Action(guiMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType);
|
||||
act->addKeyEvent(KeyState(KEYCODE_F6, ASCII_F6, 0));
|
||||
|
||||
act = new Action(guiMap, "REMP", "Remap keys", kKeyRemapActionType);
|
||||
act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0));
|
||||
|
||||
mapper->addGlobalKeymap(guiMap);
|
||||
|
||||
mapper->pushKeymap("global");
|
||||
#endif
|
||||
}
|
||||
|
|
@ -23,361 +23,26 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifndef GP2X_COMMON_H
|
||||
#define GP2X_COMMON_H
|
||||
#ifndef PLATFORM_SDL_GP2X_H
|
||||
#define PLATFORM_SDL_GP2X_H
|
||||
|
||||
#include <SDL.h>
|
||||
#include <SDL_gp2x.h>
|
||||
#include "backends/platform/sdl/posix/posix.h"
|
||||
|
||||
#include "backends/base-backend.h"
|
||||
#include "graphics/scaler.h"
|
||||
|
||||
#define __GP2X__
|
||||
#define USE_OSD
|
||||
#define MIXER_DOUBLE_BUFFERING 1
|
||||
|
||||
namespace Audio {
|
||||
class MixerImpl;
|
||||
}
|
||||
|
||||
enum {
|
||||
GFX_NORMAL = 0
|
||||
};
|
||||
|
||||
|
||||
class OSystem_GP2X : public BaseBackend {
|
||||
public:
|
||||
OSystem_GP2X();
|
||||
virtual ~OSystem_GP2X();
|
||||
|
||||
virtual void initBackend();
|
||||
|
||||
void beginGFXTransaction(void);
|
||||
TransactionError endGFXTransaction(void);
|
||||
|
||||
// Set the size of the video bitmap.
|
||||
// Typically, 320x200
|
||||
void initSize(uint w, uint h, const Graphics::PixelFormat *format);
|
||||
|
||||
int getScreenChangeID() const { return _screenChangeCount; }
|
||||
|
||||
// Set colors of the palette
|
||||
void setPalette(const byte *colors, uint start, uint num);
|
||||
|
||||
// Get colors of the palette
|
||||
void grabPalette(byte *colors, uint start, uint num);
|
||||
|
||||
// Draw a bitmap to screen.
|
||||
// The screen will not be updated to reflect the new bitmap
|
||||
void copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h);
|
||||
|
||||
virtual Graphics::Surface *lockScreen();
|
||||
virtual void unlockScreen();
|
||||
|
||||
// Update the dirty areas of the screen
|
||||
void updateScreen();
|
||||
|
||||
// Either show or hide the mouse cursor
|
||||
bool showMouse(bool visible);
|
||||
|
||||
// Warp the mouse cursor. Where set_mouse_pos() only informs the
|
||||
// backend of the mouse cursor's current position, this function
|
||||
// actually moves the cursor to the specified position.
|
||||
void warpMouse(int x, int y);
|
||||
|
||||
// Set the bitmap that's used when drawing the cursor.
|
||||
void setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format);
|
||||
|
||||
// Set colors of cursor palette
|
||||
void setCursorPalette(const byte *colors, uint start, uint num);
|
||||
|
||||
// Disables or enables cursor palette
|
||||
void disableCursorPalette(bool disable) {
|
||||
_cursorPaletteDisabled = disable;
|
||||
blitCursor();
|
||||
}
|
||||
|
||||
// Shaking is used in SCUMM. Set current shake position.
|
||||
void setShakePos(int shake_pos);
|
||||
|
||||
// Get the number of milliseconds since the program was started.
|
||||
uint32 getMillis();
|
||||
|
||||
// Delay for a specified amount of milliseconds
|
||||
void delayMillis(uint msecs);
|
||||
|
||||
// Get the next event.
|
||||
// Returns true if an event was retrieved.
|
||||
virtual bool pollEvent(Common::Event &event); // overloaded by CE backend
|
||||
|
||||
// Sets up the keymapper with the backends hardware key set
|
||||
void setupKeymapper();
|
||||
|
||||
// Set function that generates samples
|
||||
void setupMixer();
|
||||
static void mixCallback(void *s, byte *samples, int len);
|
||||
|
||||
void closeMixer();
|
||||
|
||||
virtual Audio::Mixer *getMixer();
|
||||
|
||||
// Quit
|
||||
void quit();
|
||||
|
||||
void getTimeAndDate(TimeDate &t) const;
|
||||
virtual Common::TimerManager *getTimerManager();
|
||||
|
||||
// Mutex handling
|
||||
MutexRef createMutex();
|
||||
void lockMutex(MutexRef mutex);
|
||||
void unlockMutex(MutexRef mutex);
|
||||
void deleteMutex(MutexRef mutex);
|
||||
|
||||
// Overlay
|
||||
Graphics::PixelFormat getOverlayFormat() const { return _overlayFormat; }
|
||||
void showOverlay();
|
||||
void hideOverlay();
|
||||
void clearOverlay();
|
||||
void grabOverlay(OverlayColor *buf, int pitch);
|
||||
void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h);
|
||||
int16 getHeight();
|
||||
int16 getWidth();
|
||||
int16 getOverlayHeight() { return _videoMode.overlayHeight; }
|
||||
int16 getOverlayWidth() { return _videoMode.overlayWidth; }
|
||||
|
||||
const GraphicsMode *getSupportedGraphicsModes() const;
|
||||
int getDefaultGraphicsMode() const;
|
||||
bool setGraphicsMode(int mode);
|
||||
int getGraphicsMode() const;
|
||||
|
||||
bool hasFeature(Feature f);
|
||||
void setFeatureState(Feature f, bool enable);
|
||||
bool getFeatureState(Feature f);
|
||||
|
||||
void displayMessageOnOSD(const char *msg);
|
||||
|
||||
virtual Common::SaveFileManager *getSavefileManager();
|
||||
virtual FilesystemFactory *getFilesystemFactory();
|
||||
virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);
|
||||
|
||||
virtual Common::SeekableReadStream *createConfigReadStream();
|
||||
virtual Common::WriteStream *createConfigWriteStream();
|
||||
|
||||
protected:
|
||||
bool _inited;
|
||||
|
||||
SDL_Surface *_osdSurface;
|
||||
Uint8 _osdAlpha; // Transparency level of the OSD
|
||||
uint32 _osdFadeStartTime; // When to start the fade out
|
||||
enum {
|
||||
kOSDFadeOutDelay = 2 * 1000, // Delay before the OSD is faded out (in milliseconds)
|
||||
kOSDFadeOutDuration = 500, // Duration of the OSD fade out (in milliseconds)
|
||||
kOSDColorKey = 1,
|
||||
kOSDInitialAlpha = 80 // Initial alpha level, in percent
|
||||
};
|
||||
|
||||
// hardware screen
|
||||
SDL_Surface *_hwscreen;
|
||||
|
||||
// unseen game screen
|
||||
SDL_Surface *_screen;
|
||||
|
||||
// temporary screen (for scalers)
|
||||
SDL_Surface *_tmpscreen;
|
||||
SDL_Surface *_tmpscreen2;
|
||||
|
||||
// overlay
|
||||
SDL_Surface *_overlayscreen;
|
||||
bool _overlayVisible;
|
||||
Graphics::PixelFormat _overlayFormat;
|
||||
|
||||
enum {
|
||||
kTransactionNone = 0,
|
||||
kTransactionActive = 1,
|
||||
kTransactionRollback = 2
|
||||
};
|
||||
|
||||
struct TransactionDetails {
|
||||
bool sizeChanged;
|
||||
bool needHotswap;
|
||||
bool needUpdatescreen;
|
||||
bool normal1xScaler;
|
||||
};
|
||||
TransactionDetails _transactionDetails;
|
||||
|
||||
struct VideoState {
|
||||
bool setup;
|
||||
|
||||
bool fullscreen;
|
||||
bool aspectRatioCorrection;
|
||||
|
||||
int mode;
|
||||
int scaleFactor;
|
||||
|
||||
int screenWidth, screenHeight;
|
||||
int overlayWidth, overlayHeight;
|
||||
};
|
||||
VideoState _videoMode, _oldVideoMode;
|
||||
|
||||
virtual void setGraphicsModeIntern(); // overloaded by CE backend
|
||||
|
||||
/** Force full redraw on next updateScreen */
|
||||
bool _forceFull;
|
||||
ScalerProc *_scalerProc;
|
||||
int _scalerType;
|
||||
int _transactionMode;
|
||||
|
||||
bool _screenIsLocked;
|
||||
Graphics::Surface _framebuffer;
|
||||
|
||||
/** Current video mode flags (see DF_* constants) */
|
||||
bool _modeChanged;
|
||||
int _screenChangeCount;
|
||||
|
||||
/* True if zoom on mouse is enabled. (only set by > 240 high games) */
|
||||
bool _adjustZoomOnMouse;
|
||||
|
||||
enum {
|
||||
NUM_DIRTY_RECT = 100,
|
||||
MAX_MOUSE_W = 80,
|
||||
MAX_MOUSE_H = 80,
|
||||
MAX_SCALING = 3
|
||||
};
|
||||
|
||||
// Dirty rect management
|
||||
SDL_Rect _dirtyRectList[NUM_DIRTY_RECT];
|
||||
int _numDirtyRects;
|
||||
|
||||
// Keyboard mouse emulation. Disabled by fingolfin 2004-12-18.
|
||||
// I am keeping the rest of the code in for now, since the joystick
|
||||
// code (or rather, "hack") uses it, too.
|
||||
struct KbdMouse {
|
||||
int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count;
|
||||
uint32 last_time, delay_time, x_down_time, y_down_time;
|
||||
};
|
||||
|
||||
struct MousePos {
|
||||
// The mouse position, using either virtual (game) or real
|
||||
// (overlay) coordinates.
|
||||
int16 x, y;
|
||||
|
||||
// The size and hotspot of the original cursor image.
|
||||
int16 w, h;
|
||||
int16 hotX, hotY;
|
||||
|
||||
// The size and hotspot of the pre-scaled cursor image, in real
|
||||
// coordinates.
|
||||
int16 rW, rH;
|
||||
int16 rHotX, rHotY;
|
||||
|
||||
// The size and hotspot of the pre-scaled cursor image, in game
|
||||
// coordinates.
|
||||
int16 vW, vH;
|
||||
int16 vHotX, vHotY;
|
||||
|
||||
MousePos() : x(0), y(0), w(0), h(0), hotX(0), hotY(0),
|
||||
rW(0), rH(0), rHotX(0), rHotY(0), vW(0), vH(0),
|
||||
vHotX(0), vHotY(0)
|
||||
{ }
|
||||
};
|
||||
|
||||
// mouse
|
||||
KbdMouse _km;
|
||||
bool _mouseVisible;
|
||||
bool _mouseNeedsRedraw;
|
||||
byte *_mouseData;
|
||||
SDL_Rect _mouseBackup;
|
||||
MousePos _mouseCurState;
|
||||
byte _mouseKeyColor;
|
||||
int _cursorTargetScale;
|
||||
bool _cursorPaletteDisabled;
|
||||
SDL_Surface *_mouseOrigSurface;
|
||||
SDL_Surface *_mouseSurface;
|
||||
enum {
|
||||
kMouseColorKey = 1
|
||||
};
|
||||
|
||||
// joystick
|
||||
SDL_Joystick *_joystick;
|
||||
bool _stickBtn[32];
|
||||
|
||||
// Shake mode
|
||||
int _currentShakePos;
|
||||
int _newShakePos;
|
||||
|
||||
// Palette data
|
||||
SDL_Color *_currentPalette;
|
||||
uint _paletteDirtyStart, _paletteDirtyEnd;
|
||||
|
||||
// Cursor palette data
|
||||
SDL_Color *_cursorPalette;
|
||||
|
||||
/**
|
||||
* Mutex which prevents multiple threads from interfering with each other
|
||||
* when accessing the screen.
|
||||
*/
|
||||
MutexRef _graphicsMutex;
|
||||
|
||||
#ifdef MIXER_DOUBLE_BUFFERING
|
||||
SDL_mutex *_soundMutex;
|
||||
SDL_cond *_soundCond;
|
||||
SDL_Thread *_soundThread;
|
||||
bool _soundThreadIsRunning;
|
||||
bool _soundThreadShouldQuit;
|
||||
|
||||
byte _activeSoundBuf;
|
||||
uint _soundBufSize;
|
||||
byte *_soundBuffers[2];
|
||||
|
||||
void mixerProducerThread();
|
||||
static int SDLCALL mixerProducerThreadEntry(void *arg);
|
||||
void initThreadedMixer(Audio::MixerImpl *mixer, uint bufSize);
|
||||
void deinitThreadedMixer();
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX 255
|
||||
#endif
|
||||
|
||||
FilesystemFactory *_fsFactory;
|
||||
Common::SaveFileManager *_savefile;
|
||||
Audio::MixerImpl *_mixer;
|
||||
class OSystem_GP2X : public OSystem_POSIX {
|
||||
public:
|
||||
OSystem_GP2X() {}
|
||||
virtual ~OSystem_GP2X() {}
|
||||
|
||||
SDL_TimerID _timerID;
|
||||
Common::TimerManager *_timer;
|
||||
virtual void initBackend();
|
||||
virtual void quit();
|
||||
virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);
|
||||
|
||||
protected:
|
||||
virtual void addDirtyRect(int x, int y, int w, int h, bool realCoordinates = false);
|
||||
|
||||
void drawMouse();
|
||||
void undrawMouse();
|
||||
void blitCursor();
|
||||
|
||||
/** Set the position of the virtual mouse cursor. */
|
||||
void setMousePos(int x, int y);
|
||||
void fillMouseEvent(Common::Event &event, int x, int y);
|
||||
void toggleMouseGrab();
|
||||
|
||||
void internUpdateScreen();
|
||||
|
||||
bool loadGFXMode();
|
||||
void unloadGFXMode();
|
||||
bool hotswapGFXMode();
|
||||
|
||||
void setFullscreenMode(bool enable);
|
||||
void setAspectRatioCorrection(bool enable);
|
||||
|
||||
void setZoomOnMouse(); // GP2X: On > 240 high games zooms on the mouse + radius.
|
||||
|
||||
bool saveScreenshot(const char *filename);
|
||||
|
||||
int effectiveScreenHeight() const;
|
||||
|
||||
void setupIcon();
|
||||
void handleKbdMouse();
|
||||
|
||||
virtual bool remapKey(SDL_Event &ev, Common::Event &event);
|
||||
|
||||
void handleScalerHotkeys(const SDL_KeyboardEvent &key);
|
||||
|
||||
void moveStick();
|
||||
int _gp2xInputType;
|
||||
virtual void initSDL();
|
||||
};
|
||||
|
||||
#endif // GP2X_COMMON_H
|
||||
#endif
|
||||
|
|
50
backends/platform/gp2x/gp2x-main.cpp
Normal file
50
backends/platform/gp2x/gp2x-main.cpp
Normal file
|
@ -0,0 +1,50 @@
|
|||
/* 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 "backends/platform/gp2x/gp2x-sdl.h"
|
||||
#include "backends/plugins/posix/posix-provider.h"
|
||||
#include "base/main.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
// Create our OSystem instance
|
||||
g_system = new OSystem_GP2X();
|
||||
assert(g_system);
|
||||
|
||||
// Pre initialize the backend
|
||||
((OSystem_GP2X *)g_system)->init();
|
||||
|
||||
#ifdef DYNAMIC_MODULES
|
||||
PluginManager::instance().addPluginProvider(new POSIXPluginProvider());
|
||||
#endif
|
||||
|
||||
// Invoke the actual ScummVM main entry point:
|
||||
int res = scummvm_main(argc, argv);
|
||||
|
||||
// Free OSystem
|
||||
delete (OSystem_GP2X *)g_system;
|
||||
|
||||
return res;
|
||||
}
|
|
@ -23,29 +23,19 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* GP2X: Main backend.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "backends/platform/gp2x/gp2x-common.h"
|
||||
#include "backends/platform/gp2x/gp2x-hw.h"
|
||||
#include "backends/platform/gp2x/gp2x-mem.h"
|
||||
#include "common/archive.h"
|
||||
#include "common/config-manager.h"
|
||||
#include "common/debug.h"
|
||||
#include "common/EventRecorder.h"
|
||||
#include "common/events.h"
|
||||
#include "common/util.h"
|
||||
|
||||
#include "common/file.h"
|
||||
#include "base/main.h"
|
||||
|
||||
#include "backends/graphics/gp2xsdl/gp2xsdl-graphics.h"
|
||||
#include "backends/events/gp2xsdl/gp2xsdl-events.h"
|
||||
#include "backends/saves/default/default-saves.h"
|
||||
|
||||
#include "backends/timer/default/default-timer.h"
|
||||
#include "backends/plugins/posix/posix-provider.h"
|
||||
#include "sound/mixer_intern.h"
|
||||
#include "common/config-manager.h"
|
||||
#include "common/debug.h"
|
||||
|
||||
// Disable for normal serial logging.
|
||||
#define DUMP_STDOUT
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -53,66 +43,11 @@
|
|||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include <time.h> // for getTimeAndDate()
|
||||
|
||||
// Disable for normal serial logging.
|
||||
#define DUMP_STDOUT
|
||||
|
||||
#define SAMPLES_PER_SEC 11025
|
||||
//#define SAMPLES_PER_SEC 22050
|
||||
//#define SAMPLES_PER_SEC 44100
|
||||
|
||||
#define DEFAULT_CONFIG_FILE ".scummvmrc"
|
||||
|
||||
#include "backends/fs/posix/posix-fs-factory.h"
|
||||
|
||||
static Uint32 timer_handler(Uint32 interval, void *param) {
|
||||
((DefaultTimerManager *)param)->handler();
|
||||
return interval;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
g_system = new OSystem_GP2X();
|
||||
assert(g_system);
|
||||
|
||||
#ifdef DYNAMIC_MODULES
|
||||
PluginManager::instance().addPluginProvider(new POSIXPluginProvider());
|
||||
#endif
|
||||
|
||||
// Invoke the actual ScummVM main entry point:
|
||||
int res = scummvm_main(argc, argv);
|
||||
g_system->quit();
|
||||
return res;
|
||||
}
|
||||
|
||||
OSystem *OSystem_GP2X_create() {
|
||||
return new OSystem_GP2X();
|
||||
}
|
||||
|
||||
void OSystem_GP2X::initBackend() {
|
||||
assert(!_inited);
|
||||
|
||||
ConfMan.setInt("joystick_num", 0);
|
||||
int joystick_num = ConfMan.getInt("joystick_num");
|
||||
uint32 sdlFlags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_EVENTTHREAD;
|
||||
|
||||
if (ConfMan.hasKey("disable_sdl_parachute"))
|
||||
sdlFlags |= SDL_INIT_NOPARACHUTE;
|
||||
|
||||
if (joystick_num > -1)
|
||||
sdlFlags |= SDL_INIT_JOYSTICK;
|
||||
|
||||
if (SDL_Init(sdlFlags) == -1) {
|
||||
error("Could not initialize SDL: %s", SDL_GetError());
|
||||
}
|
||||
|
||||
// Setup default save path to be workingdir/saves
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX 255
|
||||
#endif
|
||||
|
||||
char savePath[PATH_MAX+1];
|
||||
char workDirName[PATH_MAX+1];
|
||||
char savePath[PATH_MAX + 1];
|
||||
char workDirName[PATH_MAX + 1];
|
||||
|
||||
if (getcwd(workDirName, PATH_MAX) == NULL) {
|
||||
error("Could not obtain current working directory.");
|
||||
|
@ -134,8 +69,8 @@ void OSystem_GP2X::initBackend() {
|
|||
#ifdef DUMP_STDOUT
|
||||
// The GP2X has a serial console but most users do not use this so we
|
||||
// output all our STDOUT and STDERR to files for debug purposes.
|
||||
char STDOUT_FILE[PATH_MAX+1];
|
||||
char STDERR_FILE[PATH_MAX+1];
|
||||
char STDOUT_FILE[PATH_MAX + 1];
|
||||
char STDERR_FILE[PATH_MAX + 1];
|
||||
|
||||
strcpy(STDOUT_FILE, workDirName);
|
||||
strcpy(STDERR_FILE, workDirName);
|
||||
|
@ -175,12 +110,7 @@ void OSystem_GP2X::initBackend() {
|
|||
printf("%s\n", "Debug: STDOUT and STDERR redirected to text files.");
|
||||
#endif /* DUMP_STDOUT */
|
||||
|
||||
_graphicsMutex = createMutex();
|
||||
|
||||
SDL_ShowCursor(SDL_DISABLE);
|
||||
|
||||
// Setup other defaults.
|
||||
|
||||
ConfMan.registerDefault("aspect_ratio", true);
|
||||
|
||||
/* Up default volume values as we use a seperate system level volume anyway. */
|
||||
|
@ -189,143 +119,47 @@ void OSystem_GP2X::initBackend() {
|
|||
ConfMan.registerDefault("speech_volume", 192);
|
||||
ConfMan.registerDefault("autosave_period", 3 * 60); // Trigger autosave every 3 minutes - On low batts 4 mins is about your warning time.
|
||||
|
||||
memset(&_oldVideoMode, 0, sizeof(_oldVideoMode));
|
||||
memset(&_videoMode, 0, sizeof(_videoMode));
|
||||
memset(&_transactionDetails, 0, sizeof(_transactionDetails));
|
||||
|
||||
_videoMode.mode = GFX_NORMAL;
|
||||
_videoMode.scaleFactor = 1;
|
||||
_scalerProc = Normal1x;
|
||||
_videoMode.aspectRatioCorrection = ConfMan.getBool("aspect_ratio");
|
||||
_scalerType = 0;
|
||||
_adjustZoomOnMouse = false;
|
||||
ConfMan.setBool("FM_low_quality", true);
|
||||
|
||||
// enable joystick
|
||||
if (joystick_num > -1 && SDL_NumJoysticks() > 0) {
|
||||
_joystick = SDL_JoystickOpen(joystick_num);
|
||||
}
|
||||
|
||||
_savefile = new DefaultSaveFileManager();
|
||||
// Create and hook up the mixer, if none exists yet (we check for this to
|
||||
// allow subclasses to provide their own).
|
||||
if (_mixer == 0) {
|
||||
setupMixer();
|
||||
}
|
||||
|
||||
// Create and hook up the timer manager, if none exists yet (we check for
|
||||
// this to allow subclasses to provide their own).
|
||||
if (_timer == 0) {
|
||||
// Note: We could implement a custom SDLTimerManager by using
|
||||
// SDL_AddTimer. That might yield better timer resolution, but it would
|
||||
// also change the semantics of a timer: Right now, ScummVM timers
|
||||
// *never* run in parallel, due to the way they are implemented. If we
|
||||
// switched to SDL_AddTimer, each timer might run in a separate thread.
|
||||
// However, not all our code is prepared for that, so we can't just
|
||||
// switch. Still, it's a potential future change to keep in mind.
|
||||
_timer = new DefaultTimerManager();
|
||||
_timerID = SDL_AddTimer(10, &timer_handler, _timer);
|
||||
}
|
||||
|
||||
/* Initialise any GP2X specific stuff we may want (Batt Status, scaler etc.) */
|
||||
GP2X_HW::deviceInit();
|
||||
|
||||
/* Set Default hardware mixer volume to a preset level (VOLUME_INITIAL). This is done to 'reset' volume level if set by other apps. */
|
||||
GP2X_HW::mixerMoveVolume(0);
|
||||
|
||||
OSystem::initBackend();
|
||||
// Create the events manager
|
||||
if (_eventManager == 0)
|
||||
_eventManager = new GP2XSdlEventManager(this);
|
||||
|
||||
_inited = true;
|
||||
// Create the graphics manager
|
||||
if (_graphicsManager == 0)
|
||||
_graphicsManager = new GP2XSdlGraphicsManager();
|
||||
|
||||
// Call parent implementation of this method
|
||||
OSystem_POSIX::initBackend();
|
||||
}
|
||||
|
||||
OSystem_GP2X::OSystem_GP2X()
|
||||
:
|
||||
_osdSurface(0), _osdAlpha(SDL_ALPHA_TRANSPARENT), _osdFadeStartTime(0),
|
||||
_hwscreen(0), _screen(0), _tmpscreen(0),
|
||||
_overlayVisible(false),
|
||||
_overlayscreen(0), _tmpscreen2(0),
|
||||
_scalerProc(0), _modeChanged(false), _screenChangeCount(0),
|
||||
_mouseVisible(false), _mouseNeedsRedraw(false), _mouseData(0), _mouseSurface(0),
|
||||
_mouseOrigSurface(0), _cursorTargetScale(1), _cursorPaletteDisabled(true),
|
||||
_joystick(0),
|
||||
_currentShakePos(0), _newShakePos(0),
|
||||
_paletteDirtyStart(0), _paletteDirtyEnd(0),
|
||||
#ifdef MIXER_DOUBLE_BUFFERING
|
||||
_soundMutex(0), _soundCond(0), _soundThread(0),
|
||||
_soundThreadIsRunning(false), _soundThreadShouldQuit(false),
|
||||
#endif
|
||||
_fsFactory(0),
|
||||
_savefile(0),
|
||||
_mixer(0),
|
||||
_timer(0),
|
||||
_screenIsLocked(false),
|
||||
_graphicsMutex(0), _transactionMode(kTransactionNone) {
|
||||
void OSystem_GP2X::initSDL() {
|
||||
// Check if SDL has not been initialized
|
||||
if (!_initedSDL) {
|
||||
uint32 sdlFlags = SDL_INIT_EVENTTHREAD;
|
||||
if (ConfMan.hasKey("disable_sdl_parachute"))
|
||||
sdlFlags |= SDL_INIT_NOPARACHUTE;
|
||||
|
||||
// allocate palette storage
|
||||
_currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256);
|
||||
_cursorPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256);
|
||||
// Initialize SDL (SDL Subsystems are initiliazed in the corresponding sdl managers)
|
||||
if (SDL_Init(sdlFlags) == -1)
|
||||
error("Could not initialize SDL: %s", SDL_GetError());
|
||||
|
||||
_mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0;
|
||||
// Enable unicode support if possible
|
||||
SDL_EnableUNICODE(1);
|
||||
|
||||
// reset mouse state
|
||||
memset(&_km, 0, sizeof(_km));
|
||||
memset(&_mouseCurState, 0, sizeof(_mouseCurState));
|
||||
|
||||
_inited = false;
|
||||
_fsFactory = new POSIXFilesystemFactory();
|
||||
}
|
||||
|
||||
OSystem_GP2X::~OSystem_GP2X() {
|
||||
SDL_RemoveTimer(_timerID);
|
||||
closeMixer();
|
||||
|
||||
free(_currentPalette);
|
||||
free(_cursorPalette);
|
||||
free(_mouseData);
|
||||
|
||||
delete _savefile;
|
||||
delete _timer;
|
||||
}
|
||||
|
||||
uint32 OSystem_GP2X::getMillis() {
|
||||
uint32 millis = SDL_GetTicks();
|
||||
g_eventRec.processMillis(millis);
|
||||
return millis;
|
||||
}
|
||||
|
||||
void OSystem_GP2X::delayMillis(uint msecs) {
|
||||
SDL_Delay(msecs);
|
||||
}
|
||||
|
||||
void OSystem_GP2X::getTimeAndDate(TimeDate &td) const {
|
||||
time_t curTime = time(0);
|
||||
struct tm t = *localtime(&curTime);
|
||||
td.tm_sec = t.tm_sec;
|
||||
td.tm_min = t.tm_min;
|
||||
td.tm_hour = t.tm_hour;
|
||||
td.tm_mday = t.tm_mday;
|
||||
td.tm_mon = t.tm_mon;
|
||||
td.tm_year = t.tm_year;
|
||||
}
|
||||
|
||||
Common::TimerManager *OSystem_GP2X::getTimerManager() {
|
||||
assert(_timer);
|
||||
return _timer;
|
||||
}
|
||||
|
||||
Common::SaveFileManager *OSystem_GP2X::getSavefileManager() {
|
||||
assert(_savefile);
|
||||
return _savefile;
|
||||
}
|
||||
|
||||
FilesystemFactory *OSystem_GP2X::getFilesystemFactory() {
|
||||
assert(_fsFactory);
|
||||
return _fsFactory;
|
||||
_initedSDL = true;
|
||||
}
|
||||
}
|
||||
|
||||
void OSystem_GP2X::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) {
|
||||
/* Setup default extra data paths for engine data files and plugins */
|
||||
char workDirName[PATH_MAX+1];
|
||||
char workDirName[PATH_MAX + 1];
|
||||
|
||||
if (getcwd(workDirName, PATH_MAX) == NULL) {
|
||||
error("Error: Could not obtain current working directory.");
|
||||
|
@ -357,283 +191,14 @@ void OSystem_GP2X::addSysArchivesToSearchSet(Common::SearchSet &s, int priority)
|
|||
}
|
||||
}
|
||||
|
||||
static Common::String getDefaultConfigFileName() {
|
||||
char configFile[MAXPATHLEN];
|
||||
strcpy(configFile, DEFAULT_CONFIG_FILE);
|
||||
return configFile;
|
||||
}
|
||||
|
||||
Common::SeekableReadStream *OSystem_GP2X::createConfigReadStream() {
|
||||
Common::FSNode file(getDefaultConfigFileName());
|
||||
return file.createReadStream();
|
||||
}
|
||||
|
||||
Common::WriteStream *OSystem_GP2X::createConfigWriteStream() {
|
||||
Common::FSNode file(getDefaultConfigFileName());
|
||||
return file.createWriteStream();
|
||||
}
|
||||
|
||||
bool OSystem_GP2X::hasFeature(Feature f) {
|
||||
return
|
||||
(f == kFeatureFullscreenMode) ||
|
||||
(f == kFeatureAspectRatioCorrection) ||
|
||||
(f == kFeatureCursorHasPalette);
|
||||
}
|
||||
|
||||
void OSystem_GP2X::setFeatureState(Feature f, bool enable) {
|
||||
switch (f) {
|
||||
case kFeatureFullscreenMode:
|
||||
return;
|
||||
case kFeatureAspectRatioCorrection:
|
||||
setAspectRatioCorrection(enable);
|
||||
break;
|
||||
case kFeatureDisableKeyFiltering:
|
||||
// TODO: Extend as more support for this is added to engines.
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool OSystem_GP2X::getFeatureState(Feature f) {
|
||||
assert (_transactionMode == kTransactionNone);
|
||||
|
||||
switch (f) {
|
||||
case kFeatureFullscreenMode:
|
||||
return false;
|
||||
case kFeatureAspectRatioCorrection:
|
||||
return _videoMode.aspectRatioCorrection;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void OSystem_GP2X::quit() {
|
||||
unloadGFXMode();
|
||||
deleteMutex(_graphicsMutex);
|
||||
|
||||
if (_joystick)
|
||||
SDL_JoystickClose(_joystick);
|
||||
GP2X_HW::deviceDeinit();
|
||||
|
||||
SDL_RemoveTimer(_timerID);
|
||||
closeMixer();
|
||||
|
||||
free(_currentPalette);
|
||||
free(_cursorPalette);
|
||||
free(_mouseData);
|
||||
|
||||
delete _timer;
|
||||
SDL_ShowCursor(SDL_ENABLE);
|
||||
SDL_Quit();
|
||||
|
||||
delete getEventManager();
|
||||
delete _savefile;
|
||||
|
||||
#ifdef DUMP_STDOUT
|
||||
printf("%s\n", "Debug: STDOUT and STDERR text files closed.");
|
||||
fclose(stdout);
|
||||
fclose(stderr);
|
||||
#endif /* DUMP_STDOUT */
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
OSystem::MutexRef OSystem_GP2X::createMutex(void) {
|
||||
return (MutexRef) SDL_CreateMutex();
|
||||
}
|
||||
|
||||
void OSystem_GP2X::lockMutex(MutexRef mutex) {
|
||||
SDL_mutexP((SDL_mutex *) mutex);
|
||||
}
|
||||
|
||||
void OSystem_GP2X::unlockMutex(MutexRef mutex) {
|
||||
SDL_mutexV((SDL_mutex *) mutex);
|
||||
}
|
||||
|
||||
void OSystem_GP2X::deleteMutex(MutexRef mutex) {
|
||||
SDL_DestroyMutex((SDL_mutex *) mutex);
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark --- Audio ---
|
||||
#pragma mark -
|
||||
|
||||
#ifdef MIXER_DOUBLE_BUFFERING
|
||||
|
||||
void OSystem_GP2X::mixerProducerThread() {
|
||||
byte nextSoundBuffer;
|
||||
|
||||
SDL_LockMutex(_soundMutex);
|
||||
while (true) {
|
||||
// Wait till we are allowed to produce data
|
||||
SDL_CondWait(_soundCond, _soundMutex);
|
||||
|
||||
if (_soundThreadShouldQuit)
|
||||
break;
|
||||
|
||||
// Generate samples and put them into the next buffer
|
||||
nextSoundBuffer = _activeSoundBuf ^ 1;
|
||||
_mixer->mixCallback(_soundBuffers[nextSoundBuffer], _soundBufSize);
|
||||
|
||||
// Swap buffers
|
||||
_activeSoundBuf = nextSoundBuffer;
|
||||
}
|
||||
SDL_UnlockMutex(_soundMutex);
|
||||
}
|
||||
|
||||
int SDLCALL OSystem_GP2X::mixerProducerThreadEntry(void *arg) {
|
||||
OSystem_GP2X *this_ = (OSystem_GP2X *)arg;
|
||||
assert(this_);
|
||||
this_->mixerProducerThread();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void OSystem_GP2X::initThreadedMixer(Audio::MixerImpl *mixer, uint bufSize) {
|
||||
_soundThreadIsRunning = false;
|
||||
_soundThreadShouldQuit = false;
|
||||
|
||||
// Create mutex and condition variable
|
||||
_soundMutex = SDL_CreateMutex();
|
||||
_soundCond = SDL_CreateCond();
|
||||
|
||||
// Create two sound buffers
|
||||
_activeSoundBuf = 0;
|
||||
_soundBufSize = bufSize;
|
||||
_soundBuffers[0] = (byte *)calloc(1, bufSize);
|
||||
_soundBuffers[1] = (byte *)calloc(1, bufSize);
|
||||
|
||||
_soundThreadIsRunning = true;
|
||||
|
||||
// Finally start the thread
|
||||
_soundThread = SDL_CreateThread(mixerProducerThreadEntry, this);
|
||||
}
|
||||
|
||||
void OSystem_GP2X::deinitThreadedMixer() {
|
||||
// Kill thread?? _soundThread
|
||||
|
||||
if (_soundThreadIsRunning) {
|
||||
// Signal the producer thread to end, and wait for it to actually finish.
|
||||
_soundThreadShouldQuit = true;
|
||||
SDL_CondBroadcast(_soundCond);
|
||||
SDL_WaitThread(_soundThread, NULL);
|
||||
|
||||
// Kill the mutex & cond variables.
|
||||
// Attention: AT this point, the mixer callback must not be running
|
||||
// anymore, else we will crash!
|
||||
SDL_DestroyMutex(_soundMutex);
|
||||
SDL_DestroyCond(_soundCond);
|
||||
|
||||
_soundThreadIsRunning = false;
|
||||
|
||||
free(_soundBuffers[0]);
|
||||
free(_soundBuffers[1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void OSystem_GP2X::mixCallback(void *arg, byte *samples, int len) {
|
||||
OSystem_GP2X *this_ = (OSystem_GP2X *)arg;
|
||||
assert(this_);
|
||||
assert(this_->_mixer);
|
||||
|
||||
assert((int)this_->_soundBufSize == len);
|
||||
|
||||
// Lock mutex, to ensure our data is not overwritten by the producer thread
|
||||
SDL_LockMutex(this_->_soundMutex);
|
||||
|
||||
// Copy data from the current sound buffer
|
||||
memcpy(samples, this_->_soundBuffers[this_->_activeSoundBuf], len);
|
||||
|
||||
// Unlock mutex and wake up the produced thread
|
||||
SDL_UnlockMutex(this_->_soundMutex);
|
||||
SDL_CondSignal(this_->_soundCond);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void OSystem_GP2X::mixCallback(void *sys, byte *samples, int len) {
|
||||
OSystem_GP2X *this_ = (OSystem_GP2X *)sys;
|
||||
assert(this_);
|
||||
assert(this_->_mixer);
|
||||
|
||||
this_->_mixer->mixCallback(samples, len);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void OSystem_GP2X::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.samples = 128; // Samples hack
|
||||
desired.callback = mixCallback;
|
||||
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;
|
||||
debug(1, "Output sample rate: %d Hz", samplesPerSec);
|
||||
|
||||
// Create the mixer instance and start the sound processing
|
||||
_mixer = new Audio::MixerImpl(this, samplesPerSec);
|
||||
assert(_mixer);
|
||||
_mixer->setReady(true);
|
||||
|
||||
#ifdef MIXER_DOUBLE_BUFFERING
|
||||
initThreadedMixer(_mixer, obtained.samples * 4);
|
||||
#endif
|
||||
|
||||
// start the sound system
|
||||
SDL_PauseAudio(0);
|
||||
}
|
||||
}
|
||||
|
||||
void OSystem_GP2X::closeMixer() {
|
||||
if (_mixer)
|
||||
_mixer->setReady(false);
|
||||
|
||||
SDL_CloseAudio();
|
||||
|
||||
delete _mixer;
|
||||
_mixer = 0;
|
||||
|
||||
#ifdef MIXER_DOUBLE_BUFFERING
|
||||
deinitThreadedMixer();
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
Audio::Mixer *OSystem_GP2X::getMixer() {
|
||||
assert(_mixer);
|
||||
return _mixer;
|
||||
OSystem_POSIX::quit();
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -2,10 +2,9 @@ MODULE := backends/platform/gp2x
|
|||
|
||||
MODULE_OBJS := \
|
||||
gp2x-hw.o \
|
||||
gp2x-main.o \
|
||||
gp2x-mem.o \
|
||||
events.o \
|
||||
graphics.o \
|
||||
gp2x.o \
|
||||
gp2x.o
|
||||
|
||||
MODULE_DIRS += \
|
||||
backends/platform/gp2x/
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include "backends/platform/gp2xwiz/gp2xwiz-hw.h"
|
||||
|
||||
#include "backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.h"
|
||||
#include "backends/events/gp2xwizsdl/gp2xwizsdl-events.h"
|
||||
#include "backends/events/gp2xsdl/gp2xsdl-events.h"
|
||||
#include "backends/saves/default/default-saves.h"
|
||||
|
||||
#include "common/config-manager.h"
|
||||
|
@ -133,7 +133,7 @@ void OSystem_GP2XWIZ::initBackend() {
|
|||
|
||||
// Create the events manager
|
||||
if (_eventManager == 0)
|
||||
_eventManager = new GP2XWIZSdlEventManager(this);
|
||||
_eventManager = new GP2XSdlEventManager(this);
|
||||
|
||||
// Create the graphics manager
|
||||
if (_graphicsManager == 0)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue