diff options
Diffstat (limited to 'audio')
36 files changed, 135 insertions, 188 deletions
diff --git a/audio/audiostream.cpp b/audio/audiostream.cpp index 547aa77526..1c5c435359 100644 --- a/audio/audiostream.cpp +++ b/audio/audiostream.cpp @@ -61,15 +61,13 @@ static const StreamFileFormat STREAM_FILEFORMATS[] = { { "MPEG Layer 3", ".mp3", makeMP3Stream }, #endif { "MPEG-4 Audio", ".m4a", makeQuickTimeStream }, - - { NULL, NULL, NULL } // Terminator }; SeekableAudioStream *SeekableAudioStream::openStreamFile(const Common::String &basename) { SeekableAudioStream *stream = NULL; Common::File *fileHandle = new Common::File(); - for (int i = 0; i < ARRAYSIZE(STREAM_FILEFORMATS)-1 && stream == NULL; ++i) { + for (int i = 0; i < ARRAYSIZE(STREAM_FILEFORMATS); ++i) { Common::String filename = basename + STREAM_FILEFORMATS[i].fileExtension; fileHandle->open(filename); if (fileHandle->isOpen()) { @@ -93,7 +91,7 @@ SeekableAudioStream *SeekableAudioStream::openStreamFile(const Common::String &b #pragma mark - LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse) - : _parent(stream), _disposeAfterUse(disposeAfterUse), _loops(loops), _completeIterations(0) { + : _parent(stream, disposeAfterUse), _loops(loops), _completeIterations(0) { assert(stream); if (!stream->rewind()) { @@ -102,11 +100,6 @@ LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops } } -LoopingAudioStream::~LoopingAudioStream() { - if (_disposeAfterUse == DisposeAfterUse::YES) - delete _parent; -} - int LoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) { if ((_loops && _completeIterations == _loops) || !numSamples) return 0; @@ -169,7 +162,7 @@ SubLoopingAudioStream::SubLoopingAudioStream(SeekableAudioStream *stream, const Timestamp loopStart, const Timestamp loopEnd, DisposeAfterUse::Flag disposeAfterUse) - : _parent(stream), _disposeAfterUse(disposeAfterUse), _loops(loops), + : _parent(stream, disposeAfterUse), _loops(loops), _pos(0, getRate() * (isStereo() ? 2 : 1)), _loopStart(convertTimeToStreamPos(loopStart, getRate(), isStereo())), _loopEnd(convertTimeToStreamPos(loopEnd, getRate(), isStereo())), @@ -180,11 +173,6 @@ SubLoopingAudioStream::SubLoopingAudioStream(SeekableAudioStream *stream, _done = true; } -SubLoopingAudioStream::~SubLoopingAudioStream() { - if (_disposeAfterUse == DisposeAfterUse::YES) - delete _parent; -} - int SubLoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) { if (_done) return 0; @@ -225,7 +213,7 @@ int SubLoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) { #pragma mark - SubSeekableAudioStream::SubSeekableAudioStream(SeekableAudioStream *parent, const Timestamp start, const Timestamp end, DisposeAfterUse::Flag disposeAfterUse) - : _parent(parent), _disposeAfterUse(disposeAfterUse), + : _parent(parent, disposeAfterUse), _start(convertTimeToStreamPos(start, getRate(), isStereo())), _pos(0, getRate() * (isStereo() ? 2 : 1)), _length(convertTimeToStreamPos(end, getRate(), isStereo()) - _start) { @@ -234,11 +222,6 @@ SubSeekableAudioStream::SubSeekableAudioStream(SeekableAudioStream *parent, cons _parent->seek(_start); } -SubSeekableAudioStream::~SubSeekableAudioStream() { - if (_disposeAfterUse) - delete _parent; -} - int SubSeekableAudioStream::readBuffer(int16 *buffer, const int numSamples) { int framesLeft = MIN(_length.frameDiff(_pos), numSamples); int framesRead = _parent->readBuffer(buffer, framesLeft); diff --git a/audio/audiostream.h b/audio/audiostream.h index 0ffaa241ce..9c28e4d67f 100644 --- a/audio/audiostream.h +++ b/audio/audiostream.h @@ -23,6 +23,7 @@ #ifndef SOUND_AUDIOSTREAM_H #define SOUND_AUDIOSTREAM_H +#include "common/ptr.h" #include "common/scummsys.h" #include "common/str.h" #include "common/types.h" @@ -114,7 +115,6 @@ public: * @param disposeAfterUse Destroy the stream after the LoopingAudioStream has finished playback. */ LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); - ~LoopingAudioStream(); int readBuffer(int16 *buffer, const int numSamples); bool endOfData() const; @@ -129,8 +129,7 @@ public: */ uint getCompleteIterations() const { return _completeIterations; } private: - RewindableAudioStream *_parent; - DisposeAfterUse::Flag _disposeAfterUse; + Common::DisposablePtr<RewindableAudioStream> _parent; uint _loops; uint _completeIterations; @@ -246,7 +245,6 @@ public: const Timestamp loopStart, const Timestamp loopEnd, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); - ~SubLoopingAudioStream(); int readBuffer(int16 *buffer, const int numSamples); bool endOfData() const { return _done; } @@ -254,8 +252,7 @@ public: bool isStereo() const { return _parent->isStereo(); } int getRate() const { return _parent->getRate(); } private: - SeekableAudioStream *_parent; - DisposeAfterUse::Flag _disposeAfterUse; + Common::DisposablePtr<SeekableAudioStream> _parent; uint _loops; Timestamp _pos; @@ -283,7 +280,6 @@ public: * @param disposeAfterUse Whether the parent stream object should be destroyed on destruction of the SubSeekableAudioStream. */ SubSeekableAudioStream(SeekableAudioStream *parent, const Timestamp start, const Timestamp end, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); - ~SubSeekableAudioStream(); int readBuffer(int16 *buffer, const int numSamples); @@ -297,8 +293,7 @@ public: Timestamp getLength() const { return _length; } private: - SeekableAudioStream *_parent; - DisposeAfterUse::Flag _disposeAfterUse; + Common::DisposablePtr<SeekableAudioStream> _parent; const Timestamp _start; const Timestamp _length; diff --git a/audio/decoders/aac.cpp b/audio/decoders/aac.cpp index 50325dc9f0..7700bb3215 100644 --- a/audio/decoders/aac.cpp +++ b/audio/decoders/aac.cpp @@ -8,19 +8,16 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ - * */ #include "audio/decoders/aac.h" diff --git a/audio/decoders/aac.h b/audio/decoders/aac.h index c5085fadaa..68e322c844 100644 --- a/audio/decoders/aac.h +++ b/audio/decoders/aac.h @@ -8,19 +8,16 @@ * 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$ - * */ /** diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp index 116f2f776a..535652a0b3 100644 --- a/audio/decoders/adpcm.cpp +++ b/audio/decoders/adpcm.cpp @@ -41,8 +41,7 @@ namespace Audio { // <http://wiki.multimedia.cx/index.php?title=Microsoft_IMA_ADPCM>. ADPCMStream::ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign) - : _stream(stream), - _disposeAfterUse(disposeAfterUse), + : _stream(stream, disposeAfterUse), _startpos(stream->pos()), _endpos(_startpos + size), _channels(channels), @@ -52,11 +51,6 @@ ADPCMStream::ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Fl reset(); } -ADPCMStream::~ADPCMStream() { - if (_disposeAfterUse == DisposeAfterUse::YES) - delete _stream; -} - void ADPCMStream::reset() { memset(&_status, 0, sizeof(_status)); _blockPos[0] = _blockPos[1] = _blockAlign; // To make sure first header is read diff --git a/audio/decoders/adpcm_intern.h b/audio/decoders/adpcm_intern.h index c9f894fb84..38514d7fca 100644 --- a/audio/decoders/adpcm_intern.h +++ b/audio/decoders/adpcm_intern.h @@ -33,6 +33,7 @@ #include "audio/audiostream.h" #include "common/endian.h" +#include "common/ptr.h" #include "common/stream.h" #include "common/textconsole.h" @@ -41,8 +42,7 @@ namespace Audio { class ADPCMStream : public RewindableAudioStream { protected: - Common::SeekableReadStream *_stream; - const DisposeAfterUse::Flag _disposeAfterUse; + Common::DisposablePtr<Common::SeekableReadStream> _stream; const int32 _startpos; const int32 _endpos; const int _channels; @@ -62,7 +62,6 @@ protected: public: ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign); - ~ADPCMStream(); virtual bool endOfData() const { return (_stream->eos() || _stream->pos() >= _endpos); } virtual bool isStereo() const { return _channels == 2; } diff --git a/audio/decoders/mp3.cpp b/audio/decoders/mp3.cpp index 8d7f006ec7..00669945c2 100644 --- a/audio/decoders/mp3.cpp +++ b/audio/decoders/mp3.cpp @@ -25,6 +25,7 @@ #ifdef USE_MAD #include "common/debug.h" +#include "common/ptr.h" #include "common/stream.h" #include "common/textconsole.h" #include "common/util.h" @@ -52,8 +53,7 @@ protected: MP3_STATE_EOS // end of data reached (may need to loop) }; - Common::SeekableReadStream *_inStream; - DisposeAfterUse::Flag _disposeAfterUse; + Common::DisposablePtr<Common::SeekableReadStream> _inStream; uint _posInFrame; State _state; @@ -95,8 +95,7 @@ protected: }; MP3Stream::MP3Stream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag dispose) : - _inStream(inStream), - _disposeAfterUse(dispose), + _inStream(inStream, dispose), _posInFrame(0), _state(MP3_STATE_INIT), _length(0, 1000), @@ -134,9 +133,6 @@ MP3Stream::MP3Stream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag MP3Stream::~MP3Stream() { deinitStream(); - - if (_disposeAfterUse == DisposeAfterUse::YES) - delete _inStream; } void MP3Stream::decodeMP3Data() { diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index a39fedc1d6..8cf0305e88 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -8,19 +8,16 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ - * */ #include "common/debug.h" diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h index 9f6c6c20e0..4dd1a57710 100644 --- a/audio/decoders/quicktime.h +++ b/audio/decoders/quicktime.h @@ -8,19 +8,16 @@ * 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$ - * */ /** diff --git a/audio/decoders/quicktime_intern.h b/audio/decoders/quicktime_intern.h index 7ce06b85fe..e31a1d3872 100644 --- a/audio/decoders/quicktime_intern.h +++ b/audio/decoders/quicktime_intern.h @@ -8,19 +8,16 @@ * 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$ - * */ /** diff --git a/audio/decoders/raw.cpp b/audio/decoders/raw.cpp index 4789fd0f36..881b8c1d6a 100644 --- a/audio/decoders/raw.cpp +++ b/audio/decoders/raw.cpp @@ -51,7 +51,7 @@ template<bool is16Bit, bool isUnsigned, bool isLE> class RawStream : public SeekableAudioStream { public: RawStream(int rate, bool stereo, DisposeAfterUse::Flag disposeStream, Common::SeekableReadStream *stream, const RawStreamBlockList &blocks) - : _rate(rate), _isStereo(stereo), _playtime(0, rate), _stream(stream), _disposeAfterUse(disposeStream), _blocks(blocks), _curBlock(_blocks.begin()), _blockLeft(0), _buffer(0) { + : _rate(rate), _isStereo(stereo), _playtime(0, rate), _stream(stream, disposeStream), _blocks(blocks), _curBlock(_blocks.begin()), _blockLeft(0), _buffer(0) { assert(_blocks.size() > 0); @@ -82,9 +82,6 @@ public: } ~RawStream() { - if (_disposeAfterUse == DisposeAfterUse::YES) - delete _stream; - delete[] _buffer; } @@ -98,15 +95,14 @@ public: bool seek(const Timestamp &where); private: - const int _rate; ///< Sample rate of stream - const bool _isStereo; ///< Whether this is an stereo stream - Timestamp _playtime; ///< Calculated total play time - Common::SeekableReadStream *_stream; ///< Stream to read data from - const DisposeAfterUse::Flag _disposeAfterUse; ///< Indicates whether the stream object should be deleted when this RawStream is destructed - const RawStreamBlockList _blocks; ///< Audio block list - - RawStreamBlockList::const_iterator _curBlock; ///< Current audio block number - int32 _blockLeft; ///< How many bytes are still left in the current block + const int _rate; ///< Sample rate of stream + const bool _isStereo; ///< Whether this is an stereo stream + Timestamp _playtime; ///< Calculated total play time + Common::DisposablePtr<Common::SeekableReadStream> _stream; ///< Stream to read data from + const RawStreamBlockList _blocks; ///< Audio block list + + RawStreamBlockList::const_iterator _curBlock; ///< Current audio block number + int32 _blockLeft; ///< How many bytes are still left in the current block /** * Advance one block in the stream in case diff --git a/audio/decoders/vorbis.cpp b/audio/decoders/vorbis.cpp index 2724dd1f02..64cacb4d58 100644 --- a/audio/decoders/vorbis.cpp +++ b/audio/decoders/vorbis.cpp @@ -29,6 +29,7 @@ #ifdef USE_VORBIS +#include "common/ptr.h" #include "common/stream.h" #include "common/textconsole.h" #include "common/util.h" @@ -42,6 +43,7 @@ #include <tremor/ivorbisfile.h> #endif #else +#define OV_EXCLUDE_STATIC_CALLBACKS #include <vorbis/vorbisfile.h> #endif @@ -88,8 +90,7 @@ static ov_callbacks g_stream_wrap = { class VorbisStream : public SeekableAudioStream { protected: - Common::SeekableReadStream *_inStream; - DisposeAfterUse::Flag _disposeAfterUse; + Common::DisposablePtr<Common::SeekableReadStream> _inStream; bool _isStereo; int _rate; @@ -120,10 +121,9 @@ protected: }; VorbisStream::VorbisStream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag dispose) : - _inStream(inStream), - _disposeAfterUse(dispose), + _inStream(inStream, dispose), _length(0, 1000), - _bufferEnd(_buffer + ARRAYSIZE(_buffer)) { + _bufferEnd(ARRAYEND(_buffer)) { int res = ov_open_callbacks(inStream, &_ovFile, NULL, 0, g_stream_wrap); if (res < 0) { @@ -149,8 +149,6 @@ VorbisStream::VorbisStream(Common::SeekableReadStream *inStream, DisposeAfterUse VorbisStream::~VorbisStream() { ov_clear(&_ovFile); - if (_disposeAfterUse == DisposeAfterUse::YES) - delete _inStream; } int VorbisStream::readBuffer(int16 *buffer, const int numSamples) { diff --git a/audio/decoders/vag.cpp b/audio/decoders/xa.cpp index 10ef69708c..818cd2df59 100644 --- a/audio/decoders/vag.cpp +++ b/audio/decoders/xa.cpp @@ -20,79 +20,78 @@ * */ -#include "audio/decoders/vag.h" +#include "audio/decoders/xa.h" #include "audio/audiostream.h" #include "common/stream.h" namespace Audio { -class VagStream : public Audio::RewindableAudioStream { +class XAStream : public Audio::RewindableAudioStream { public: - VagStream(Common::SeekableReadStream *stream, int rate); - ~VagStream(); + XAStream(Common::SeekableReadStream *stream, int rate, DisposeAfterUse::Flag disposeAfterUse); + ~XAStream(); bool isStereo() const { return false; } - bool endOfData() const { return _stream->pos() == _stream->size(); } + bool endOfData() const { return _endOfData && _samplesRemaining == 0; } int getRate() const { return _rate; } int readBuffer(int16 *buffer, const int numSamples); bool rewind(); private: Common::SeekableReadStream *_stream; + DisposeAfterUse::Flag _disposeAfterUse; + + void seekToPos(uint pos); byte _predictor; double _samples[28]; byte _samplesRemaining; int _rate; double _s1, _s2; + uint _loopPoint; + bool _endOfData; }; -VagStream::VagStream(Common::SeekableReadStream *stream, int rate) : _stream(stream) { +XAStream::XAStream(Common::SeekableReadStream *stream, int rate, DisposeAfterUse::Flag disposeAfterUse) + : _stream(stream), _disposeAfterUse(disposeAfterUse) { _samplesRemaining = 0; _predictor = 0; _s1 = _s2 = 0.0; _rate = rate; + _loopPoint = 0; + _endOfData = false; } -VagStream::~VagStream() { - delete _stream; +XAStream::~XAStream() { + if (_disposeAfterUse == DisposeAfterUse::YES) + delete _stream; } -static const double s_vagDataTable[5][2] = - { - { 0.0, 0.0 }, - { 60.0 / 64.0, 0.0 }, - { 115.0 / 64.0, -52.0 / 64.0 }, - { 98.0 / 64.0, -55.0 / 64.0 }, - { 122.0 / 64.0, -60.0 / 64.0 } - }; +static const double s_xaDataTable[5][2] = { + { 0.0, 0.0 }, + { 60.0 / 64.0, 0.0 }, + { 115.0 / 64.0, -52.0 / 64.0 }, + { 98.0 / 64.0, -55.0 / 64.0 }, + { 122.0 / 64.0, -60.0 / 64.0 } +}; -int VagStream::readBuffer(int16 *buffer, const int numSamples) { +int XAStream::readBuffer(int16 *buffer, const int numSamples) { int32 samplesDecoded = 0; - if (_samplesRemaining) { - byte i = 0; - - for (i = 28 - _samplesRemaining; i < 28 && samplesDecoded < numSamples; i++) { - _samples[i] = _samples[i] + _s1 * s_vagDataTable[_predictor][0] + _s2 * s_vagDataTable[_predictor][1]; - _s2 = _s1; - _s1 = _samples[i]; - int16 d = (int) (_samples[i] + 0.5); - buffer[samplesDecoded] = d; - samplesDecoded++; - } - -#if 0 - assert(i == 28); // We're screwed if this fails :P -#endif - // This might mean the file is corrupted, or that the stream has - // been closed. - if (i != 28) return 0; - - _samplesRemaining = 0; + for (int i = 28 - _samplesRemaining; i < 28 && samplesDecoded < numSamples; i++) { + _samples[i] = _samples[i] + _s1 * s_xaDataTable[_predictor][0] + _s2 * s_xaDataTable[_predictor][1]; + _s2 = _s1; + _s1 = _samples[i]; + int16 d = (int) (_samples[i] + 0.5); + buffer[samplesDecoded] = d; + samplesDecoded++; + _samplesRemaining--; } + if (endOfData()) + return samplesDecoded; + while (samplesDecoded < numSamples) { byte i = 0; @@ -100,8 +99,19 @@ int VagStream::readBuffer(int16 *buffer, const int numSamples) { byte shift = _predictor & 0xf; _predictor >>= 4; - if (_stream->readByte() == 7) + byte flags = _stream->readByte(); + if (flags == 3) { + // Loop + seekToPos(_loopPoint); + continue; + } else if (flags == 6) { + // Set loop point + _loopPoint = _stream->pos() - 2; + } else if (flags == 7) { + // End of stream + _endOfData = true; return samplesDecoded; + } for (i = 0; i < 28; i += 2) { byte d = _stream->readByte(); @@ -116,7 +126,7 @@ int VagStream::readBuffer(int16 *buffer, const int numSamples) { } for (i = 0; i < 28 && samplesDecoded < numSamples; i++) { - _samples[i] = _samples[i] + _s1 * s_vagDataTable[_predictor][0] + _s2 * s_vagDataTable[_predictor][1]; + _samples[i] = _samples[i] + _s1 * s_xaDataTable[_predictor][0] + _s2 * s_xaDataTable[_predictor][1]; _s2 = _s1; _s1 = _samples[i]; int16 d = (int) (_samples[i] + 0.5); @@ -124,24 +134,31 @@ int VagStream::readBuffer(int16 *buffer, const int numSamples) { samplesDecoded++; } - if (i != 27) + if (i != 28) _samplesRemaining = 28 - i; + + if (_stream->pos() >= _stream->size()) + _endOfData = true; } return samplesDecoded; } -bool VagStream::rewind() { - _stream->seek(0); +bool XAStream::rewind() { + seekToPos(0); + return true; +} + +void XAStream::seekToPos(uint pos) { + _stream->seek(pos); _samplesRemaining = 0; _predictor = 0; _s1 = _s2 = 0.0; - - return true; + _endOfData = false; } -RewindableAudioStream *makeVagStream(Common::SeekableReadStream *stream, int rate) { - return new VagStream(stream, rate); +RewindableAudioStream *makeXAStream(Common::SeekableReadStream *stream, int rate, DisposeAfterUse::Flag disposeAfterUse) { + return new XAStream(stream, rate, disposeAfterUse); } -} +} // End of namespace Audio diff --git a/audio/decoders/vag.h b/audio/decoders/xa.h index b80fbdb98f..cf28d8001a 100644 --- a/audio/decoders/vag.h +++ b/audio/decoders/xa.h @@ -28,8 +28,10 @@ * - tinsel (PSX port of the game) */ -#ifndef SOUND_VAG_H -#define SOUND_VAG_H +#ifndef AUDIO_DECODERS_XA_H +#define AUDIO_DECODERS_XA_H + +#include "common/types.h" namespace Common { class SeekableReadStream; @@ -40,17 +42,19 @@ namespace Audio { class RewindableAudioStream; /** - * Takes an input stream containing Vag sound data and creates + * Takes an input stream containing XA ADPCM sound data and creates * an RewindableAudioStream from that. * - * @param stream the SeekableReadStream from which to read the ADPCM data + * @param stream the SeekableReadStream from which to read the XA ADPCM data * @param rate the sampling rate + * @param disposeAfterUse whether to delete the stream after use. * @return a new RewindableAudioStream, or NULL, if an error occurred */ -RewindableAudioStream *makeVagStream( +RewindableAudioStream *makeXAStream( Common::SeekableReadStream *stream, - int rate = 11025); + int rate, + DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); -} // End of namespace Sword1 +} // End of namespace Audio #endif diff --git a/audio/fmopl.cpp b/audio/fmopl.cpp index a24c2a533c..da655643a7 100644 --- a/audio/fmopl.cpp +++ b/audio/fmopl.cpp @@ -192,4 +192,3 @@ FM_OPL *makeAdLibOPL(int rate) { return opl; } - diff --git a/audio/fmopl.h b/audio/fmopl.h index b88325a52e..f62587f557 100644 --- a/audio/fmopl.h +++ b/audio/fmopl.h @@ -176,4 +176,3 @@ void YM3812UpdateOne(FM_OPL *OPL, int16 *buffer, int length); FM_OPL *makeAdLibOPL(int rate); #endif - diff --git a/audio/mididrv.cpp b/audio/mididrv.cpp index 27f02c9053..a89bafddf8 100644 --- a/audio/mididrv.cpp +++ b/audio/mididrv.cpp @@ -202,7 +202,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { // If the expressly selected driver or device cannot be found (no longer compiled in, turned off, etc.) // we display a warning and continue. failedDevStr = selDevStr; - Common::String warningMsg = Common::String::format(_("The selected audio device '%s' was not found (e.g. might be turned off or disconnected). Attempting to fall back to the next available device..."), failedDevStr.c_str()); + Common::String warningMsg = Common::String::format(_("The selected audio device '%s' was not found (e.g. might be turned off or disconnected)."), failedDevStr.c_str()) + " " + _("Attempting to fall back to the next available device..."); GUI::MessageDialog dialog(warningMsg); dialog.runModal(); } @@ -214,7 +214,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { } else { // If the expressly selected device cannot be used we display a warning and continue. failedDevStr = getDeviceString(hdl, MidiDriver::kDeviceName); - Common::String warningMsg = Common::String::format(_("The selected audio device '%s' cannot be used. See log file for more information. Attempting to fall back to the next available device..."), failedDevStr.c_str()); + Common::String warningMsg = Common::String::format(_("The selected audio device '%s' cannot be used. See log file for more information."), failedDevStr.c_str()) + " " + _("Attempting to fall back to the next available device..."); GUI::MessageDialog dialog(warningMsg); dialog.runModal(); } @@ -250,7 +250,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { // we display a warning and continue. Don't warn about the missing device if we did already (this becomes relevant if the // missing device is selected as preferred device and also as GM or MT-32 device). if (failedDevStr != devStr) { - Common::String warningMsg = Common::String::format(_("The preferred audio device '%s' was not found (e.g. might be turned off or disconnected). Attempting to fall back to the next available device..."), devStr.c_str()); + Common::String warningMsg = Common::String::format(_("The preferred audio device '%s' was not found (e.g. might be turned off or disconnected)."), devStr.c_str()) + " " + _("Attempting to fall back to the next available device..."); GUI::MessageDialog dialog(warningMsg); dialog.runModal(); } @@ -265,7 +265,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { // Don't warn about the failing device if we did already (this becomes relevant if the failing // device is selected as preferred device and also as GM or MT-32 device). if (failedDevStr != getDeviceString(hdl, MidiDriver::kDeviceName)) { - Common::String warningMsg = Common::String::format(_("The preferred audio device '%s' cannot be used. See log file for more information. Attempting to fall back to the next available device..."), getDeviceString(hdl, MidiDriver::kDeviceName).c_str()); + Common::String warningMsg = Common::String::format(_("The preferred audio device '%s' cannot be used. See log file for more information."), getDeviceString(hdl, MidiDriver::kDeviceName).c_str()) + " " + _("Attempting to fall back to the next available device..."); GUI::MessageDialog dialog(warningMsg); dialog.runModal(); } @@ -412,4 +412,3 @@ void MidiDriver::sendGMReset() { sysEx(resetSysEx, sizeof(resetSysEx)); g_system->delayMillis(100); } - diff --git a/audio/mixer.cpp b/audio/mixer.cpp index 128224ae85..965766170d 100644 --- a/audio/mixer.cpp +++ b/audio/mixer.cpp @@ -163,9 +163,8 @@ private: uint32 _pauseStartTime; uint32 _pauseTime; - DisposeAfterUse::Flag _autofreeStream; RateConverter *_converter; - AudioStream *_stream; + Common::DisposablePtr<AudioStream> _stream; }; #pragma mark - @@ -492,8 +491,8 @@ Channel::Channel(Mixer *mixer, Mixer::SoundType type, AudioStream *stream, DisposeAfterUse::Flag autofreeStream, bool reverseStereo, int id, bool permanent) : _type(type), _mixer(mixer), _id(id), _permanent(permanent), _volume(Mixer::kMaxChannelVolume), _balance(0), _pauseLevel(0), _samplesConsumed(0), _samplesDecoded(0), _mixerTimeStamp(0), - _pauseStartTime(0), _pauseTime(0), _autofreeStream(autofreeStream), _converter(0), - _stream(stream) { + _pauseStartTime(0), _pauseTime(0), _converter(0), + _stream(stream, autofreeStream) { assert(mixer); assert(stream); @@ -503,8 +502,6 @@ Channel::Channel(Mixer *mixer, Mixer::SoundType type, AudioStream *stream, Channel::~Channel() { delete _converter; - if (_autofreeStream == DisposeAfterUse::YES) - delete _stream; } void Channel::setVolume(const byte volume) { diff --git a/audio/mods/maxtrax.cpp b/audio/mods/maxtrax.cpp index 953bb8f8d2..344d678b76 100644 --- a/audio/mods/maxtrax.cpp +++ b/audio/mods/maxtrax.cpp @@ -707,8 +707,8 @@ int8 MaxTrax::noteOn(ChannelContext &channel, const byte note, uint16 volume, ui if ((channel.flags & ChannelContext::kFlagMono) == 0) { voiceNum = pickvoice((channel.flags & ChannelContext::kFlagRightChannel) != 0 ? 1 : 0, pri); } else { - VoiceContext *voice = _voiceCtx + ARRAYSIZE(_voiceCtx) - 1; - for (voiceNum = ARRAYSIZE(_voiceCtx) - 1; voiceNum >= 0 && voice->channel != &channel; --voiceNum, --voice) + VoiceContext *voice = ARRAYEND(_voiceCtx); + for (voiceNum = ARRAYSIZE(_voiceCtx); voiceNum-- != 0 && --voice->channel != &channel;) ; if (voiceNum < 0) voiceNum = pickvoice((channel.flags & ChannelContext::kFlagRightChannel) != 0 ? 1 : 0, pri); diff --git a/audio/module.mk b/audio/module.mk index 46cb9944e1..e3aa0aaa81 100644 --- a/audio/module.mk +++ b/audio/module.mk @@ -23,10 +23,10 @@ MODULE_OBJS := \ decoders/qdm2.o \ decoders/quicktime.o \ decoders/raw.o \ - decoders/vag.o \ decoders/voc.o \ decoders/vorbis.o \ decoders/wave.o \ + decoders/xa.o \ mods/infogrames.o \ mods/maxtrax.o \ mods/module.o \ diff --git a/audio/mpu401.cpp b/audio/mpu401.cpp index 966e367a93..103a3501db 100644 --- a/audio/mpu401.cpp +++ b/audio/mpu401.cpp @@ -146,6 +146,6 @@ void MidiDriver_MPU401::setTimerCallback(void *timer_param, Common::TimerManager g_system->getTimerManager()->removeTimerProc(_timer_proc); _timer_proc = timer_proc; if (timer_proc) - g_system->getTimerManager()->installTimerProc(timer_proc, 10000, timer_param); + g_system->getTimerManager()->installTimerProc(timer_proc, 10000, timer_param, "MPU401"); } } diff --git a/audio/rate_arm.cpp b/audio/rate_arm.cpp index 433a7d3423..4135cdd1af 100644 --- a/audio/rate_arm.cpp +++ b/audio/rate_arm.cpp @@ -467,4 +467,3 @@ RateConverter *makeRateConverter(st_rate_t inrate, st_rate_t outrate, bool stere } } // End of namespace Audio - diff --git a/audio/softsynth/appleiigs.cpp b/audio/softsynth/appleiigs.cpp index 6ee70d1202..bbb3f0b005 100644 --- a/audio/softsynth/appleiigs.cpp +++ b/audio/softsynth/appleiigs.cpp @@ -51,4 +51,3 @@ MusicDevices AppleIIGSMusicPlugin::getDevices() const { //#else REGISTER_PLUGIN_STATIC(APPLEIIGS, PLUGIN_TYPE_MUSIC, AppleIIGSMusicPlugin); //#endif - diff --git a/audio/softsynth/cms.cpp b/audio/softsynth/cms.cpp index 67eacd1a41..a675da3f03 100644 --- a/audio/softsynth/cms.cpp +++ b/audio/softsynth/cms.cpp @@ -163,19 +163,15 @@ void CMSEmulator::update(int chip, int16 *buffer, int length) { struct SAA1099 *saa = &_saa1099[chip]; int j, ch; + if (chip == 0) { + memset(buffer, 0, sizeof(int16)*length*2); + } + /* if the channels are disabled we're done */ if (!saa->all_ch_enable) { - /* init output data */ - if (chip == 0) { - memset(buffer, 0, sizeof(int16)*length*2); - } return; } - if (chip == 0) { - memset(buffer, 0, sizeof(int16)*length*2); - } - for (ch = 0; ch < 2; ch++) { switch (saa->noise_params[ch]) { case 0: saa->noise[ch].freq = 31250.0 * 2; break; @@ -244,8 +240,8 @@ void CMSEmulator::update(int chip, int16 *buffer, int length) { } } /* write sound data to the buffer */ - buffer[j*2] += output_l / 6; - buffer[j*2+1] += output_r / 6; + buffer[j*2+0] = CLIP<int>(buffer[j*2+0] + output_l / 6, -32768, 32767); + buffer[j*2+1] = CLIP<int>(buffer[j*2+1] + output_r / 6, -32768, 32767); } } diff --git a/audio/softsynth/eas.cpp b/audio/softsynth/eas.cpp index d829e3b39a..ea79b25329 100644 --- a/audio/softsynth/eas.cpp +++ b/audio/softsynth/eas.cpp @@ -480,4 +480,3 @@ Common::Error EASMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver //#endif #endif - diff --git a/audio/softsynth/emumidi.h b/audio/softsynth/emumidi.h index f3d7645f87..f72dad7eaf 100644 --- a/audio/softsynth/emumidi.h +++ b/audio/softsynth/emumidi.h @@ -26,8 +26,6 @@ #include "audio/mididrv.h" #include "audio/mixer.h" -#define FIXP_SHIFT 16 - class MidiDriver_Emulated : public Audio::AudioStream, public MidiDriver { protected: bool _isOpen; @@ -38,6 +36,10 @@ private: Common::TimerManager::TimerProc _timerProc; void *_timerParam; + enum { + FIXP_SHIFT = 16 + }; + int _nextTick; int _samplesPerTick; diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.h b/audio/softsynth/fmtowns_pc98/towns_audio.h index 4af888f009..211133a1fe 100644 --- a/audio/softsynth/fmtowns_pc98/towns_audio.h +++ b/audio/softsynth/fmtowns_pc98/towns_audio.h @@ -53,4 +53,3 @@ private: }; #endif - diff --git a/audio/softsynth/fmtowns_pc98/towns_euphony.h b/audio/softsynth/fmtowns_pc98/towns_euphony.h index 6b30bfb7f5..bff0e99660 100644 --- a/audio/softsynth/fmtowns_pc98/towns_euphony.h +++ b/audio/softsynth/fmtowns_pc98/towns_euphony.h @@ -181,4 +181,3 @@ private: }; #endif - diff --git a/audio/softsynth/fmtowns_pc98/towns_midi.h b/audio/softsynth/fmtowns_pc98/towns_midi.h index 8c764c55d9..1143dbaa02 100644 --- a/audio/softsynth/fmtowns_pc98/towns_midi.h +++ b/audio/softsynth/fmtowns_pc98/towns_midi.h @@ -81,4 +81,3 @@ private: }; #endif - diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp index 001d258873..05a4079442 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp @@ -1449,4 +1449,3 @@ const uint8 TownsPC98_AudioDriver::_drvTables[] = { }; #undef EUPHONY_FADEOUT_TICKS - diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h index ff58482227..c0009e4957 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h @@ -115,4 +115,3 @@ private: }; #endif - diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h index 4f81fa9a5c..49700be5dc 100644 --- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h +++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -185,4 +185,3 @@ private: }; #endif - diff --git a/audio/softsynth/mt32.cpp b/audio/softsynth/mt32.cpp index 6703a6f7b7..eabde21296 100644 --- a/audio/softsynth/mt32.cpp +++ b/audio/softsynth/mt32.cpp @@ -486,7 +486,7 @@ void MidiDriver_ThreadedMT32::setTimerCallback(void *timer_param, TimerManager:: _vm->_timer->removeTimerProc(_timer_proc); _timer_proc = timer_proc; if (timer_proc) - _vm->_timer->installTimerProc(timer_proc, getBaseTempo(), timer_param); + _vm->_timer->installTimerProc(timer_proc, getBaseTempo(), timer_param, "MT32tempo"); } } diff --git a/audio/softsynth/mt32/mt32_file.cpp b/audio/softsynth/mt32/mt32_file.cpp index cdf9fa13f6..643082b086 100644 --- a/audio/softsynth/mt32/mt32_file.cpp +++ b/audio/softsynth/mt32/mt32_file.cpp @@ -67,4 +67,3 @@ bool File::writeBit32u(Bit32u out) { } } // End of namespace MT32Emu - diff --git a/audio/softsynth/opl/dosbox.h b/audio/softsynth/opl/dosbox.h index 125dde8aec..cdf86df114 100644 --- a/audio/softsynth/opl/dosbox.h +++ b/audio/softsynth/opl/dosbox.h @@ -104,4 +104,3 @@ public: #endif // !DISABLE_DOSBOX_OPL #endif - diff --git a/audio/softsynth/opl/mame.cpp b/audio/softsynth/opl/mame.cpp index 15e869ba33..dd3c354045 100644 --- a/audio/softsynth/opl/mame.cpp +++ b/audio/softsynth/opl/mame.cpp @@ -1245,4 +1245,3 @@ FM_OPL *makeAdLibOPL(int rate) { } // End of namespace MAME } // End of namespace OPL - |