aboutsummaryrefslogtreecommitdiff
path: root/engines/tony/sound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/tony/sound.cpp')
-rw-r--r--engines/tony/sound.cpp208
1 files changed, 163 insertions, 45 deletions
diff --git a/engines/tony/sound.cpp b/engines/tony/sound.cpp
index 2a4eb826f3..aa86750ad5 100644
--- a/engines/tony/sound.cpp
+++ b/engines/tony/sound.cpp
@@ -28,7 +28,9 @@
#include "audio/audiostream.h"
#include "audio/decoders/adpcm.h"
-#include "audio/decoders/raw.h"
+#include "audio/decoders/flac.h"
+#include "audio/decoders/mp3.h"
+#include "audio/decoders/vorbis.h"
#include "audio/decoders/wave.h"
#include "common/textconsole.h"
#include "tony/game.h"
@@ -49,6 +51,18 @@ static int remapVolume(int volume) {
return (int)((double)Audio::Mixer::kMaxChannelVolume * pow(10.0, dsvol / 2000.0) + 0.5);
}
+// Another obvious rip from gob engine. Hi DrMcCoy!
+Common::String setExtension(const Common::String &str, const Common::String &ext) {
+ if (str.empty())
+ return str;
+
+ const char *dot = strrchr(str.c_str(), '.');
+ if (dot)
+ return Common::String(str.c_str(), dot - str.c_str()) + ext;
+
+ return str + ext;
+}
+
/****************************************************************************\
* FPSOUND Methods
\****************************************************************************/
@@ -204,12 +218,45 @@ bool FPSfx::loadVoiceFromVDB(Common::File &vdbFP) {
if (!_soundSupported)
return true;
- uint32 size = vdbFP.readUint32LE();
- uint32 rate = vdbFP.readUint32LE();
- _isVoice = true;
-
- _rewindableStream = Audio::makeADPCMStream(vdbFP.readStream(size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, 1);
+ switch (g_vm->_vdbCodec) {
+ case FPCODEC_ADPCM: {
+ uint32 size = vdbFP.readUint32LE();
+ uint32 rate = vdbFP.readUint32LE();
+ _rewindableStream = Audio::makeADPCMStream(vdbFP.readStream(size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, 1);
+ }
+ break;
+ case FPCODEC_MP3 : {
+#ifdef USE_MAD
+ uint32 size = vdbFP.readUint32LE();
+ _rewindableStream = Audio::makeMP3Stream(vdbFP.readStream(size), DisposeAfterUse::YES);
+#else
+ return false;
+#endif
+ }
+ break;
+ case FPCODEC_OGG : {
+#ifdef USE_VORBIS
+ uint32 size = vdbFP.readUint32LE();
+ _rewindableStream = Audio::makeVorbisStream(vdbFP.readStream(size), DisposeAfterUse::YES);
+#else
+ return false;
+#endif
+ }
+ break;
+ case FPCODEC_FLAC : {
+#ifdef USE_FLAC
+ uint32 size = vdbFP.readUint32LE();
+ _rewindableStream = Audio::makeFLACStream(vdbFP.readStream(size), DisposeAfterUse::YES);
+#else
+ return false;
+#endif
+ }
+ break;
+ default:
+ return false;
+ }
+ _isVoice = true;
_fileLoaded = true;
setVolume(62);
return true;
@@ -219,39 +266,64 @@ bool FPSfx::loadVoiceFromVDB(Common::File &vdbFP) {
* Opens a file and loads a sound effect.
*
* @param fileName Sfx filename
- * @param codec CODEC used to uncompress the samples
*
* @returns True is everything is OK, False otherwise
*/
-bool FPSfx::loadFile(const char *fileName, uint32 codec) {
+bool FPSfx::loadFile(const char *fileName) {
if (!_soundSupported)
return true;
+ SoundCodecs codec = FPCODEC_UNKNOWN;
+
Common::File file;
- if (!file.open(fileName)) {
+ if (file.open(fileName))
+ codec = FPCODEC_ADPCM;
+ else if (file.open(setExtension(fileName, ".MP3")))
+ codec = FPCODEC_MP3;
+ else if (file.open(setExtension(fileName, ".OGG")))
+ codec = FPCODEC_OGG;
+ else if (file.open(setExtension(fileName, ".FLA")))
+ codec = FPCODEC_FLAC;
+ else {
warning("FPSfx::LoadFile(): Cannot open sfx file!");
return false;
}
- if (file.readUint32BE() != MKTAG('A', 'D', 'P', 0x10)) {
- warning("FPSfx::LoadFile(): Invalid ADP header!");
- return false;
- }
-
- uint32 rate = file.readUint32LE();
- uint32 channels = file.readUint32LE();
+ Common::SeekableReadStream *buffer;
+ switch (codec) {
+ case FPCODEC_ADPCM: {
+ if (file.readUint32BE() != MKTAG('A', 'D', 'P', 0x10)) {
+ warning("FPSfx::LoadFile(): Invalid ADP header!");
+ return false;
+ }
- Common::SeekableReadStream *buffer = file.readStream(file.size() - file.pos());
+ uint32 rate = file.readUint32LE();
+ uint32 channels = file.readUint32LE();
- if (codec == FPCODEC_ADPCM) {
+ buffer = file.readStream(file.size() - file.pos());
_rewindableStream = Audio::makeADPCMStream(buffer, DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, channels);
- } else {
- byte flags = Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN;
-
- if (channels == 2)
- flags |= Audio::FLAG_STEREO;
-
- _rewindableStream = Audio::makeRawStream(buffer, rate, flags, DisposeAfterUse::YES);
+ }
+ break;
+ case FPCODEC_MP3:
+#ifdef USE_MAD
+ buffer = file.readStream(file.size());
+ _rewindableStream = Audio::makeMP3Stream(buffer, DisposeAfterUse::YES);
+#endif
+ break;
+ case FPCODEC_OGG:
+#ifdef USE_VORBIS
+ buffer = file.readStream(file.size());
+ _rewindableStream = Audio::makeVorbisStream(buffer, DisposeAfterUse::YES);
+#endif
+ break;
+ case FPCODEC_FLAC:
+ buffer = file.readStream(file.size());
+#ifdef USE_FLAC
+ _rewindableStream = Audio::makeFLACStream(buffer, DisposeAfterUse::YES);
+#endif
+ break;
+ default:
+ return false;
}
_fileLoaded = true;
@@ -469,50 +541,96 @@ void FPStream::release() {
* Opens a file stream
*
* @param fileName Filename to be opened
- * @param codec CODEC to be used to uncompress samples
+ * @param bufSize Buffer size
*
* @returns True is everything is OK, False otherwise
*/
-bool FPStream::loadFile(const Common::String &fileName, uint32 codec, int bufSize) {
+bool FPStream::loadFile(const Common::String &fileName, int bufSize) {
if (!_soundSupported)
return true;
if (_fileLoaded)
unloadFile();
- // Save the codec type
- _codec = codec;
+ SoundCodecs codec = FPCODEC_UNKNOWN;
// Open the file stream for reading
- if (!_file.open(fileName)) {
- // Fallback: try with an extra '0' prefix
- if (!_file.open("0" + fileName))
- return false;
+ if (_file.open(fileName))
+ codec = FPCODEC_ADPCM;
+ else if (_file.open(setExtension(fileName, ".MP3")))
+ codec = FPCODEC_MP3;
+ else if (_file.open(setExtension(fileName, ".OGG")))
+ codec = FPCODEC_OGG;
+ else if (_file.open(setExtension(fileName, ".FLA")))
+ codec = FPCODEC_FLAC;
+ // Fallback: try with an extra '0' prefix
+ else if (_file.open("0" + fileName)) {
+ codec = FPCODEC_ADPCM;
warning("FPStream::loadFile(): Fallback from %s to %s", fileName.c_str(), _file.getName());
- }
+ } else if (_file.open(setExtension("0" + fileName, ".MP3"))) {
+ codec = FPCODEC_MP3;
+ warning("FPStream::loadFile(): Fallback from %s to %s", fileName.c_str(), _file.getName());
+ } else if (_file.open(setExtension("0" + fileName, ".OGG"))) {
+ codec = FPCODEC_OGG;
+ warning("FPStream::loadFile(): Fallback from %s to %s", fileName.c_str(), _file.getName());
+ } else if (_file.open(setExtension("0" + fileName, ".FLA"))) {
+ codec = FPCODEC_FLAC;
+ warning("FPStream::loadFile(): Fallback from %s to %s", fileName.c_str(), _file.getName());
+ } else
+ return false;
// Save the size of the stream
_size = _file.size();
- switch (_codec) {
- case FPCODEC_RAW:
- _rewindableStream = Audio::makeRawStream(&_file, 44100, Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN | Audio::FLAG_STEREO, DisposeAfterUse::NO);
- break;
-
- case FPCODEC_ADPCM:
#ifdef __amigaos4__
- // HACK: AmigaOS 4 has weird performance problems with reading in the audio thread,
- // so we read the whole stream into memory.
+ // HACK: AmigaOS 4 has weird performance problems with reading in the audio thread,
+ // so we read the whole stream into memory.
+ switch (codec) {
+ case FPCODEC_ADPCM:
_rewindableStream = Audio::makeADPCMStream(_file.readStream(_size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, 44100, 2);
+ break;
+ case FPCODEC_MP3:
+#ifdef USE_MAD
+ _rewindableStream = Audio::makeMP3Stream(&_file, DisposeAfterUse::YES);
+#endif
+ break;
+ case FPCODEC_OGG:
+#ifdef USE_VORBIS
+ _rewindableStream = Audio::makeVorbisStream(&_file, DisposeAfterUse::YES);
+#endif
+ break;
+ case FPCODEC_FLAC:
+#ifdef USE_FLAC
+ _rewindableStream = Audio::makeFLACStream(&_file, DisposeAfterUse::YES);
+#endif
+ break;
+ default:
+ break;
+ }
#else
+ switch (codec) {
+ case FPCODEC_ADPCM:
_rewindableStream = Audio::makeADPCMStream(&_file, DisposeAfterUse::NO, 0, Audio::kADPCMDVI, 44100, 2);
+ break;
+ case FPCODEC_MP3:
+#ifdef USE_MAD
+ _rewindableStream = Audio::makeMP3Stream(&_file, DisposeAfterUse::NO);
+#endif
+ break;
+ case FPCODEC_OGG:
+#ifdef USE_VORBIS
+ _rewindableStream = Audio::makeVorbisStream(&_file, DisposeAfterUse::NO);
+#endif
+ break;
+ case FPCODEC_FLAC:
+#ifdef USE_FLAC
+ _rewindableStream = Audio::makeFLACStream(&_file, DisposeAfterUse::NO);
#endif
break;
-
default:
- _file.close();
- return false;
+ break;
}
+#endif
// All done
_fileLoaded = true;