aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/audiocd/audiocd.h148
-rw-r--r--backends/audiocd/default/default-audiocd.cpp (renamed from sound/audiocd.cpp)52
-rw-r--r--backends/audiocd/default/default-audiocd.h62
-rw-r--r--backends/audiocd/sdl/sdl-audiocd.cpp139
-rw-r--r--backends/audiocd/sdl/sdl-audiocd.h57
-rw-r--r--backends/base-backend.cpp21
-rw-r--r--backends/base-backend.h10
-rw-r--r--backends/module.mk2
-rw-r--r--backends/platform/sdl/sdl.cpp89
-rw-r--r--backends/platform/sdl/sdl.h14
-rw-r--r--base/main.cpp10
-rw-r--r--common/system.cpp8
-rw-r--r--common/system.h49
-rw-r--r--engines/agos/agos.cpp3
-rw-r--r--engines/agos/event.cpp5
-rw-r--r--engines/agos/res_snd.cpp7
-rw-r--r--engines/drascula/drascula.cpp2
-rw-r--r--engines/drascula/sound.cpp13
-rw-r--r--engines/gob/gob.cpp2
-rw-r--r--engines/gob/sound/cdrom.cpp5
-rw-r--r--engines/groovie/groovie.cpp2
-rw-r--r--engines/groovie/music.cpp15
-rw-r--r--engines/kyra/sound_towns.cpp31
-rw-r--r--engines/made/made.cpp7
-rw-r--r--engines/made/made.h1
-rw-r--r--engines/made/scriptfuncs.cpp13
-rw-r--r--engines/saga/music.h2
-rw-r--r--engines/sci/sound/audio.cpp11
-rw-r--r--engines/scumm/he/sound_he.cpp1
-rw-r--r--engines/scumm/saveload.cpp9
-rw-r--r--engines/scumm/scumm.cpp2
-rw-r--r--engines/scumm/sound.cpp11
-rw-r--r--engines/teenagent/teenagent.cpp3
-rw-r--r--engines/testbed/sound.cpp7
-rw-r--r--engines/tinsel/music.cpp9
-rw-r--r--engines/tinsel/tinsel.cpp7
-rw-r--r--sound/audiocd.h96
-rw-r--r--sound/decoders/flac.cpp1
-rw-r--r--sound/decoders/mp3.cpp1
-rw-r--r--sound/decoders/vorbis.cpp1
-rw-r--r--sound/mixer.h3
-rw-r--r--sound/module.mk1
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_audio.cpp5
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[] = {