This commit contains the AudioCDManager changes from the gsoc2010-opengl branch. The other changes in that branch are restricted to the backends directory only (plus configure). The Nintendo DS and Dreamcast ports still need to be ported over to the new Audio CD system, but that should be fairly easy to do. svn-id: r54147
482 lines
13 KiB
C++
482 lines
13 KiB
C++
/* 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 SDL_COMMON_H
|
|
#define SDL_COMMON_H
|
|
|
|
#if defined(__SYMBIAN32__)
|
|
#include <esdl\SDL.h>
|
|
#else
|
|
#include <SDL.h>
|
|
#endif
|
|
|
|
#include "backends/base-backend.h"
|
|
#include "graphics/scaler.h"
|
|
|
|
|
|
namespace Audio {
|
|
class MixerImpl;
|
|
}
|
|
|
|
#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
|
|
// Uncomment this to enable the 'on screen display' code.
|
|
#define USE_OSD 1
|
|
#endif
|
|
|
|
#if defined(MACOSX)
|
|
// On Mac OS X, we need to double buffer the audio buffer, else anything
|
|
// which produces sampled data with high latency (like the MT-32 emulator)
|
|
// will sound terribly.
|
|
// This could be enabled for more / most ports in the future, but needs some
|
|
// testing.
|
|
#define MIXER_DOUBLE_BUFFERING 1
|
|
#endif
|
|
|
|
|
|
enum {
|
|
GFX_NORMAL = 0,
|
|
GFX_DOUBLESIZE = 1,
|
|
GFX_TRIPLESIZE = 2,
|
|
GFX_2XSAI = 3,
|
|
GFX_SUPER2XSAI = 4,
|
|
GFX_SUPEREAGLE = 5,
|
|
GFX_ADVMAME2X = 6,
|
|
GFX_ADVMAME3X = 7,
|
|
GFX_HQ2X = 8,
|
|
GFX_HQ3X = 9,
|
|
GFX_TV2X = 10,
|
|
GFX_DOTMATRIX = 11
|
|
};
|
|
|
|
class AspectRatio {
|
|
int _kw, _kh;
|
|
public:
|
|
AspectRatio() { _kw = _kh = 0; }
|
|
AspectRatio(int w, int h);
|
|
|
|
bool isAuto() const { return (_kw | _kh) == 0; }
|
|
|
|
int kw() const { return _kw; }
|
|
int kh() const { return _kh; }
|
|
};
|
|
|
|
|
|
class OSystem_SDL : public BaseBackend {
|
|
public:
|
|
OSystem_SDL();
|
|
virtual ~OSystem_SDL();
|
|
|
|
virtual void initBackend();
|
|
|
|
void beginGFXTransaction();
|
|
TransactionError endGFXTransaction();
|
|
|
|
#ifdef USE_RGB_COLOR
|
|
// Game screen
|
|
virtual Graphics::PixelFormat getScreenFormat() const { return _screenFormat; }
|
|
|
|
// Highest supported
|
|
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const;
|
|
#endif
|
|
|
|
// Set the size and format of the video bitmap.
|
|
// Typically, 320x200 CLUT8
|
|
virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format); // overloaded by CE backend
|
|
|
|
virtual 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
|
|
virtual void copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h); // overloaded by CE backend (FIXME)
|
|
|
|
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.
|
|
virtual void warpMouse(int x, int y); // overloaded by CE backend (FIXME)
|
|
|
|
// Set the bitmap that's used when drawing the cursor.
|
|
virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format); // overloaded by CE backend (FIXME)
|
|
|
|
// 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
|
|
|
|
protected:
|
|
virtual bool dispatchSDLEvent(SDL_Event &ev, Common::Event &event);
|
|
|
|
// Handlers for specific SDL events, called by pollEvent.
|
|
// This way, if a backend inherits fromt the SDL backend, it can
|
|
// change the behavior of only a single event, without having to override all
|
|
// of pollEvent.
|
|
virtual bool handleKeyDown(SDL_Event &ev, Common::Event &event);
|
|
virtual bool handleKeyUp(SDL_Event &ev, Common::Event &event);
|
|
virtual bool handleMouseMotion(SDL_Event &ev, Common::Event &event);
|
|
virtual bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event);
|
|
virtual bool handleMouseButtonUp(SDL_Event &ev, Common::Event &event);
|
|
virtual bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event);
|
|
virtual bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event);
|
|
virtual bool handleJoyAxisMotion(SDL_Event &ev, Common::Event &event);
|
|
|
|
public:
|
|
|
|
|
|
// Define all hardware keys for keymapper
|
|
virtual Common::HardwareKeySet *getHardwareKeySet();
|
|
|
|
// Set function that generates samples
|
|
virtual void setupMixer();
|
|
static void mixCallback(void *s, byte *samples, int len);
|
|
|
|
virtual void closeMixer();
|
|
|
|
virtual Audio::Mixer *getMixer();
|
|
|
|
virtual AudioCDManager *getAudioCDManager();
|
|
|
|
// Quit
|
|
virtual void quit(); // overloaded by CE backend
|
|
|
|
void deinit();
|
|
|
|
virtual 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
|
|
virtual Graphics::PixelFormat getOverlayFormat() const { return _overlayFormat; }
|
|
|
|
virtual void showOverlay();
|
|
virtual void hideOverlay();
|
|
virtual void clearOverlay();
|
|
virtual void grabOverlay(OverlayColor *buf, int pitch);
|
|
virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h);
|
|
virtual int16 getHeight();
|
|
virtual int16 getWidth();
|
|
virtual int16 getOverlayHeight() { return _videoMode.overlayHeight; }
|
|
virtual int16 getOverlayWidth() { return _videoMode.overlayWidth; }
|
|
|
|
virtual const GraphicsMode *getSupportedGraphicsModes() const;
|
|
virtual int getDefaultGraphicsMode() const;
|
|
virtual bool setGraphicsMode(int mode);
|
|
virtual int getGraphicsMode() const;
|
|
|
|
virtual void setWindowCaption(const char *caption);
|
|
|
|
virtual bool hasFeature(Feature f);
|
|
virtual void setFeatureState(Feature f, bool enable);
|
|
virtual bool getFeatureState(Feature f);
|
|
virtual void preprocessEvents(SDL_Event *event) {}
|
|
|
|
#ifdef USE_OSD
|
|
void displayMessageOnOSD(const char *msg);
|
|
#endif
|
|
|
|
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_AudioSpec _obtainedRate;
|
|
|
|
#ifdef USE_OSD
|
|
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
|
|
};
|
|
#endif
|
|
|
|
// hardware screen
|
|
SDL_Surface *_hwscreen;
|
|
|
|
// unseen game screen
|
|
SDL_Surface *_screen;
|
|
#ifdef USE_RGB_COLOR
|
|
Graphics::PixelFormat _screenFormat;
|
|
Graphics::PixelFormat _cursorFormat;
|
|
Common::List<Graphics::PixelFormat> _supportedFormats;
|
|
|
|
/**
|
|
* Update the list of supported pixel formats.
|
|
* This method is invoked by loadGFXMode().
|
|
*/
|
|
void detectSupportedFormats();
|
|
#endif
|
|
|
|
// temporary screen (for scalers)
|
|
SDL_Surface *_tmpscreen;
|
|
SDL_Surface *_tmpscreen2;
|
|
|
|
// overlay
|
|
SDL_Surface *_overlayscreen;
|
|
bool _overlayVisible;
|
|
Graphics::PixelFormat _overlayFormat;
|
|
|
|
// CD Audio
|
|
SDL_CD *_cdrom;
|
|
int _cdTrack, _cdNumLoops, _cdStartFrame, _cdDuration;
|
|
uint32 _cdEndTime, _cdStopTime;
|
|
|
|
enum {
|
|
kTransactionNone = 0,
|
|
kTransactionActive = 1,
|
|
kTransactionRollback = 2
|
|
};
|
|
|
|
struct TransactionDetails {
|
|
bool sizeChanged;
|
|
bool needHotswap;
|
|
bool needUpdatescreen;
|
|
bool normal1xScaler;
|
|
#ifdef USE_RGB_COLOR
|
|
bool formatChanged;
|
|
#endif
|
|
};
|
|
TransactionDetails _transactionDetails;
|
|
|
|
struct VideoState {
|
|
bool setup;
|
|
|
|
bool fullscreen;
|
|
bool aspectRatioCorrection;
|
|
AspectRatio desiredAspectRatio;
|
|
|
|
int mode;
|
|
int scaleFactor;
|
|
|
|
int screenWidth, screenHeight;
|
|
int overlayWidth, overlayHeight;
|
|
int hardwareWidth, hardwareHeight;
|
|
#ifdef USE_RGB_COLOR
|
|
Graphics::PixelFormat format;
|
|
#endif
|
|
};
|
|
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;
|
|
|
|
enum {
|
|
NUM_DIRTY_RECT = 100,
|
|
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;
|
|
#ifdef USE_RGB_COLOR
|
|
uint32 _mouseKeyColor;
|
|
#else
|
|
byte _mouseKeyColor;
|
|
#endif
|
|
int _cursorTargetScale;
|
|
bool _cursorPaletteDisabled;
|
|
SDL_Surface *_mouseOrigSurface;
|
|
SDL_Surface *_mouseSurface;
|
|
enum {
|
|
kMouseColorKey = 1
|
|
};
|
|
|
|
// Scroll lock state - since SDL doesn't track it
|
|
bool _scrollLock;
|
|
|
|
// joystick
|
|
SDL_Joystick *_joystick;
|
|
|
|
// Shake mode
|
|
int _currentShakePos;
|
|
int _newShakePos;
|
|
|
|
// Palette data
|
|
SDL_Color _currentPalette[256];
|
|
uint _paletteDirtyStart, _paletteDirtyEnd;
|
|
|
|
// Cursor palette data
|
|
SDL_Color _cursorPalette[256];
|
|
|
|
/**
|
|
* 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();
|
|
#endif
|
|
|
|
FilesystemFactory *_fsFactory;
|
|
Common::SaveFileManager *_savefile;
|
|
Audio::MixerImpl *_mixer;
|
|
|
|
SDL_TimerID _timerID;
|
|
Common::TimerManager *_timer;
|
|
|
|
protected:
|
|
virtual void addDirtyRect(int x, int y, int w, int h, bool realCoordinates = false); // overloaded by CE backend
|
|
|
|
virtual void drawMouse(); // overloaded by CE backend
|
|
virtual void undrawMouse(); // overloaded by CE backend (FIXME)
|
|
virtual void blitCursor(); // overloaded by CE backend (FIXME)
|
|
|
|
/** Set the position of the virtual mouse cursor. */
|
|
void setMousePos(int x, int y);
|
|
virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend
|
|
void toggleMouseGrab();
|
|
|
|
virtual void internUpdateScreen(); // overloaded by CE backend
|
|
|
|
virtual bool loadGFXMode(); // overloaded by CE backend
|
|
virtual void unloadGFXMode(); // overloaded by CE backend
|
|
virtual bool hotswapGFXMode(); // overloaded by CE backend
|
|
|
|
void setFullscreenMode(bool enable);
|
|
void setAspectRatioCorrection(bool enable);
|
|
|
|
virtual bool saveScreenshot(const char *filename); // overloaded by CE backend
|
|
|
|
int effectiveScreenHeight() const;
|
|
|
|
void setupIcon();
|
|
void handleKbdMouse();
|
|
|
|
virtual bool remapKey(SDL_Event &ev, Common::Event &event);
|
|
|
|
bool handleScalerHotkeys(const SDL_KeyboardEvent &key);
|
|
bool isScalerHotkey(const Common::Event &event);
|
|
};
|
|
|
|
#endif
|