diff options
author | Max Horn | 2010-01-26 22:48:45 +0000 |
---|---|---|
committer | Max Horn | 2010-01-26 22:48:45 +0000 |
commit | 1565f14bc13a63aee6a42cc4fac3fe7fa39eda44 (patch) | |
tree | 41b4b65eb29718398f148dc6f7a6e131376fcc27 /sound/wave.cpp | |
parent | e0d05a482ce93e029888ef388dfb1b90b438f2ee (diff) | |
download | scummvm-rg350-1565f14bc13a63aee6a42cc4fac3fe7fa39eda44.tar.gz scummvm-rg350-1565f14bc13a63aee6a42cc4fac3fe7fa39eda44.tar.bz2 scummvm-rg350-1565f14bc13a63aee6a42cc4fac3fe7fa39eda44.zip |
Moved audio stream implementations (for MP3, FLAC, etc.) to new dir sound/decoders/
svn-id: r47579
Diffstat (limited to 'sound/wave.cpp')
-rw-r--r-- | sound/wave.cpp | 195 |
1 files changed, 0 insertions, 195 deletions
diff --git a/sound/wave.cpp b/sound/wave.cpp deleted file mode 100644 index 45974cf69c..0000000000 --- a/sound/wave.cpp +++ /dev/null @@ -1,195 +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$ - * - */ - -#include "common/debug.h" -#include "common/util.h" -#include "common/stream.h" - -#include "sound/audiostream.h" -#include "sound/mixer.h" -#include "sound/wave.h" -#include "sound/adpcm.h" -#include "sound/raw.h" - -namespace Audio { - -bool loadWAVFromStream(Common::SeekableReadStream &stream, int &size, int &rate, byte &flags, uint16 *wavType, int *blockAlign_) { - const int32 initialPos = stream.pos(); - byte buf[4+1]; - - buf[4] = 0; - - stream.read(buf, 4); - if (memcmp(buf, "RIFF", 4) != 0) { - warning("getWavInfo: No 'RIFF' header"); - return false; - } - - int32 wavLength = stream.readUint32LE(); - - stream.read(buf, 4); - if (memcmp(buf, "WAVE", 4) != 0) { - warning("getWavInfo: No 'WAVE' header"); - return false; - } - - stream.read(buf, 4); - if (memcmp(buf, "fmt ", 4) != 0) { - warning("getWavInfo: No 'fmt' header"); - return false; - } - - uint32 fmtLength = stream.readUint32LE(); - if (fmtLength < 16) { - // A valid fmt chunk always contains at least 16 bytes - warning("getWavInfo: 'fmt' header is too short"); - return false; - } - - // Next comes the "type" field of the fmt header. Some typical - // values for it: - // 1 -> uncompressed PCM - // 17 -> IMA ADPCM compressed WAVE - // See <http://www.saettler.com/RIFFNEW/RIFFNEW.htm> for a more complete - // list of common WAVE compression formats... - uint16 type = stream.readUint16LE(); // == 1 for PCM data - uint16 numChannels = stream.readUint16LE(); // 1 for mono, 2 for stereo - uint32 samplesPerSec = stream.readUint32LE(); // in Hz - uint32 avgBytesPerSec = stream.readUint32LE(); // == SampleRate * NumChannels * BitsPerSample/8 - - uint16 blockAlign = stream.readUint16LE(); // == NumChannels * BitsPerSample/8 - uint16 bitsPerSample = stream.readUint16LE(); // 8, 16 ... - // 8 bit data is unsigned, 16 bit data signed - - - if (wavType != 0) - *wavType = type; - - if (blockAlign_ != 0) - *blockAlign_ = blockAlign; -#if 0 - printf("WAVE information:\n"); - printf(" total size: %d\n", wavLength); - printf(" fmt size: %d\n", fmtLength); - printf(" type: %d\n", type); - printf(" numChannels: %d\n", numChannels); - printf(" samplesPerSec: %d\n", samplesPerSec); - printf(" avgBytesPerSec: %d\n", avgBytesPerSec); - printf(" blockAlign: %d\n", blockAlign); - printf(" bitsPerSample: %d\n", bitsPerSample); -#endif - - if (type != 1 && type != 2 && type != 17) { - warning("getWavInfo: only PCM, MS ADPCM or IMA ADPCM data is supported (type %d)", type); - return false; - } - - if (blockAlign != numChannels * bitsPerSample / 8 && type != 2) { - debug(0, "getWavInfo: blockAlign is invalid"); - } - - if (avgBytesPerSec != samplesPerSec * blockAlign && type != 2) { - debug(0, "getWavInfo: avgBytesPerSec is invalid"); - } - - // Prepare the return values. - rate = samplesPerSec; - - flags = 0; - if (bitsPerSample == 8) // 8 bit data is unsigned - flags |= Audio::FLAG_UNSIGNED; - else if (bitsPerSample == 16) // 16 bit data is signed little endian - flags |= (Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN); - else if (bitsPerSample == 4 && (type == 2 || type == 17)) - flags |= Audio::FLAG_16BITS; - else { - warning("getWavInfo: unsupported bitsPerSample %d", bitsPerSample); - return false; - } - - if (numChannels == 2) - flags |= Audio::FLAG_STEREO; - else if (numChannels != 1) { - warning("getWavInfo: unsupported number of channels %d", numChannels); - return false; - } - - // It's almost certainly a WAV file, but we still need to find its - // 'data' chunk. - - // Skip over the rest of the fmt chunk. - int offset = fmtLength - 16; - - do { - stream.seek(offset, SEEK_CUR); - if (stream.pos() >= initialPos + wavLength + 8) { - warning("getWavInfo: Can't find 'data' chunk"); - return false; - } - stream.read(buf, 4); - offset = stream.readUint32LE(); - -#if 0 - printf(" found a '%s' tag of size %d\n", buf, offset); -#endif - } while (memcmp(buf, "data", 4) != 0); - - // Stream now points at 'offset' bytes of sample data... - size = offset; - - return true; -} - -RewindableAudioStream *makeWAVStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) { - int size, rate; - byte flags; - uint16 type; - int blockAlign; - - if (!loadWAVFromStream(*stream, size, rate, flags, &type, &blockAlign)) { - if (disposeAfterUse == DisposeAfterUse::YES) - delete stream; - return 0; - } - - if (type == 17) // MS IMA ADPCM - return makeADPCMStream(stream, disposeAfterUse, size, Audio::kADPCMMSIma, rate, (flags & Audio::FLAG_STEREO) ? 2 : 1, blockAlign); - else if (type == 2) // MS ADPCM - return makeADPCMStream(stream, disposeAfterUse, size, Audio::kADPCMMS, rate, (flags & Audio::FLAG_STEREO) ? 2 : 1, blockAlign); - - // Raw PCM. Just read everything at once. - // TODO: More elegant would be to wrap the stream. - byte *data = (byte *)malloc(size); - assert(data); - stream->read(data, size); - - if (disposeAfterUse == DisposeAfterUse::YES) - delete stream; - - // Since we allocated our own buffer for the data, we must specify DisposeAfterUse::YES. - return makeRawMemoryStream(data, size, rate, flags); -} - -} // End of namespace Audio |