aboutsummaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorMax Horn2004-07-31 11:46:58 +0000
committerMax Horn2004-07-31 11:46:58 +0000
commit4b6dae31eb9dd30c996eb5d428460f26f9c77b40 (patch)
tree5c658f12b5c9a8c02c08405431c50cd3284eea12 /sound
parent76bfd1f92925bc708bec2b970a7e0b1b1a6668d8 (diff)
downloadscummvm-rg350-4b6dae31eb9dd30c996eb5d428460f26f9c77b40.tar.gz
scummvm-rg350-4b6dae31eb9dd30c996eb5d428460f26f9c77b40.tar.bz2
scummvm-rg350-4b6dae31eb9dd30c996eb5d428460f26f9c77b40.zip
changed loadVOCFile to work on a generic ReadStream instead of a File, and renamed it to loadVOCFromStream; removed readVOCFromMemory as it isn't used anymore, and in the future, a MemoryReadstream plus loadVOCFromStream can achieve the same effect
svn-id: r14383
Diffstat (limited to 'sound')
-rw-r--r--sound/voc.cpp129
-rw-r--r--sound/voc.h9
2 files changed, 37 insertions, 101 deletions
diff --git a/sound/voc.cpp b/sound/voc.cpp
index 8ade0f6dbc..42c9e9fb31 100644
--- a/sound/voc.cpp
+++ b/sound/voc.cpp
@@ -22,7 +22,7 @@
#include "stdafx.h"
#include "common/util.h"
-#include "common/file.h"
+#include "common/stream.h"
#include "sound/audiostream.h"
#include "sound/mixer.h"
@@ -43,118 +43,56 @@ int getSampleRateFromVOCRate(int vocSR) {
}
}
-byte *readVOCFromMemory(byte *ptr, int &size, int &rate, int &loops, int &begin_loop, int &end_loop) {
-
- // Verify the VOC header. We are a little bit lenient here to work around
- // some invalid VOC headers used in various SCUMM games (they have 0x0
- // instead of 0x1A after the "Creative Voice File" string).
- if (memcmp(ptr, "Creative Voice File", 19) != 0)
- error("readVOCFromMemory: Invalid header");
- if (ptr[19] != 0x1A)
- debug(3, "readVOCFromMemory: Partially invalid header");
-
- int32 offset = READ_LE_UINT16(ptr + 20);
- int16 version = READ_LE_UINT16(ptr + 22);
- int16 code = READ_LE_UINT16(ptr + 24);
- assert(version == 0x010A || version == 0x0114);
- assert(code == ~version + 0x1234);
-
- int len;
- byte *ret_sound = 0;
- size = 0;
- begin_loop = 0;
- end_loop = 0;
-
- ptr += offset;
- while ((code = *ptr++)) {
- len = *ptr++;
- len |= *ptr++ << 8;
- len |= *ptr++ << 16;
-
- switch(code) {
- case 1: {
- int time_constant = *ptr++;
- int packing = *ptr++;
- len -= 2;
- rate = getSampleRateFromVOCRate(time_constant);
- debug(9, "VOC Data Block: %d, %d, %d", rate, packing, len);
- if (packing == 0) {
- if (size) {
- ret_sound = (byte *)realloc(ret_sound, size + len);
- } else {
- ret_sound = (byte *)malloc(len);
- }
- memcpy(ret_sound + size, ptr, len);
- begin_loop = size;
- size += len;
- end_loop = size;
- } else {
- warning("VOC file packing %d unsupported", packing);
- }
- } break;
- case 6: // begin of loop
- loops = (uint16)READ_LE_UINT16(ptr);
- break;
- case 7: // end of loop
- break;
- default:
- warning("Invalid code in VOC file : %d", code);
- return ret_sound;
- }
- // FIXME some FT samples (ex. 362) has bad length, 2 bytes too short
- ptr += len;
- }
- debug(4, "VOC Data Size : %d", size);
- return ret_sound;
+byte *loadVOCFromStream(Common::ReadStream *stream, int &size, int &rate) {
+ int loops, begin_loop, end_loop;
+ return loadVOCFromStream(stream, size, rate, loops, begin_loop, end_loop);
}
-// FIXME/TODO: loadVOCFile() essentially duplicates all the code from
-// readCreativeVoc(). Obviously this is bad, they should share as much
-// code as possible. One way to do that would be to abstract the
-// reading from memory / from file into a stream class (similar to the
-// RWOps of SDL, for example).
-byte *loadVOCFile(File *file, int &size, int &rate) {
+byte *loadVOCFromStream(Common::ReadStream *stream, int &size, int &rate, int &loops, int &begin_loop, int &end_loop) {
VocFileHeader fileHeader;
- if (file->read(&fileHeader, 8) != 8)
+ if (stream->read(&fileHeader, 8) != 8)
goto invalid;
if (!memcmp(&fileHeader, "VTLK", 4)) {
- if (file->read(&fileHeader, sizeof(VocFileHeader)) != sizeof(VocFileHeader))
+ if (stream->read(&fileHeader, sizeof(VocFileHeader)) != sizeof(VocFileHeader))
goto invalid;
} else if (!memcmp(&fileHeader, "Creative", 8)) {
- if (file->read(((byte *)&fileHeader) + 8, sizeof(VocFileHeader) - 8) != sizeof(VocFileHeader) - 8)
+ if (stream->read(((byte *)&fileHeader) + 8, sizeof(VocFileHeader) - 8) != sizeof(VocFileHeader) - 8)
goto invalid;
} else {
invalid:;
- warning("loadVOCFile: Invalid header");
+ warning("loadVOCFromStream: Invalid header");
return NULL;
}
if (memcmp(fileHeader.desc, "Creative Voice File", 19) != 0)
- error("loadVOCFile: Invalid header");
+ error("loadVOCFromStream: Invalid header");
if (fileHeader.desc[19] != 0x1A)
- debug(3, "loadVOCFile: Partially invalid header");
+ debug(3, "loadVOCFromStream: Partially invalid header");
- //int32 offset = FROM_LE_16(fileHeader.datablock_offset);
+ int32 offset = FROM_LE_16(fileHeader.datablock_offset);
int16 version = FROM_LE_16(fileHeader.version);
int16 code = FROM_LE_16(fileHeader.id);
+ assert(offset == sizeof(VocFileHeader));
assert(version == 0x010A || version == 0x0114);
assert(code == ~version + 0x1234);
int len;
byte *ret_sound = 0;
size = 0;
+ begin_loop = 0;
+ end_loop = 0;
- while ((code = file->readByte())) {
- len = file->readByte();
- len |= file->readByte() << 8;
- len |= file->readByte() << 16;
+ while ((code = stream->readByte())) {
+ len = stream->readByte();
+ len |= stream->readByte() << 8;
+ len |= stream->readByte() << 16;
switch(code) {
case 1: {
- int time_constant = file->readByte();
- int packing = file->readByte();
+ int time_constant = stream->readByte();
+ int packing = stream->readByte();
len -= 2;
rate = getSampleRateFromVOCRate(time_constant);
debug(9, "VOC Data Block: %d, %d, %d", rate, packing, len);
@@ -164,12 +102,21 @@ byte *loadVOCFile(File *file, int &size, int &rate) {
} else {
ret_sound = (byte *)malloc(len);
}
- file->read(ret_sound + size, len);
+ stream->read(ret_sound + size, len);
size += len;
+ begin_loop = size;
+ end_loop = size;
} else {
warning("VOC file packing %d unsupported", packing);
}
} break;
+ case 6: // begin of loop
+ assert(len == 2);
+ loops = stream->readUint16LE();
+ break;
+ case 7: // end of loop
+ assert(len == 0);
+ break;
default:
warning("Invalid code in VOC file : %d", code);
return ret_sound;
@@ -179,19 +126,9 @@ byte *loadVOCFile(File *file, int &size, int &rate) {
return ret_sound;
}
-AudioStream *makeVOCStream(byte *ptr) {
- int size, rate, loops, begin_loop, end_loop;
- byte *data = readVOCFromMemory(ptr, size, rate, loops, begin_loop, end_loop);
-
- if (!data)
- return 0;
-
- return makeLinearInputStream(rate, SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_UNSIGNED, data, size, 0, 0);
-}
-
-AudioStream *makeVOCStream(File *file) {
+AudioStream *makeVOCStream(Common::ReadStream *stream) {
int size, rate;
- byte *data = loadVOCFile(file, size, rate);
+ byte *data = loadVOCFromStream(stream, size, rate);
if (!data)
return 0;
diff --git a/sound/voc.h b/sound/voc.h
index 3cfeaeca28..fd4d21738d 100644
--- a/sound/voc.h
+++ b/sound/voc.h
@@ -27,7 +27,7 @@
#include "common/scummsys.h"
class AudioStream;
-class File;
+namespace Common { class ReadStream; }
#if !defined(__GNUC__)
#pragma START_PACK_STRUCTS
@@ -63,10 +63,9 @@ struct VocBlockHeader {
*/
extern int getSampleRateFromVOCRate(int vocSR);
-extern byte *readVOCFromMemory(byte *ptr, int &size, int &rate, int &loops, int &begin_loop, int &end_loop);
-extern byte *loadVOCFile(File *file, int &size, int &rate);
+extern byte *loadVOCFromStream(Common::ReadStream *stream, int &size, int &rate, int &loops, int &begin_loop, int &end_loop);
+extern byte *loadVOCFromStream(Common::ReadStream *stream, int &size, int &rate);
-AudioStream *makeVOCStream(byte *ptr);
-AudioStream *makeVOCStream(File *file);
+AudioStream *makeVOCStream(Common::ReadStream *stream);
#endif