diff options
43 files changed, 556 insertions, 381 deletions
diff --git a/backends/audiocd/audiocd.h b/backends/audiocd/audiocd.h new file mode 100644 index 0000000000..f218db7f72 --- /dev/null +++ b/backends/audiocd/audiocd.h @@ -0,0 +1,148 @@ +/* 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_AUDIOCD_ABSTRACT_H +#define BACKENDS_AUDIOCD_ABSTRACT_H + +#include "common/scummsys.h" +#include "common/noncopyable.h" + +/** +* Abstract Audio CD manager class. Subclasses implement the actual +* functionality. +*/ +class AudioCDManager : Common::NonCopyable { +public: + virtual ~AudioCDManager() {} + + /** + * A structure containing the current playback information + */ + struct Status { + bool playing; + int track; + int start; + int duration; + int numLoops; + int volume; + int balance; + }; + + /** + * @name Emulated playback functions + * Engines should call these functions. Not all platforms + * support cd playback, and these functions should try to + * emulate it. + */ + //@{ + + /** + * Start audio CD playback + * @param track the track to play. + * @param num_loops how often playback should be repeated (-1 = infinitely often). + * @param start_frame the frame at which playback should start (75 frames = 1 second). + * @param duration the number of frames to play. + * @param only_emulate determines if the track should be emulated only + */ + virtual void play(int track, int numLoops, int startFrame, int duration, bool only_emulate = false) = 0; + + /** + * Get if audio is being played. + * @return true if CD or emulated audio is playing + */ + virtual bool isPlaying() const = 0; + + /** + * Set the audio volume + */ + virtual void setVolume(byte volume) = 0; + + /** + * Set the speakers balance + */ + virtual void setBalance(int8 balance) = 0; + + /** + * Stop CD or emulated audio playback. + */ + virtual void stop() = 0; + + /** + * Update CD or emulated audio status. + */ + virtual void update() = 0; + + /** + * Get the playback status. + * @return a Status struct with playback data. + */ + virtual Status getStatus() const = 0; + + //@} + + + /** + * @name Real CD audio methods + * These functions should be called from the emulated + * ones if they can't emulate the audio playback. + */ + //@{ + + /** + * Initialise the specified CD drive for audio playback. + * @param drive the drive id + * @return true if the CD drive was inited succesfully + */ + virtual bool openCD(int drive) = 0; + + /** + * Poll CD status. + * @return true if CD audio is playing + */ + virtual bool pollCD() const = 0; + + /** + * Start CD audio playback. + * @param track the track to play. + * @param num_loops how often playback should be repeated (-1 = infinitely often). + * @param start_frame the frame at which playback should start (75 frames = 1 second). + * @param duration the number of frames to play. + */ + virtual void playCD(int track, int num_loops, int start_frame, int duration) = 0; + + /** + * Stop CD audio playback. + */ + virtual void stopCD() = 0; + + /** + * Update CD audio status. + */ + virtual void updateCD() = 0; + + //@} +}; + +#endif diff --git a/sound/audiocd.cpp b/backends/audiocd/default/default-audiocd.cpp index f1288131fa..6d16b26652 100644 --- a/sound/audiocd.cpp +++ b/backends/audiocd/default/default-audiocd.cpp @@ -23,33 +23,24 @@ * */ -#include "sound/audiocd.h" +#include "backends/audiocd/default/default-audiocd.h" #include "sound/audiostream.h" -#include "sound/decoders/mp3.h" -#include "sound/decoders/vorbis.h" -#include "sound/decoders/flac.h" -#include "engines/engine.h" -#include "common/util.h" #include "common/system.h" -DECLARE_SINGLETON(Audio::AudioCDManager) - -namespace Audio { - -AudioCDManager::AudioCDManager() { +DefaultAudioCDManager::DefaultAudioCDManager() { _cd.playing = false; _cd.track = 0; _cd.start = 0; _cd.duration = 0; _cd.numLoops = 0; - _cd.volume = Mixer::kMaxChannelVolume; + _cd.volume = Audio::Mixer::kMaxChannelVolume; _cd.balance = 0; _mixer = g_system->getMixer(); _emulating = false; assert(_mixer); } -void AudioCDManager::play(int track, int numLoops, int startFrame, int duration, bool only_emulate) { +void DefaultAudioCDManager::play(int track, int numLoops, int startFrame, int duration, bool only_emulate) { if (numLoops != 0 || startFrame != 0) { _cd.track = track; _cd.numLoops = numLoops; @@ -65,14 +56,14 @@ void AudioCDManager::play(int track, int numLoops, int startFrame, int duration, Audio::SeekableAudioStream *stream = 0; for (int i = 0; !stream && i < 2; ++i) - stream = SeekableAudioStream::openStreamFile(trackName[i]); + stream = Audio::SeekableAudioStream::openStreamFile(trackName[i]); // Stop any currently playing emulated track _mixer->stopHandle(_handle); if (stream != 0) { - Timestamp start = Timestamp(0, startFrame, 75); - Timestamp end = duration ? Timestamp(0, startFrame + duration, 75) : stream->getLength(); + Audio::Timestamp start = Audio::Timestamp(0, startFrame, 75); + Audio::Timestamp end = duration ? Audio::Timestamp(0, startFrame + duration, 75) : stream->getLength(); /* FIXME: Seems numLoops == 0 and numLoops == 1 both indicate a single repetition, @@ -80,39 +71,38 @@ void AudioCDManager::play(int track, int numLoops, int startFrame, int duration, repetitions. Finally, -1 means infinitely many */ _emulating = true; - _mixer->playStream(Mixer::kMusicSoundType, &_handle, - makeLoopingAudioStream(stream, start, end, (numLoops < 1) ? numLoops + 1 : numLoops), -1, _cd.volume, _cd.balance); - + _mixer->playStream(Audio::Mixer::kMusicSoundType, &_handle, + Audio::makeLoopingAudioStream(stream, start, end, (numLoops < 1) ? numLoops + 1 : numLoops), -1, _cd.volume, _cd.balance); } else { _emulating = false; if (!only_emulate) - g_system->playCD(track, numLoops, startFrame, duration); + playCD(track, numLoops, startFrame, duration); } } } -void AudioCDManager::stop() { +void DefaultAudioCDManager::stop() { if (_emulating) { // Audio CD emulation _mixer->stopHandle(_handle); _emulating = false; } else { // Real Audio CD - g_system->stopCD(); + stopCD(); } } -bool AudioCDManager::isPlaying() const { +bool DefaultAudioCDManager::isPlaying() const { if (_emulating) { // Audio CD emulation return _mixer->isSoundHandleActive(_handle); } else { // Real Audio CD - return g_system->pollCD(); + return pollCD(); } } -void AudioCDManager::setVolume(byte volume) { +void DefaultAudioCDManager::setVolume(byte volume) { _cd.volume = volume; if (_emulating) { // Audio CD emulation @@ -128,7 +118,7 @@ void AudioCDManager::setVolume(byte volume) { } } -void AudioCDManager::setBalance(int8 balance) { +void DefaultAudioCDManager::setBalance(int8 balance) { _cd.balance = balance; if (_emulating) { // Audio CD emulation @@ -144,7 +134,7 @@ void AudioCDManager::setBalance(int8 balance) { } } -void AudioCDManager::updateCD() { +void DefaultAudioCDManager::update() { if (_emulating) { // Check whether the audio track stopped playback if (!_mixer->isSoundHandleActive(_handle)) { @@ -156,16 +146,12 @@ void AudioCDManager::updateCD() { _emulating = false; } } else { - g_system->updateCD(); + updateCD(); } } -AudioCDManager::Status AudioCDManager::getStatus() const { - // TODO: This could be improved for "real" CD playback. - // But to do that, we would have to extend the OSystem interface. +DefaultAudioCDManager::Status DefaultAudioCDManager::getStatus() const { Status info = _cd; info.playing = isPlaying(); return info; } - -} // End of namespace Audio diff --git a/backends/audiocd/default/default-audiocd.h b/backends/audiocd/default/default-audiocd.h new file mode 100644 index 0000000000..3f9df0bbbb --- /dev/null +++ b/backends/audiocd/default/default-audiocd.h @@ -0,0 +1,62 @@ +/* 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_AUDIOCD_DEFAULT_H +#define BACKENDS_AUDIOCD_DEFAULT_H + +#include "backends/audiocd/audiocd.h" +#include "sound/mixer.h" + +/** + * The default audio cd manager. Implements emulation of audio cd playback. + */ +class DefaultAudioCDManager : public AudioCDManager { +public: + DefaultAudioCDManager(); + virtual ~DefaultAudioCDManager() {} + + void play(int track, int numLoops, int startFrame, int duration, bool only_emulate = false); + void stop(); + bool isPlaying() const; + void setVolume(byte volume); + void setBalance(int8 balance); + void update(); + virtual Status getStatus() const; // Subclasses should override for better status results + + virtual bool openCD(int drive) { return false; } + virtual void updateCD() {} + virtual bool pollCD() const { return false; } + virtual void playCD(int track, int num_loops, int start_frame, int duration) {} + virtual void stopCD() {} + +protected: + Audio::SoundHandle _handle; + bool _emulating; + + Status _cd; + Audio::Mixer *_mixer; +}; + +#endif diff --git a/backends/audiocd/sdl/sdl-audiocd.cpp b/backends/audiocd/sdl/sdl-audiocd.cpp new file mode 100644 index 0000000000..62ab333f54 --- /dev/null +++ b/backends/audiocd/sdl/sdl-audiocd.cpp @@ -0,0 +1,139 @@ +/* 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$ + * + */ + +#if defined(SDL_BACKEND) + +// Disable symbol overrides so that we can use system headers. +#define FORBIDDEN_SYMBOL_ALLOW_ALL + +#include "backends/audiocd/sdl/sdl-audiocd.h" + +SdlAudioCDManager::SdlAudioCDManager() + : + _cdrom(0), + _cdTrack(0), + _cdNumLoops(0), + _cdStartFrame(0), + _cdDuration(0), + _cdEndTime(0), + _cdStopTime(0) { + +} + +SdlAudioCDManager::~SdlAudioCDManager() { + if (_cdrom) { + SDL_CDStop(_cdrom); + SDL_CDClose(_cdrom); + } +} + +bool SdlAudioCDManager::openCD(int drive) { + if (SDL_InitSubSystem(SDL_INIT_CDROM) == -1) + _cdrom = NULL; + else { + _cdrom = SDL_CDOpen(drive); + // Did it open? Check if _cdrom is NULL + if (!_cdrom) { + warning("Couldn't open drive: %s", SDL_GetError()); + } else { + _cdNumLoops = 0; + _cdStopTime = 0; + _cdEndTime = 0; + } + } + + return (_cdrom != NULL); +} + +void SdlAudioCDManager::stopCD() { + // Stop CD Audio in 1/10th of a second + _cdStopTime = SDL_GetTicks() + 100; + _cdNumLoops = 0; +} + +void SdlAudioCDManager::playCD(int track, int num_loops, int start_frame, int duration) { + if (!num_loops && !start_frame) + return; + + if (!_cdrom) + return; + + if (duration > 0) + duration += 5; + + _cdTrack = track; + _cdNumLoops = num_loops; + _cdStartFrame = start_frame; + + SDL_CDStatus(_cdrom); + if (start_frame == 0 && duration == 0) + SDL_CDPlayTracks(_cdrom, track, 0, 1, 0); + else + SDL_CDPlayTracks(_cdrom, track, start_frame, 0, duration); + _cdDuration = duration; + _cdStopTime = 0; + _cdEndTime = SDL_GetTicks() + _cdrom->track[track].length * 1000 / CD_FPS; +} + +bool SdlAudioCDManager::pollCD() const { + if (!_cdrom) + return false; + + return (_cdNumLoops != 0 && (SDL_GetTicks() < _cdEndTime || SDL_CDStatus(_cdrom) == CD_PLAYING)); +} + +void SdlAudioCDManager::updateCD() { + if (!_cdrom) + return; + + if (_cdStopTime != 0 && SDL_GetTicks() >= _cdStopTime) { + SDL_CDStop(_cdrom); + _cdNumLoops = 0; + _cdStopTime = 0; + return; + } + + if (_cdNumLoops == 0 || SDL_GetTicks() < _cdEndTime) + return; + + if (_cdNumLoops != 1 && SDL_CDStatus(_cdrom) != CD_STOPPED) { + // Wait another second for it to be done + _cdEndTime += 1000; + return; + } + + if (_cdNumLoops > 0) + _cdNumLoops--; + + if (_cdNumLoops != 0) { + if (_cdStartFrame == 0 && _cdDuration == 0) + SDL_CDPlayTracks(_cdrom, _cdTrack, 0, 1, 0); + else + SDL_CDPlayTracks(_cdrom, _cdTrack, _cdStartFrame, 0, _cdDuration); + _cdEndTime = SDL_GetTicks() + _cdrom->track[_cdTrack].length * 1000 / CD_FPS; + } +} + +#endif diff --git a/backends/audiocd/sdl/sdl-audiocd.h b/backends/audiocd/sdl/sdl-audiocd.h new file mode 100644 index 0000000000..42ac980c51 --- /dev/null +++ b/backends/audiocd/sdl/sdl-audiocd.h @@ -0,0 +1,57 @@ +/* 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_AUDIOCD_SDL_H +#define BACKENDS_AUDIOCD_SDL_H + +#include "backends/audiocd/default/default-audiocd.h" + +#if defined(__SYMBIAN32__) +#include <esdl\SDL.h> +#else +#include <SDL.h> +#endif + +/** + * The SDL audio cd manager. Implements real audio cd playback. + */ +class SdlAudioCDManager : public DefaultAudioCDManager { +public: + SdlAudioCDManager(); + virtual ~SdlAudioCDManager(); + +protected: + virtual bool openCD(int drive); + virtual void updateCD(); + virtual bool pollCD() const; + virtual void playCD(int track, int num_loops, int start_frame, int duration); + virtual void stopCD(); + + SDL_CD *_cdrom; + int _cdTrack, _cdNumLoops, _cdStartFrame, _cdDuration; + uint32 _cdEndTime, _cdStopTime; +}; + +#endif diff --git a/backends/base-backend.cpp b/backends/base-backend.cpp index c06695a727..42ab7b887a 100644 --- a/backends/base-backend.cpp +++ b/backends/base-backend.cpp @@ -25,6 +25,7 @@ #include "backends/base-backend.h" #include "backends/events/default/default-events.h" +#include "backends/audiocd/default/default-audiocd.h" #include "gui/message.h" void BaseBackend::displayMessageOnOSD(const char *msg) { @@ -71,6 +72,14 @@ void BaseBackend::fillScreen(uint32 col) { #define DEFAULT_CONFIG_FILE "scummvm.ini" #endif +BaseBackend::BaseBackend() { + _audiocdManager = 0; +} + +BaseBackend::~BaseBackend() { + delete _audiocdManager; +} + Common::SeekableReadStream *BaseBackend::createConfigReadStream() { Common::FSNode file(DEFAULT_CONFIG_FILE); return file.createReadStream(); @@ -84,3 +93,15 @@ Common::WriteStream *BaseBackend::createConfigWriteStream() { return file.createWriteStream(); #endif } + +AudioCDManager *BaseBackend::getAudioCDManager() { + if (!_audiocdManager) + _audiocdManager = new DefaultAudioCDManager(); + return _audiocdManager; +} + +void BaseBackend::resetGraphicsScale() { + // As a hack, we use 0 here. Backends should override this method + // and provide their own. + setGraphicsMode(0); +} diff --git a/backends/base-backend.h b/backends/base-backend.h index 3fcca9c3b7..de94d85523 100644 --- a/backends/base-backend.h +++ b/backends/base-backend.h @@ -31,12 +31,22 @@ class BaseBackend : public OSystem, Common::EventSource { public: + BaseBackend(); + ~BaseBackend(); + virtual Common::EventManager *getEventManager(); virtual void displayMessageOnOSD(const char *msg); virtual void fillScreen(uint32 col); virtual Common::SeekableReadStream *createConfigReadStream(); virtual Common::WriteStream *createConfigWriteStream(); + + virtual AudioCDManager *getAudioCDManager(); + + virtual void resetGraphicsScale(); + +protected: + AudioCDManager *_audiocdManager; }; diff --git a/backends/module.mk b/backends/module.mk index 6c5a9a71cd..db03e803d8 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -2,6 +2,8 @@ MODULE := backends MODULE_OBJS := \ base-backend.o \ + audiocd/default/default-audiocd.o \ + audiocd/sdl/sdl-audiocd.o \ events/default/default-events.o \ fs/abstract-fs.o \ fs/stdiostream.o \ diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 8725a7df8a..2e3819f6f5 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -45,6 +45,7 @@ #else #include "backends/saves/default/default-saves.h" #endif +#include "backends/audiocd/sdl/sdl-audiocd.h" #include "backends/timer/default/default-timer.h" #include "sound/mixer_intern.h" @@ -814,88 +815,8 @@ Audio::Mixer *OSystem_SDL::getMixer() { #pragma mark --- CD Audio --- #pragma mark - -bool OSystem_SDL::openCD(int drive) { - if (SDL_InitSubSystem(SDL_INIT_CDROM) == -1) - _cdrom = NULL; - else { - _cdrom = SDL_CDOpen(drive); - // Did it open? Check if _cdrom is NULL - if (!_cdrom) { - warning("Couldn't open drive: %s", SDL_GetError()); - } else { - _cdNumLoops = 0; - _cdStopTime = 0; - _cdEndTime = 0; - } - } - - return (_cdrom != NULL); -} - -void OSystem_SDL::stopCD() { /* Stop CD Audio in 1/10th of a second */ - _cdStopTime = SDL_GetTicks() + 100; - _cdNumLoops = 0; -} - -void OSystem_SDL::playCD(int track, int num_loops, int start_frame, int duration) { - if (!num_loops && !start_frame) - return; - - if (!_cdrom) - return; - - if (duration > 0) - duration += 5; - - _cdTrack = track; - _cdNumLoops = num_loops; - _cdStartFrame = start_frame; - - SDL_CDStatus(_cdrom); - if (start_frame == 0 && duration == 0) - SDL_CDPlayTracks(_cdrom, track, 0, 1, 0); - else - SDL_CDPlayTracks(_cdrom, track, start_frame, 0, duration); - _cdDuration = duration; - _cdStopTime = 0; - _cdEndTime = SDL_GetTicks() + _cdrom->track[track].length * 1000 / CD_FPS; -} - -bool OSystem_SDL::pollCD() { - if (!_cdrom) - return false; - - return (_cdNumLoops != 0 && (SDL_GetTicks() < _cdEndTime || SDL_CDStatus(_cdrom) == CD_PLAYING)); -} - -void OSystem_SDL::updateCD() { - if (!_cdrom) - return; - - if (_cdStopTime != 0 && SDL_GetTicks() >= _cdStopTime) { - SDL_CDStop(_cdrom); - _cdNumLoops = 0; - _cdStopTime = 0; - return; - } - - if (_cdNumLoops == 0 || SDL_GetTicks() < _cdEndTime) - return; - - if (_cdNumLoops != 1 && SDL_CDStatus(_cdrom) != CD_STOPPED) { - // Wait another second for it to be done - _cdEndTime += 1000; - return; - } - - if (_cdNumLoops > 0) - _cdNumLoops--; - - if (_cdNumLoops != 0) { - if (_cdStartFrame == 0 && _cdDuration == 0) - SDL_CDPlayTracks(_cdrom, _cdTrack, 0, 1, 0); - else - SDL_CDPlayTracks(_cdrom, _cdTrack, _cdStartFrame, 0, _cdDuration); - _cdEndTime = SDL_GetTicks() + _cdrom->track[_cdTrack].length * 1000 / CD_FPS; - } +AudioCDManager *OSystem_SDL::getAudioCDManager() { + if (!_audiocdManager) + _audiocdManager = new SdlAudioCDManager(); + return _audiocdManager; } diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index e7f9a06d80..b701824517 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -186,18 +186,7 @@ public: virtual Audio::Mixer *getMixer(); - // Poll CD status - // Returns true if cd audio is playing - bool pollCD(); - - // Play CD audio track - void playCD(int track, int num_loops, int start_frame, int duration); - - // Stop CD audio track - void stopCD(); - - // Update CD audio status - void updateCD(); + virtual AudioCDManager *getAudioCDManager(); // Quit virtual void quit(); // overloaded by CE backend @@ -232,7 +221,6 @@ public: virtual int getGraphicsMode() const; virtual void setWindowCaption(const char *caption); - virtual bool openCD(int drive); virtual bool hasFeature(Feature f); virtual void setFeatureState(Feature f, bool enable); diff --git a/base/main.cpp b/base/main.cpp index a32589e701..3e4af53065 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -53,7 +53,6 @@ #include "gui/message.h" #include "gui/error.h" -#include "sound/audiocd.h" #include "sound/mididrv.h" #include "backends/keymapper/keymapper.h" @@ -444,15 +443,6 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { GUI::displayErrorDialog(_("Could not find any engine capable of running the selected game")); } - // We will destroy the AudioCDManager singleton here to save some memory. - // This will not make the CD audio stop, one would have to enable this: - //AudioCD.stop(); - // but the engine is responsible for stopping CD playback anyway and - // this way we catch engines not doing it properly. For some more - // information about why AudioCDManager::destroy does not stop the CD - // playback read the FIXME in sound/audiocd.h - Audio::AudioCDManager::destroy(); - // reset the graphics to default setupGraphics(system); launcherDialog(); diff --git a/common/system.cpp b/common/system.cpp index 387e0dfa0f..816d444c89 100644 --- a/common/system.cpp +++ b/common/system.cpp @@ -53,11 +53,3 @@ bool OSystem::setGraphicsMode(const char *name) { return false; } - -bool OSystem::openCD(int drive) { - return false; -} - -bool OSystem::pollCD() { - return false; -} diff --git a/common/system.h b/common/system.h index 0ff841e441..a11adb4134 100644 --- a/common/system.h +++ b/common/system.h @@ -33,6 +33,8 @@ #include "graphics/pixelformat.h" +#include "backends/audiocd/audiocd.h" + namespace Audio { class Mixer; } @@ -354,6 +356,13 @@ public: */ virtual int getGraphicsMode() const = 0; + /** + * Sets the graphics scale factor to x1. Games with large screen sizes + * reset the scale to x1 so the screen will not be too big when starting + * the game. + */ + virtual void resetGraphicsScale() = 0; + #ifdef USE_RGB_COLOR /** * Determine the pixel format currently in use for screen rendering. @@ -926,46 +935,14 @@ public: - /** - * @name Audio CD - * The methods in this group deal with Audio CD playback. - * The default implementation simply does nothing. - * This is the lower level implementation as provided by the - * backends. The engines should use the Audio::AudioCDManager - * class instead of using it directly. - */ + /** @name Audio CD */ //@{ /** - * Initialise the specified CD drive for audio playback. - * @return true if the CD drive was inited succesfully - */ - virtual bool openCD(int drive); - - /** - * Poll CD status. - * @return true if CD audio is playing - */ - virtual bool pollCD(); - - /** - * Start audio CD playback. - * @param track the track to play. - * @param num_loops how often playback should be repeated (-1 = infinitely often). - * @param start_frame the frame at which playback should start (75 frames = 1 second). - * @param duration the number of frames to play. - */ - virtual void playCD(int track, int num_loops, int start_frame, int duration) {} - - /** - * Stop audio CD playback. - */ - virtual void stopCD() {} - - /** - * Update cdrom audio status. + * Return the audio cd manager. For more information, refer to the + * AudioCDManager documentation. */ - virtual void updateCD() {} + virtual AudioCDManager *getAudioCDManager() = 0; //@} diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index a51536381e..68fa521178 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -41,7 +41,6 @@ #include "sound/mididrv.h" #include "sound/mods/protracker.h" -#include "sound/audiocd.h" namespace AGOS { @@ -901,7 +900,7 @@ AGOSEngine::~AGOSEngine() { _midi.close(); delete _driver; - AudioCD.stop(); + _system->getAudioCDManager()->stop(); for (uint i = 0; i < _itemHeap.size(); i++) { delete[] _itemHeap[i]; diff --git a/engines/agos/event.cpp b/engines/agos/event.cpp index 95c9db906a..2f7fdb6256 100644 --- a/engines/agos/event.cpp +++ b/engines/agos/event.cpp @@ -36,7 +36,6 @@ #include "graphics/surface.h" -#include "sound/audiocd.h" namespace AGOS { @@ -429,7 +428,7 @@ void AGOSEngine::delay(uint amount) { uint32 cur = start; uint this_delay, vgaPeriod; - AudioCD.updateCD(); + _system->getAudioCDManager()->updateCD(); _debugger->onFrame(); @@ -534,7 +533,7 @@ void AGOSEngine::delay(uint amount) { if (_leftButton == 1) _leftButtonCount++; - AudioCD.updateCD(); + _system->getAudioCDManager()->updateCD(); _system->updateScreen(); diff --git a/engines/agos/res_snd.cpp b/engines/agos/res_snd.cpp index b4c1455c10..29a4242970 100644 --- a/engines/agos/res_snd.cpp +++ b/engines/agos/res_snd.cpp @@ -30,7 +30,6 @@ #include "agos/agos.h" #include "agos/vga.h" -#include "sound/audiocd.h" #include "sound/audiostream.h" #include "sound/mididrv.h" #include "sound/mods/protracker.h" @@ -226,9 +225,9 @@ void AGOSEngine_Simon1::playMusic(uint16 music, uint16 track) { stopMusic(); // Support for compressed music from the ScummVM Music Enhancement Project - AudioCD.stop(); - AudioCD.play(music + 1, -1, 0, 0); - if (AudioCD.isPlaying()) + _system->getAudioCDManager()->stop(); + _system->getAudioCDManager()->play(music + 1, -1, 0, 0); + if (_system->getAudioCDManager()->isPlaying()) return; if (getPlatform() == Common::kPlatformAmiga) { diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index 7e9f68a355..7c87f3574d 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -101,7 +101,7 @@ DrasculaEngine::DrasculaEngine(OSystem *syst, const DrasculaGameDescription *gam int cd_num = ConfMan.getInt("cdrom"); if (cd_num >= 0) - _system->openCD(cd_num); + _system->getAudioCDManager()->openCD(cd_num); _lang = kEnglish; diff --git a/engines/drascula/sound.cpp b/engines/drascula/sound.cpp index ad9ec6ca5e..2233115f3d 100644 --- a/engines/drascula/sound.cpp +++ b/engines/drascula/sound.cpp @@ -23,7 +23,6 @@ * */ -#include "sound/audiocd.h" #include "sound/audiostream.h" #include "sound/mixer.h" #include "sound/decoders/raw.h" @@ -123,20 +122,20 @@ void DrasculaEngine::finishSound() { } void DrasculaEngine::playMusic(int p) { - AudioCD.stop(); - AudioCD.play(p - 1, 1, 0, 0); + _system->getAudioCDManager()->stop(); + _system->getAudioCDManager()->play(p - 1, 1, 0, 0); } void DrasculaEngine::stopMusic() { - AudioCD.stop(); + _system->getAudioCDManager()->stop(); } void DrasculaEngine::updateMusic() { - AudioCD.updateCD(); + _system->getAudioCDManager()->updateCD(); } int DrasculaEngine::musicStatus() { - return AudioCD.isPlaying(); + return _system->getAudioCDManager()->isPlaying(); } void DrasculaEngine::stopSound() { @@ -157,7 +156,7 @@ void DrasculaEngine::MusicFadeout() { _system->updateScreen(); _system->delayMillis(50); } - AudioCD.stop(); + _system->getAudioCDManager()->stop(); _system->delayMillis(100); _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, org_vol); } diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index 4906b8f117..e8cbec270c 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -262,7 +262,7 @@ Common::Error GobEngine::run() { int cd_num = ConfMan.getInt("cdrom"); if (cd_num >= 0) - _system->openCD(cd_num); + _system->getAudioCDManager()->openCD(cd_num); _global->_debugFlag = 1; _video->_doRangeClamp = true; diff --git a/engines/gob/sound/cdrom.cpp b/engines/gob/sound/cdrom.cpp index cfd26e6bed..3316b760ef 100644 --- a/engines/gob/sound/cdrom.cpp +++ b/engines/gob/sound/cdrom.cpp @@ -26,7 +26,6 @@ #include "common/endian.h" #include "common/str.h" #include "common/util.h" -#include "sound/audiocd.h" #include "gob/gob.h" #include "gob/sound/cdrom.h" @@ -116,7 +115,7 @@ void CDROM::play(uint32 from, uint32 to) { // HSG encodes frame information into a double word: // minute multiplied by 4500, plus second multiplied by 75, // plus frame, minus 150 - AudioCD.play(1, 1, from, to - from + 1); + g_system->getAudioCDManager()->play(1, 1, from, to - from + 1); _cdPlaying = true; } @@ -161,7 +160,7 @@ void CDROM::stopPlaying() { void CDROM::stop() { _curTrackBuffer = 0; - AudioCD.stop(); + g_system->getAudioCDManager()->stop(); _cdPlaying = false; } diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 131604e75c..c7c3ef85f8 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -217,7 +217,7 @@ Common::Error GroovieEngine::run() { // Initialize the CD int cd_num = ConfMan.getInt("cdrom"); if (cd_num >= 0) - _system->openCD(cd_num); + _system->getAudioCDManager()->openCD(cd_num); while (!shouldQuit()) { // Give the debugger a chance to act diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 6ccc68c498..2ad11ee0e6 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -29,7 +29,6 @@ #include "common/config-manager.h" #include "common/macresman.h" -#include "sound/audiocd.h" #include "sound/midiparser.h" namespace Groovie { @@ -42,7 +41,7 @@ MusicPlayer::MusicPlayer(GroovieEngine *vm) : } MusicPlayer::~MusicPlayer() { - AudioCD.stop(); + g_system->getAudioCDManager()->stop(); } void MusicPlayer::playSong(uint32 fileref) { @@ -90,7 +89,7 @@ void MusicPlayer::playCD(uint8 track) { // the song number (it's track 2 on the 2nd CD) } else if ((track == 98) && (_prevCDtrack == 3)) { // Track 98 is used as a hack to stop the credits song - AudioCD.stop(); + g_system->getAudioCDManager()->stop(); return; } @@ -101,20 +100,20 @@ void MusicPlayer::playCD(uint8 track) { // It was in the original interpreter, but it introduces a big delay // in the middle of the introduction, so it's disabled right now /* - AudioCD.updateCD(); - while (AudioCD.isPlaying()) { + g_system->getAudioCDManager()->updateCD(); + while (g_system->getAudioCDManager()->isPlaying()) { // Wait a bit and try again _vm->_system->delayMillis(100); - AudioCD.updateCD(); + g_system->getAudioCDManager()->updateCD(); } */ // Play the track starting at the requested offset (1000ms = 75 frames) - AudioCD.play(track - 1, 1, startms * 75 / 1000, 0); + g_system->getAudioCDManager()->play(track - 1, 1, startms * 75 / 1000, 0); // If the audio is not playing from the CD, play the "fallback" MIDI. // The Mac version has no CD tracks, so it will always use the MIDI. - if (!AudioCD.isPlaying()) { + if (!g_system->getAudioCDManager()->isPlaying()) { if (track == 2) { // Intro MIDI fallback if (_vm->getPlatform() == Common::kPlatformMacintosh) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index a674f9efb8..487f5e8128 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -30,7 +30,6 @@ #include "kyra/sound_intern.h" #include "kyra/screen.h" -#include "sound/audiocd.h" #include "sound/audiostream.h" #include "sound/decoders/raw.h" @@ -46,7 +45,7 @@ SoundTowns::SoundTowns(KyraEngine_v1 *vm, Audio::Mixer *mixer) } SoundTowns::~SoundTowns() { - AudioCD.stop(); + g_system->getAudioCDManager()->stop(); haltTrack(); delete _driver; delete[] _musicTrackData; @@ -75,7 +74,7 @@ bool SoundTowns::init() { } void SoundTowns::process() { - AudioCD.updateCD(); + g_system->getAudioCDManager()->updateCD(); } void SoundTowns::playTrack(uint8 track) { @@ -83,7 +82,7 @@ void SoundTowns::playTrack(uint8 track) { return; track -= 2; - const int32 * const tTable = (const int32 *)cdaData(); + const int32 *const tTable = (const int32 *const)cdaData(); int tTableIndex = 3 * track; int trackNum = (int)READ_LE_UINT32(&tTable[tTableIndex + 2]); @@ -96,8 +95,8 @@ void SoundTowns::playTrack(uint8 track) { if (_musicEnabled == 2 && trackNum != -1) { _driver->setOutputVolume(1, 118, 118); - AudioCD.play(trackNum+1, loop ? -1 : 1, 0, 0); - AudioCD.updateCD(); + g_system->getAudioCDManager()->play(trackNum + 1, loop ? -1 : 1, 0, 0); + g_system->getAudioCDManager()->updateCD(); _cdaPlaying = true; } else if (_musicEnabled) { playEuphonyTrack(READ_LE_UINT32(&tTable[tTableIndex]), loop); @@ -109,8 +108,8 @@ void SoundTowns::playTrack(uint8 track) { void SoundTowns::haltTrack() { _lastTrack = -1; - AudioCD.stop(); - AudioCD.updateCD(); + g_system->getAudioCDManager()->stop(); + g_system->getAudioCDManager()->updateCD(); _cdaPlaying = false; for (int i = 0; i < 6; i++) @@ -437,8 +436,8 @@ void SoundPC98::playTrack(uint8 track) { void SoundPC98::haltTrack() { _lastTrack = -1; - AudioCD.stop(); - AudioCD.updateCD(); + g_system->getAudioCDManager()->stop(); + g_system->getAudioCDManager()->updateCD(); _driver->reset(); } @@ -521,7 +520,7 @@ void SoundTownsPC98_v2::loadSoundFile(Common::String file) { } void SoundTownsPC98_v2::process() { - AudioCD.updateCD(); + g_system->getAudioCDManager()->updateCD(); } void SoundTownsPC98_v2::playTrack(uint8 track) { @@ -530,7 +529,7 @@ void SoundTownsPC98_v2::playTrack(uint8 track) { if (track == _lastTrack && _musicEnabled) return; - const uint16 * const cdaTracks = (const uint16 *)cdaData(); + const uint16 *const cdaTracks = (const uint16 *const) cdaData(); int trackNum = -1; if (_vm->gameFlags().platform == Common::kPlatformFMTowns) { @@ -558,8 +557,8 @@ void SoundTownsPC98_v2::playTrack(uint8 track) { _driver->loadMusicData(_musicTrackData, true); if (_musicEnabled == 2 && trackNum != -1) { - AudioCD.play(trackNum+1, _driver->looping() ? -1 : 1, 0, 0); - AudioCD.updateCD(); + g_system->getAudioCDManager()->play(trackNum+1, _driver->looping() ? -1 : 1, 0, 0); + g_system->getAudioCDManager()->updateCD(); } else if (_musicEnabled) { _driver->cont(); } @@ -569,8 +568,8 @@ void SoundTownsPC98_v2::playTrack(uint8 track) { void SoundTownsPC98_v2::haltTrack() { _lastTrack = -1; - AudioCD.stop(); - AudioCD.updateCD(); + g_system->getAudioCDManager()->stop(); + g_system->getAudioCDManager()->updateCD(); _driver->reset(); } diff --git a/engines/made/made.cpp b/engines/made/made.cpp index 1fc3982d1e..4434f5e159 100644 --- a/engines/made/made.cpp +++ b/engines/made/made.cpp @@ -38,7 +38,6 @@ #include "base/plugins.h" #include "base/version.h" -#include "sound/audiocd.h" #include "sound/mixer.h" #include "made/made.h" @@ -83,7 +82,7 @@ MadeEngine::MadeEngine(OSystem *syst, const MadeGameDescription *gameDesc) : Eng int cd_num = ConfMan.getInt("cdrom"); if (cd_num >= 0) - _system->openCD(cd_num); + _system->getAudioCDManager()->openCD(cd_num); _pmvPlayer = new PmvPlayer(this, _mixer); _res = new ResourceReader(); @@ -132,7 +131,7 @@ MadeEngine::MadeEngine(OSystem *syst, const MadeGameDescription *gameDesc) : Eng } MadeEngine::~MadeEngine() { - AudioCD.stop(); + _system->getAudioCDManager()->stop(); delete _rnd; delete _console; @@ -251,7 +250,7 @@ void MadeEngine::handleEvents() { } } - AudioCD.updateCD(); + _system->getAudioCDManager()->updateCD(); } diff --git a/engines/made/made.h b/engines/made/made.h index 290e3e648a..302c8f5275 100644 --- a/engines/made/made.h +++ b/engines/made/made.h @@ -42,7 +42,6 @@ #include "sound/audiostream.h" #include "sound/mixer.h" #include "sound/decoders/voc.h" -#include "sound/audiocd.h" #include "engines/engine.h" diff --git a/engines/made/scriptfuncs.cpp b/engines/made/scriptfuncs.cpp index 8d01ec70f3..2f069e882e 100644 --- a/engines/made/scriptfuncs.cpp +++ b/engines/made/scriptfuncs.cpp @@ -27,7 +27,6 @@ #include "common/util.h" #include "common/events.h" #include "graphics/cursorman.h" -#include "sound/audiocd.h" #include "sound/softsynth/pcspk.h" #include "made/made.h" @@ -654,9 +653,9 @@ int16 ScriptFunctions::sfPlayVoice(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfPlayCd(int16 argc, int16 *argv) { - AudioCD.play(argv[0] - 1, 1, 0, 0); + g_system->getAudioCDManager()->play(argv[0] - 1, 1, 0, 0); _vm->_cdTimeStart = _vm->_system->getMillis(); - if (AudioCD.isPlaying()) { + if (g_system->getAudioCDManager()->isPlaying()) { return 1; } else { return 0; @@ -664,8 +663,8 @@ int16 ScriptFunctions::sfPlayCd(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfStopCd(int16 argc, int16 *argv) { - if (AudioCD.isPlaying()) { - AudioCD.stop(); + if (g_system->getAudioCDManager()->isPlaying()) { + g_system->getAudioCDManager()->stop(); return 1; } else { return 0; @@ -673,11 +672,11 @@ int16 ScriptFunctions::sfStopCd(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfGetCdStatus(int16 argc, int16 *argv) { - return AudioCD.isPlaying() ? 1 : 0; + return g_system->getAudioCDManager()->isPlaying() ? 1 : 0; } int16 ScriptFunctions::sfGetCdTime(int16 argc, int16 *argv) { - if (AudioCD.isPlaying()) { + if (g_system->getAudioCDManager()->isPlaying()) { uint32 deltaTime = _vm->_system->getMillis() - _vm->_cdTimeStart; // This basically converts the time from milliseconds to MSF format to MADE's format return (deltaTime / 1000 * 30) + (deltaTime % 1000 / 75 * 30 / 75); diff --git a/engines/saga/music.h b/engines/saga/music.h index b4d868ed78..c7fef7225b 100644 --- a/engines/saga/music.h +++ b/engines/saga/music.h @@ -28,9 +28,9 @@ #ifndef SAGA_MUSIC_H #define SAGA_MUSIC_H -#include "sound/audiocd.h" #include "sound/mididrv.h" #include "sound/midiparser.h" +#include "sound/mixer.h" #include "sound/decoders/mp3.h" #include "sound/decoders/vorbis.h" #include "sound/decoders/flac.h" diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 4a2a8e65d7..640273c20e 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -32,7 +32,6 @@ #include "common/file.h" #include "common/system.h" -#include "sound/audiocd.h" #include "sound/audiostream.h" #include "sound/decoders/aiff.h" #include "sound/decoders/flac.h" @@ -413,7 +412,7 @@ int AudioPlayer::audioCdPlay(int track, int start, int duration) { // Subtract one from track. KQ6 starts at track 1, while ScummVM // ignores the data track and considers track 2 to be track 1. - AudioCD.play(track - 1, 1, start, duration); + g_system->getAudioCDManager()->play(track - 1, 1, start, duration); return 1; } else { // Jones in the Fast Lane CD Audio format @@ -436,7 +435,7 @@ int AudioPlayer::audioCdPlay(int track, int start, int duration) { // Jones uses the track as the resource value in the map if (res == track) { - AudioCD.play(1, 1, startFrame, length); + g_system->getAudioCDManager()->play(1, 1, startFrame, length); _audioCdStart = g_system->getMillis(); break; } @@ -450,16 +449,16 @@ int AudioPlayer::audioCdPlay(int track, int start, int duration) { void AudioPlayer::audioCdStop() { _audioCdStart = 0; - AudioCD.stop(); + g_system->getAudioCDManager()->stop(); } void AudioPlayer::audioCdUpdate() { - AudioCD.updateCD(); + g_system->getAudioCDManager()->update(); } int AudioPlayer::audioCdPosition() { // Return -1 if the sample is done playing. Converting to frames to compare. - if (((g_system->getMillis() - _audioCdStart) * 75 / 1000) >= (uint32)AudioCD.getStatus().duration) + if (((g_system->getMillis() - _audioCdStart) * 75 / 1000) >= (uint32)g_system->getAudioCDManager()->getStatus().duration) return -1; // Return the position otherwise (in ticks). diff --git a/engines/scumm/he/sound_he.cpp b/engines/scumm/he/sound_he.cpp index 318cb818b6..1d02a95b30 100644 --- a/engines/scumm/he/sound_he.cpp +++ b/engines/scumm/he/sound_he.cpp @@ -36,7 +36,6 @@ #include "common/util.h" #include "sound/decoders/adpcm.h" -#include "sound/audiocd.h" #include "sound/decoders/flac.h" #include "sound/mididrv.h" #include "sound/mixer.h" diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 9cb603e27f..58bb817292 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -43,7 +43,6 @@ #include "scumm/he/sprite_he.h" #include "scumm/verbs.h" -#include "sound/audiocd.h" #include "sound/mixer.h" #include "graphics/thumbnail.h" @@ -1107,7 +1106,7 @@ void ScummEngine::saveOrLoad(Serializer *s) { // as AudioCDManager::Status::playing, and MSVC6 has // a fit with that. This typedef simplifies the notation // to something MSVC6 can grasp. - typedef Audio::AudioCDManager::Status AudioCDManager_Status; + typedef AudioCDManager::Status AudioCDManager_Status; const SaveLoadEntry audioCDEntries[] = { MKLINE(AudioCDManager_Status, playing, sleUint32, VER(24)), MKLINE(AudioCDManager_Status, track, sleInt32, VER(24)), @@ -1408,15 +1407,15 @@ void ScummEngine::saveOrLoad(Serializer *s) { // Save/load the Audio CD status // if (s->getVersion() >= VER(24)) { - Audio::AudioCDManager::Status info; + AudioCDManager::Status info; if (s->isSaving()) - info = AudioCD.getStatus(); + info = _system->getAudioCDManager()->getStatus(); s->saveLoadArrayOf(&info, 1, sizeof(info), audioCDEntries); // If we are loading, and the music being loaded was supposed to loop // forever, then resume playing it. This helps a lot when the audio CD // is used to provide ambient music (see bug #788195). if (s->isLoading() && info.playing && info.numLoops < 0) - AudioCD.play(info.track, info.numLoops, info.start, info.duration); + _system->getAudioCDManager()->play(info.track, info.numLoops, info.start, info.duration); } diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 405c81f91b..392b3ca3c4 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -1200,7 +1200,7 @@ void ScummEngine::setupScumm() { int cd_num = ConfMan.getInt("cdrom"); if (cd_num >= 0) - _system->openCD(cd_num); + _system->getAudioCDManager()->openCD(cd_num); } // Create the sound manager diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp index 8fc6de8af9..af7bc5f295 100644 --- a/engines/scumm/sound.cpp +++ b/engines/scumm/sound.cpp @@ -37,7 +37,6 @@ #include "scumm/util.h" #include "sound/decoders/adpcm.h" -#include "sound/audiocd.h" #include "sound/decoders/flac.h" #include "sound/mididrv.h" #include "sound/mixer.h" @@ -89,7 +88,7 @@ Sound::Sound(ScummEngine *parent, Audio::Mixer *mixer) Sound::~Sound() { stopCDTimer(); - AudioCD.stop(); + g_system->getAudioCDManager()->stop(); delete _sfxFile; } @@ -1027,7 +1026,7 @@ void Sound::playCDTrack(int track, int numLoops, int startFrame, int duration) { // Play it if (!_soundsPaused) - AudioCD.play(track, numLoops, startFrame, duration); + g_system->getAudioCDManager()->play(track, numLoops, startFrame, duration); // Start the timer after starting the track. Starting an MP3 track is // almost instantaneous, but a CD player may take some time. Hopefully @@ -1036,15 +1035,15 @@ void Sound::playCDTrack(int track, int numLoops, int startFrame, int duration) { } void Sound::stopCD() { - AudioCD.stop(); + g_system->getAudioCDManager()->stop(); } int Sound::pollCD() const { - return AudioCD.isPlaying(); + return g_system->getAudioCDManager()->isPlaying(); } void Sound::updateCD() { - AudioCD.updateCD(); + g_system->getAudioCDManager()->updateCD(); } void Sound::saveLoadWithSerializer(Serializer *ser) { diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp index 4d300ff7fd..ebc2cd152d 100644 --- a/engines/teenagent/teenagent.cpp +++ b/engines/teenagent/teenagent.cpp @@ -31,7 +31,6 @@ #include "engines/advancedDetector.h" #include "engines/util.h" -#include "sound/audiocd.h" #include "sound/mixer.h" #include "sound/decoders/raw.h" @@ -983,7 +982,7 @@ void TeenAgentEngine::setMusic(byte id) { } byte track = track2cd[id - 1]; debug(0, "playing cd track %u", track); - Audio::AudioCDManager::instance().play(track, -1, 0, 0); + _system->getAudioCDManager()->play(track, -1, 0, 0); } else if (music->load(id)) music->start(); } diff --git a/engines/testbed/sound.cpp b/engines/testbed/sound.cpp index 615793da74..b2f61ab714 100644 --- a/engines/testbed/sound.cpp +++ b/engines/testbed/sound.cpp @@ -22,7 +22,6 @@ * $Id$ */ -#include "sound/audiocd.h" #include "sound/softsynth/pcspk.h" #include "testbed/sound.h" @@ -190,8 +189,8 @@ TestExitStatus SoundSubsystem::audiocdOutput() { // Play all tracks for (int i = 1; i < 5; i++) { - AudioCD.play(i, 1, 0, 0); - while (AudioCD.isPlaying()) { + g_system->getAudioCDManager()->play(i, 1, 0, 0); + while (g_system->getAudioCDManager()->isPlaying()) { g_system->delayMillis(500); Testsuite::writeOnScreen(Common::String::format("Playing Now: track%02d", i), pt); } @@ -200,7 +199,7 @@ TestExitStatus SoundSubsystem::audiocdOutput() { Testsuite::clearScreen(); if (Testsuite::handleInteractiveInput("Were all the tracks played in order i.e 1-2-3-last ?", "Yes", "No", kOptionRight)) { - Testsuite::logPrintf("Error! Error in AudioCD.play() or probably sound files were not detected, try -d1 (debuglevel 1)\n"); + Testsuite::logPrintf("Error! Error in _system->getAudioCDManager()->play() or probably sound files were not detected, try -d1 (debuglevel 1)\n"); passed = kTestFailed; } diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp index f21c41a843..b46424704c 100644 --- a/engines/tinsel/music.cpp +++ b/engines/tinsel/music.cpp @@ -30,7 +30,6 @@ #include "sound/audiostream.h" #include "sound/mididrv.h" #include "sound/midiparser.h" -#include "sound/audiocd.h" #include "sound/decoders/adpcm.h" #include "common/config-manager.h" #include "common/file.h" @@ -191,11 +190,11 @@ bool PlayMidiSequence(uint32 dwFileOffset, bool bLoop) { currentLoop = bLoop; // try to play track, but don't fall back to a true CD - AudioCD.play(track, bLoop ? -1 : 1, 0, 0, true); + g_system->getAudioCDManager()->play(track, bLoop ? -1 : 1, 0, 0, true); // Check if an enhanced audio track is being played. // If it is, stop here and don't load a MIDI track - if (AudioCD.isPlaying()) { + if (g_system->getAudioCDManager()->isPlaying()) { return true; } } @@ -270,7 +269,7 @@ bool PlayMidiSequence(uint32 dwFileOffset, bool bLoop) { */ bool MidiPlaying() { if (_vm->getFeatures() & GF_ENHANCED_AUDIO_SUPPORT) { - if (AudioCD.isPlaying()) + if (g_system->getAudioCDManager()->isPlaying()) return true; } return _vm->_midiMusic->isPlaying(); @@ -284,7 +283,7 @@ bool StopMidi() { currentLoop = false; if (_vm->getFeatures() & GF_ENHANCED_AUDIO_SUPPORT) { - AudioCD.stop(); + g_system->getAudioCDManager()->stop(); } _vm->_midiMusic->stop(); diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index 049870a20e..386a402af4 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -45,7 +45,6 @@ #include "sound/mididrv.h" #include "sound/mixer.h" -#include "sound/audiocd.h" #include "tinsel/actors.h" #include "tinsel/background.h" @@ -853,7 +852,7 @@ TinselEngine::TinselEngine(OSystem *syst, const TinselGameDescription *gameDesc) int cd_num = ConfMan.getInt("cdrom"); if (cd_num >= 0) - _system->openCD(cd_num); + _system->getAudioCDManager()->openCD(cd_num); MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); @@ -889,7 +888,7 @@ TinselEngine::~TinselEngine() { if (_bmv->MoviePlaying()) _bmv->FinishBMV(); - AudioCD.stop(); + _system->getAudioCDManager()->stop(); delete _bmv; delete _sound; delete _midiMusic; @@ -999,7 +998,7 @@ Common::Error TinselEngine::run() { // Check for time to do next game cycle if ((g_system->getMillis() > timerVal + GAME_FRAME_DELAY)) { timerVal = g_system->getMillis(); - AudioCD.updateCD(); + _system->getAudioCDManager()->updateCD(); NextGameCycle(); } diff --git a/sound/audiocd.h b/sound/audiocd.h deleted file mode 100644 index abc45a1640..0000000000 --- a/sound/audiocd.h +++ /dev/null @@ -1,96 +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$ - * - */ - -#ifndef SOUND_AUDIOCD_H -#define SOUND_AUDIOCD_H - -#include "common/scummsys.h" -#include "common/singleton.h" -#include "sound/mixer.h" - - -namespace Audio { - - -class AudioCDManager : public Common::Singleton<AudioCDManager> { -public: - struct Status { - bool playing; - int track; - int start; - int duration; - int numLoops; - int volume; - int balance; - }; - - /** - * Start playback of the specified "CD" track. This method mimics - * the interface of OSystem::playCD (which it in fact may call, if an Audio CD is - * present), but also can play digital audio tracks in various formats. - * - * @param track the track to play. - * @param num_loops how often playback should be repeated (-1 = infinitely often). - * @param start_frame the frame at which playback should start (75 frames = 1 second). - * @param duration the number of frames to play (0: play until end) - * @param only_emulate if true, don't try to play from a real CD - */ - void play(int track, int numLoops, int startFrame, int duration, bool only_emulate = false); - void stop(); - bool isPlaying() const; - - void setVolume(byte volume); - void setBalance(int8 balance); - - void updateCD(); - - Status getStatus() const; - -private: - friend class Common::Singleton<SingletonBaseType>; - AudioCDManager(); - - // FIXME: It might make sense to stop CD playback, when the AudioCDManager singleton - // is destroyed. Currently we can not do this, since in worst case the OSystem and - // along with it the Mixer will be destroyed before the AudioCDManager, thus - // leading to invalid memory access. If we can fix up the code to destroy the - // AudioCDManager before OSystem in *all* cases, that is including calling - // OSystem::quit, we might be able to implement it via a simple "stop()" - // call in a custom destructor of AudioCDManager. - - /* used for emulated CD music */ - SoundHandle _handle; - bool _emulating; - - Status _cd; - Mixer *_mixer; -}; - -/** Shortcut for accessing the audio CD manager. */ -#define AudioCD Audio::AudioCDManager::instance() - -} // End of namespace Audio - -#endif diff --git a/sound/decoders/flac.cpp b/sound/decoders/flac.cpp index 65f3306106..080141f224 100644 --- a/sound/decoders/flac.cpp +++ b/sound/decoders/flac.cpp @@ -35,7 +35,6 @@ #include "common/util.h" #include "sound/audiostream.h" -#include "sound/audiocd.h" #define FLAC__NO_DLL // that MS-magic gave me headaches - just link the library you like #include <FLAC/export.h> diff --git a/sound/decoders/mp3.cpp b/sound/decoders/mp3.cpp index 848ee7e280..e06b82a9e2 100644 --- a/sound/decoders/mp3.cpp +++ b/sound/decoders/mp3.cpp @@ -31,7 +31,6 @@ #include "common/stream.h" #include "common/util.h" -#include "sound/audiocd.h" #include "sound/audiostream.h" #include <mad.h> diff --git a/sound/decoders/vorbis.cpp b/sound/decoders/vorbis.cpp index ee31bbc38d..425eb6b751 100644 --- a/sound/decoders/vorbis.cpp +++ b/sound/decoders/vorbis.cpp @@ -37,7 +37,6 @@ #include "common/util.h" #include "sound/audiostream.h" -#include "sound/audiocd.h" #ifdef USE_TREMOR #if defined(__GP32__) // custom libtremor locations diff --git a/sound/mixer.h b/sound/mixer.h index 65d5d18cc6..5c7d902337 100644 --- a/sound/mixer.h +++ b/sound/mixer.h @@ -28,6 +28,7 @@ #include "common/types.h" #include "common/mutex.h" +#include "common/noncopyable.h" #include "sound/timestamp.h" @@ -61,7 +62,7 @@ public: * The main audio mixer handles mixing of an arbitrary number of * audio streams (in the form of AudioStream instances). */ -class Mixer { +class Mixer : Common::NonCopyable { public: enum SoundType { kPlainSoundType = 0, diff --git a/sound/module.mk b/sound/module.mk index 7992d3822b..6cfa165a95 100644 --- a/sound/module.mk +++ b/sound/module.mk @@ -1,7 +1,6 @@ MODULE := sound MODULE_OBJS := \ - audiocd.o \ audiostream.o \ fmopl.o \ mididrv.o \ diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index d745afbc17..a9e67c5266 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -24,7 +24,6 @@ */ #include "sound/softsynth/fmtowns_pc98/towns_audio.h" -#include "sound/audiocd.h" #include "common/endian.h" @@ -1405,8 +1404,8 @@ void TownsAudioInterface::updateOutputVolume() { int volume = (int)(((float)(maxVol * 255) / 63.0f)); int balance = maxVol ? (int)( ( ((int)_outputLevel[13] - _outputLevel[12]) * 127) / (float)maxVol) : 0; - AudioCD.setVolume(volume); - AudioCD.setBalance(balance); + g_system->getAudioCDManager()->setVolume(volume); + g_system->getAudioCDManager()->setBalance(balance); } const uint8 TownsAudioInterface::_chanFlags[] = { |