[Scummvm-cvs-logs] CVS: scummvm bundle.cpp,NONE,1.1 bundle.h,NONE,1.1 Makefile.common,1.14,1.15 scumm.h,1.192,1.193 scummvm.cpp,1.194,1.195 scummvm.dsp,1.47,1.48 sound.cpp,1.117,1.118
Pawe? Ko?odziejski
aquadran at users.sourceforge.net
Sun Jul 28 08:36:03 CEST 2002
Update of /cvsroot/scummvm/scummvm
In directory usw-pr-cvs1:/tmp/cvs-serv24520
Modified Files:
Makefile.common scumm.h scummvm.cpp scummvm.dsp sound.cpp
Added Files:
bundle.cpp bundle.h
Log Message:
moved file bundle stuff into class Bundle
--- NEW FILE: bundle.cpp ---
/* ScummVM - Scumm Interpreter
* Copyright (C) 2002 The ScummVM project
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Header:
*/
#include "stdafx.h"
#include "scumm.h"
#include "scummsys.h"
#include "bundle.h"
Bundle::Bundle(Scumm * parent) {
_voiceFile = NULL;
_musicFile = NULL;
_scumm = parent;
}
Bundle::~Bundle() {
if (_voiceFile != NULL)
fclose (_voiceFile);
if (_musicFile != NULL)
fclose (_musicFile);
}
int32 Bundle::openVoiceFile(char * filename) {
int32 tag, offset;
if (_voiceFile != NULL) {
return false;
}
_voiceFile = fopen(filename, "rb");
if (_voiceFile == NULL) {
printf("Bundle: Can't open voice bundle file: %s\n", filename);
return false;
}
tag = _scumm->fileReadDwordBE(_voiceFile);
offset = _scumm->fileReadDwordBE(_voiceFile);
_numVoiceFiles = _scumm->fileReadDwordBE(_voiceFile);
_bundleVoiceTable = (BundleAudioTable *) malloc(_numVoiceFiles * sizeof(BundleAudioTable));
_scumm->fileSeek(_voiceFile, offset, SEEK_SET);
for (int32 i = 0; i < _numVoiceFiles; i++) {
char name[13], c;
int32 z = 0;
int32 z2;
for (z2 = 0; z2 < 8; z2++)
if ((c = _scumm->fileReadByte(_voiceFile)) != 0)
name[z++] = c;
name[z++] = '.';
for (z2 = 0; z2 < 4; z2++)
if ((c = _scumm->fileReadByte(_voiceFile)) != 0)
name[z++] = c;
name[z] = '\0';
strcpy(_bundleVoiceTable[i].filename, name);
_bundleVoiceTable[i].offset = _scumm->fileReadDwordBE(_voiceFile);
_bundleVoiceTable[i].size = _scumm->fileReadDwordBE(_voiceFile);
}
return true;
}
int32 Bundle::openMusicFile(char * filename) {
int32 tag, offset;
if (_musicFile != NULL) {
return false;
}
_musicFile = fopen(filename, "rb");
if (_musicFile == NULL) {
printf("Bundle: Can't open music bundle file: %s\n", filename);
return false;
}
tag = _scumm->fileReadDwordBE(_musicFile);
offset = _scumm->fileReadDwordBE(_musicFile);
_numMusicFiles = _scumm->fileReadDwordBE(_musicFile);
_bundleMusicTable = (BundleAudioTable *) malloc(_numMusicFiles * sizeof(BundleAudioTable));
_scumm->fileSeek(_musicFile, offset, SEEK_SET);
for (int32 i = 0; i < _numMusicFiles; i++) {
char name[13], c;
int z = 0;
int z2;
for (z2 = 0;z2 < 8; z2++)
if ((c = _scumm->fileReadByte(_musicFile)) != 0)
name[z++] = c;
name[z++] = '.';
for (z2 = 0;z2 < 4; z2++)
if ((c = _scumm->fileReadByte(_musicFile)) != 0)
name[z++] = c;
name[z] = '\0';
strcpy(_bundleVoiceTable[i].filename, name);
_bundleVoiceTable[i].offset = _scumm->fileReadDwordBE(_musicFile);
_bundleVoiceTable[i].size = _scumm->fileReadDwordBE(_musicFile);
}
return true;
}
int32 Bundle::decompressVoiceSampleByIndex(int32 index, byte * comp_final) {
int32 i, tag, num, final_size, output_size;
byte * comp_input, * comp_output;
if (_voiceFile == NULL) {
printf("Bundle: voice file is not open !\n");
return 0;
}
_scumm->fileSeek(_voiceFile, _bundleVoiceTable[index].offset, SEEK_SET);
tag = _scumm->fileReadDwordBE(_voiceFile);
num = _scumm->fileReadDwordBE(_voiceFile);
_scumm->fileReadDwordBE(_voiceFile);
_scumm->fileReadDwordBE(_voiceFile);
if (tag != MKID_BE('COMP')) {
warning("Bundle: Compressed sound %d invalid (%c%c%c%c)", index, tag>>24, tag>>16, tag>>8, tag);
return 0;
}
for (i = 0; i < num; i++) {
_compVoiceTable[i].offset = _scumm->fileReadDwordBE(_voiceFile);
_compVoiceTable[i].size = _scumm->fileReadDwordBE(_voiceFile);
_compVoiceTable[i].codec = _scumm->fileReadDwordBE(_voiceFile);
_scumm->fileReadDwordBE(_voiceFile);
}
final_size = 0;
comp_output = (byte *)malloc(10000);
for (i = 0; i < num; i++) {
comp_input = (byte *)malloc(_compVoiceTable[i].size);
_scumm->fileSeek(_voiceFile, _bundleVoiceTable[index].offset + _compVoiceTable[i].offset, SEEK_SET);
_scumm->fileRead(_voiceFile, comp_input, _compVoiceTable[i].size);
output_size = decompressCodec(_compVoiceTable[i].codec, comp_input, comp_output, _compVoiceTable[i].size);
memcpy((byte *)&comp_final[final_size], comp_output, output_size);
final_size += output_size;
free(comp_input);
}
free(comp_output);
return final_size;
}
int32 Bundle::decompressMusicSampleByIndex(int32 index, int32 number, byte * comp_final) {
int32 i, tag, num, final_size;
byte * comp_input;
if (_musicFile == NULL) {
printf("Bundle: music file is not open !\n");
return 0;
}
_scumm->fileSeek(_musicFile, _bundleMusicTable[index].offset, SEEK_SET);
tag = _scumm->fileReadDwordBE(_musicFile);
num = _scumm->fileReadDwordBE(_musicFile);
_scumm->fileReadDwordBE(_musicFile);
_scumm->fileReadDwordBE(_musicFile);
if (tag != MKID_BE('COMP')) {
warning("Bundle: Compressed sound %d invalid (%c%c%c%c)", index, tag>>24, tag>>16, tag>>8, tag);
return 0;
}
for (i = 0; i < num; i++) {
_compMusicTable[i].offset = _scumm->fileReadDwordBE(_musicFile);
_compMusicTable[i].size = _scumm->fileReadDwordBE(_musicFile);
_compMusicTable[i].codec = _scumm->fileReadDwordBE(_musicFile);
_scumm->fileReadDwordBE(_musicFile);
}
comp_input = (byte *)malloc(_compMusicTable[i].size);
_scumm->fileSeek(_musicFile, _bundleMusicTable[index].offset + _compMusicTable[i].offset, SEEK_SET);
_scumm->fileRead(_musicFile, comp_input, _compMusicTable[i].size);
final_size = decompressCodec(_compMusicTable[i].codec, comp_input, comp_final, _compMusicTable[i].size);
free(comp_input);
return final_size;
}
int32 Bundle::decompressVoiceSampleByName(char * name, byte * comp_final) {
int32 final_size = 0, i;
if (_voiceFile == NULL) {
printf("Bundle: voice file is not open !\n");
return 0;
}
for (i = 0; i < _numVoiceFiles; i++) {
if (!scumm_stricmp(name, _bundleVoiceTable[i].filename)) {
final_size = decompressVoiceSampleByIndex(i, comp_final);
return final_size;
}
}
return final_size;
}
int32 Bundle::decompressMusicSampleByName(char * name, int32 number, byte * comp_final) {
int32 final_size = 0, i;
if (_voiceFile == NULL) {
printf("Bundle: voice file is not open !\n");
return 0;
}
for (i = 0; i < _numMusicFiles; i++) {
if (!scumm_stricmp(name, _bundleMusicTable[i].filename)) {
final_size = decompressMusicSampleByIndex(i, number, comp_final);
return final_size;
}
}
return final_size;
}
int32 Bundle::getNumberOfMusicSamplesByIndex(int32 index)
{
if (_musicFile == NULL) {
printf("Bundle: music file is not open !\n");
return 0;
}
_scumm->fileSeek(_musicFile, _bundleMusicTable[index].offset, SEEK_SET);
_scumm->fileReadDwordBE(_musicFile);
return _scumm->fileReadDwordBE(_musicFile);
}
int32 Bundle::getNumberOfMusicSamplesByName(char * name) {
int32 number = 0, i;
if (_musicFile == NULL) {
printf("Bundle: music file is not open !\n");
return 0;
}
for (i = 0; i < _numMusicFiles; i++) {
if (!scumm_stricmp(name, _bundleMusicTable[i].filename)) {
number = getNumberOfMusicSamplesByIndex (i);
return number;
}
}
return number;
}
#define NextBit bit = mask & 1; mask >>= 1; if (!--bitsleft) {mask = READ_LE_UINT16(srcptr); srcptr += 2; bitsleft=16;}
int32 Bundle::compDecode(byte * src, byte * dst) {
byte * result, * srcptr = src, * dstptr = dst;
int data, size, bit, bitsleft = 16, mask = READ_LE_UINT16(srcptr);
srcptr += 2;
while(1) {
NextBit
if (bit) {
*dstptr++ = *srcptr++;
} else {
NextBit
if (!bit) {
NextBit size = bit << 1;
NextBit size = (size | bit) + 3;
data = *srcptr++ | 0xffffff00;
} else {
data = *srcptr++;
size = *srcptr++;
data |= 0xfffff000 + ((size & 0xf0) << 4);
size = (size & 0x0f) + 3;
if (size == 3)
if (((*srcptr++) + 1) == 1)
return dstptr - dst;
}
result = dstptr+data;
while (size--)
*dstptr++ = *result++;
}
}
}
#undef NextBit
int32 Bundle::decompressCodec(int32 codec, byte * comp_input, byte * comp_output, int32 input_size) {
int32 output_size = input_size;
int32 offset1, offset2, offset3, length, k, c, s, j, r, t, z;
byte * src, * t_table, * p;
byte t_tmp1, t_tmp2;
switch(codec) {
case 0:
memcpy(comp_input, comp_output, output_size);
break;
case 1:
output_size = compDecode(comp_input, comp_output);
break;
case 2:
output_size = compDecode(comp_input, comp_output);
p = comp_output;
for (z = 1; z < output_size; z++)
p[z] += p[z - 1];
break;
case 3:
output_size = compDecode(comp_input, comp_output);
p = comp_output;
for (z = 2; z < output_size; z++)
p[z] += p[z - 1];
for (z = 1; z < output_size; z++)
p[z] += p[z - 1];
break;
case 4:
output_size = compDecode(comp_input, comp_output);
// FIXME: not implemented yet
memset (comp_output, 0, output_size);
break;
case 5:
output_size = compDecode(comp_input, comp_output);
// FIXME: not implemented yet
memset (comp_output, 0, output_size);
break;
case 6:
output_size = compDecode(comp_input, comp_output);
// FIXME: not implemented yet
memset (comp_output, 0, output_size);
break;
case 10:
output_size = compDecode(comp_input, comp_output);
p = comp_output;
for (z = 2; z < output_size; z++)
p[z] += p[z - 1];
for (z = 1; z < output_size; z++)
p[z] += p[z - 1];
t_table = (byte*)malloc(output_size);
memcpy (t_table, p, output_size);
offset1 = output_size / 3;
offset2 = offset1 * 2;
offset3 = offset2;
src = comp_output;
do {
if (offset1 == 0) break;
offset1--;
offset2 -= 2;
offset3--;
*(t_table + offset2 + 0) = *(src + offset1);
*(t_table + offset2 + 1) = *(src + offset3);
} while(1);
src = comp_output;
length = (output_size * 8) / 12;
k = 0;
if (length > 0)
{
c = -12;
s = 0;
do {
j = length + (k / 2);
if (k & 1) {
r = c / 8;
t_tmp1 = *(t_table + k);
t_tmp2 = *(t_table + j + 1);
*(src + r + 2) = ((t_tmp1 & 0x0f) << 4) | ((t_tmp2 & 0xf0) >> 4);
*(src + r + 1) = (*(src + r + 1)) | (t_tmp1 & 0xf0);
} else {
r = s / 8;
t_tmp1 = *(t_table + k);
t_tmp2 = *(t_table + j);
*(src + r + 0) = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 & 0x0f);
*(src + r + 1) = ((t_tmp1 & 0xf0) >> 4);
}
s += 12;
k++;
c += 12;
} while (k <= length);
}
free (t_table);
break;
case 11:
output_size = compDecode(comp_input, comp_output);
p = comp_output;
for (z = 2; z < output_size; z++)
p[z] += p[z - 1];
for (z = 1; z < output_size; z++)
p[z] += p[z - 1];
t_table = (byte*)malloc(output_size);
memcpy (t_table, p, output_size);
offset1 = output_size / 3;
offset2 = offset1 * 2;
offset3 = offset2;
src = comp_output;
do {
if (offset1 == 0) break;
offset1--;
offset2 -= 2;
offset3--;
*(t_table + offset2 + 0) = *(src + offset1);
*(t_table + offset2 + 1) = *(src + offset3);
} while(1);
src = comp_output;
length = (output_size * 8) / 12;
k = 1;
c = 0;
s = 12;
t_tmp1 = (*(t_table + length)) >> 4;
*(src) = t_tmp1;
t = length + k;
if (t > k) {
do {
j = length + (k / 2);
if (k & 1) {
r = c / 8;
t_tmp1 = *(t_table + k - 1);
t_tmp2 = *(t_table + j);
*(src + r + 0) = (*(src + r)) | (t_tmp1 & 0xf0);
*(src + r + 1) = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 & 0x0f);
} else {
r = s / 8;
t_tmp1 = *(t_table + k - 1);
t_tmp2 = *(t_table + j);
*(src + r + 0) = (t_tmp1 & 0xf0) >> 4;
*(src + r - 1) = ((t_tmp1 & 0x0f) << 4) | ((t_tmp2 & 0xf0) >> 4);
}
s += 12;
k++;
c += 12;
} while (k < t);
}
free (t_table);
break;
case 12:
output_size = compDecode(comp_input, comp_output);
p = comp_output;
for (z = 2; z < output_size; z++)
p[z] += p[z - 1];
for (z = 1; z < output_size; z++)
p[z] += p[z - 1];
t_table = (byte*)malloc(output_size);
memcpy (t_table, p, output_size);
offset1 = output_size / 3;
offset2 = offset1 * 2;
offset3 = offset2;
src = comp_output;
do {
if (offset1 == 0) break;
offset1--;
offset2 -= 2;
offset3--;
*(t_table + offset2 + 0) = *(src + offset1);
*(t_table + offset2 + 1) = *(src + offset3);
} while(1);
src = comp_output;
length = (output_size * 8) / 12;
k = 0;
c = 0;
s = -12;
*(src) = *(output_size + t_table - 1);
*(src + output_size - 1) = *(t_table + length - 1);
t = length - 1;
if (t > 0) {
do {
j = length + (k / 2);
if (k & 1) {
r = s / 8;
t_tmp1 = *(t_table + k);
t_tmp2 = *(t_table + j);
*(src + r + 2) = (*(src + r + 2)) | (t_tmp1 & 0xf0);
*(src + r + 3) = ((t_tmp1 & 0x0f) << 4) | ((t_tmp2 & 0xf0) >> 4);
} else {
r = c / 8;
t_tmp1 = *(t_table + k);
t_tmp2 = *(t_table + j);
*(src + r + 2) = (t_tmp1 & 0xf0) >> 4;
*(src + r + 1) = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 & 0x0f);
}
s += 12;
k++;
c += 12;
} while (k < t);
}
free (t_table);
break;
default:
printf("Bundle: Unknown codec %d!\n", codec);
output_size = 0;
break;
}
return output_size;
}
--- NEW FILE: bundle.h ---
/* ScummVM - Scumm Interpreter
* Copyright (C) 2002 The ScummVM project
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Header:
*/
#ifndef BUNDLE_H
#define BUNDLE_H
#include "scummsys.h"
struct CompTable {
int32 offset;
int32 size;
int32 codec;
};
struct BundleAudioTable {
char filename[13];
int32 size;
int32 offset;
};
class Scumm;
class Bundle {
protected:
private:
int32 compDecode(byte * src, byte * dst);
int32 decompressCodec(int32 codec, byte * comp_input, byte * comp_output, int32 size);
CompTable _compVoiceTable[50];
CompTable _compMusicTable[2500];
FILE * _voiceFile;
FILE * _musicFile;
BundleAudioTable * _bundleVoiceTable;
BundleAudioTable * _bundleMusicTable;
int32 _numVoiceFiles;
int32 _numMusicFiles;
Scumm * _scumm;
public:
Bundle(Scumm * parent);
~Bundle();
int32 openVoiceFile(char * filename);
int32 openMusicFile(char * filename);
int32 decompressVoiceSampleByName(char * name, byte * comp_final);
int32 decompressVoiceSampleByIndex(int32 index, byte * comp_final);
int32 decompressMusicSampleByName(char * name, int32 number, byte * comp_final);
int32 decompressMusicSampleByIndex(int32 index, int32 number, byte * comp_final);
int32 getNumberOfMusicSamplesByIndex(int32 index);
int32 getNumberOfMusicSamplesByName(char * name);
};
#endif
Index: Makefile.common
===================================================================
RCS file: /cvsroot/scummvm/scummvm/Makefile.common,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- Makefile.common 17 Jul 2002 20:55:35 -0000 1.14
+++ Makefile.common 28 Jul 2002 15:35:25 -0000 1.15
@@ -16,7 +16,7 @@
v3/resource_v3.o v4/resource_v4.o scaler.o main.o \
simon/midi.o simon/simon.o simon/simonsys.o simon/simonvga.o \
simon/simondebug.o simon/simonres.o simon/simonitems.o simon/simonverb.o \
- sound/mididrv.o config-file.o
+ sound/mididrv.o config-file.o bundle.o
DISTFILES=$(OBJS:.o=.cpp) Makefile scumm.h scummsys.h stdafx.h stdafx.cpp \
debugrl.h whatsnew.txt readme.txt copying.txt \
Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm.h,v
retrieving revision 1.192
retrieving revision 1.193
diff -u -d -r1.192 -r1.193
--- scumm.h 28 Jul 2002 15:03:45 -0000 1.192
+++ scumm.h 28 Jul 2002 15:35:25 -0000 1.193
@@ -26,6 +26,7 @@
#include "scummsys.h"
#include "system.h"
#include "sound/mixer.h"
+#include "bundle.h"
#define SCUMMVM_VERSION "0.2.2 CVS"
#define SCUMMVM_CVS "2002-07-16"
@@ -337,6 +338,7 @@
VerbSlot *_verbs;
ObjectData *_objs;
ScummDebugger *_debugger;
+ Bundle * _bundle;
struct {
byte mode[rtNumTypes];
@@ -765,7 +767,6 @@
MP3OffsetTable *offset_table; // SO3 MP3 compressed audio
int num_sound_effects; // SO3 MP3 compressed audio
- BundleAudioTable *bundle_table; // DIG/CMI bundles
void pauseSounds(bool pause);
bool isSfxFinished();
void playBundleSound(char *sound);
Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scummvm.cpp,v
retrieving revision 1.194
retrieving revision 1.195
diff -u -d -r1.194 -r1.195
--- scummvm.cpp 28 Jul 2002 15:03:45 -0000 1.194
+++ scummvm.cpp 28 Jul 2002 15:35:25 -0000 1.195
@@ -84,6 +84,7 @@
setShake(0);
setupCursor();
+ _bundle = new Bundle(this);
/* Allocate and initilise actors */
_actors = new Actor[MAX_ACTORS];
for (i = 1, a = getFirstActor(); ++a, i < NUM_ACTORS; i++) {
@@ -1582,6 +1583,7 @@
launch();
setupGUIColors();
mainRun();
+ delete _bundle;
}
Index: scummvm.dsp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scummvm.dsp,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -d -r1.47 -r1.48
--- scummvm.dsp 18 Jul 2002 18:40:56 -0000 1.47
+++ scummvm.dsp 28 Jul 2002 15:35:25 -0000 1.48
@@ -297,6 +297,10 @@
# End Source File
# Begin Source File
+SOURCE=.\bundle.cpp
+# End Source File
+# Begin Source File
+
SOURCE=".\config-file.cpp"
# End Source File
# Begin Source File
@@ -554,6 +558,10 @@
# Begin Source File
SOURCE=.\boxes.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\bundle.h
# End Source File
# Begin Source File
Index: sound.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound.cpp,v
retrieving revision 1.117
retrieving revision 1.118
diff -u -d -r1.117 -r1.118
--- sound.cpp 28 Jul 2002 15:03:45 -0000 1.117
+++ sound.cpp 28 Jul 2002 15:35:26 -0000 1.118
@@ -710,46 +710,6 @@
char buf[256];
FILE *file = NULL;
- if (_gameId == GID_DIG) {
- int tag, offset, num_files;
-
- sprintf(buf, "%s%svoice.bun", _gameDataPath, _exe_name);
- file = fopen(buf, "rb");
- if (!file) {
- warning("Unable to open DIG voice bundle: %s", buf);
- return NULL;
- }
-
- tag = fileReadDwordBE(file);
- offset = fileReadDwordBE(file);
- num_files = fileReadDwordBE(file);
-
- bundle_table = (BundleAudioTable *) malloc(num_files * sizeof(BundleAudioTable));
- num_sound_effects = num_files;
- fileSeek(file, offset, SEEK_SET);
-
- for (int i=0; i < num_files; i++) {
- char filename[13], c;
- int z = 0;
- int z2;
-
- /* Construct filename */
- for (z2=0;z2<8; z2++)
- if ((c = fileReadByte(file)) != 0)
- filename[z++] = c;
- filename[z++] = '.';
- for (z2=0;z2<4;z2++)
- if ((c = fileReadByte(file)) != 0)
- filename[z++] = c;
- filename[z] = '\0';
- strcpy(bundle_table[i].filename, filename);
- bundle_table[i].offset = fileReadDwordBE(file);
- bundle_table[i].size = fileReadDwordBE(file);
- }
-
- return file;
- }
-
/* Try opening the file <_exe_name>.sou first, eg tentacle.sou.
* That way, you can keep .sou files for multiple games in the
* same directory */
@@ -817,353 +777,62 @@
return !_mixer->has_active_channel();
}
-#define NextBit bit = mask&1; mask>>=1; if (!--bitsleft) {mask = READ_LE_UINT16(srcptr); srcptr+=2; bitsleft=16;}
-int CompDecode(unsigned char *src, unsigned char *dst)
+void Scumm::playBundleSound(char *sound)
{
- unsigned char *result, *srcptr = src, *dstptr = dst;
- int data, size, bit, bitsleft = 16, mask = READ_LE_UINT16(srcptr);
- srcptr+=2;
-
- while(1) {
- NextBit
- if (bit) {
- *dstptr++ = *srcptr++;
- } else {
- NextBit
- if (!bit) {
- NextBit size = bit<<1;
- NextBit size = (size|bit) + 3;
- data = *srcptr++ | 0xffffff00;
- } else {
- data = *srcptr++;
- size = *srcptr++;
-
- data |= 0xfffff000 + ((size & 0xf0) << 4);
- size = (size & 0x0f) + 3;
+ char buf[256];
+ byte * ptr;
- if (size==3)
- if (((*srcptr++)+1) == 1)
- return dstptr - dst; /* End of buffer */
- }
- result = dstptr+data;
- while (size--)
- *dstptr++=*result++;
- }
+ sprintf(buf, "%s%svoice.bun", _gameDataPath, _exe_name);
+ _bundle->openVoiceFile((char*)&buf);
+ ptr = (byte *)malloc(1000000);
+ if (_bundle->decompressVoiceSampleByName(sound, ptr) == 0) {
+ delete ptr;
+ return;
}
-}
-#undef NextBit
-typedef struct {int offset, size, codec;} COMP_table;
-void Scumm::decompressBundleSound(int index) {
- int i, z;
- COMP_table table[50];
- unsigned char *CompInput, *CompOutput, *CompFinal, *Final;
- int outputSize, finalSize;
- int32 offset1, offset2, offset3, length, k, c, s, j, r, t;
- byte * src, * t_table;
- byte t_tmp1, t_tmp2;
-
- fileSeek(_sfxFile, bundle_table[index].offset, SEEK_SET);
-
- int tag = fileReadDwordBE(_sfxFile);
- int num = fileReadDwordBE(_sfxFile);
- fileReadDwordBE(_sfxFile); fileReadDwordBE(_sfxFile);
-
+ int rate = 22050;
+ int tag, size = -1;
- // DO -NOT- change these MKID_BE calls to MKID! If you have
- // to do so, then your ScummSys.H file is detecting the
- // wrong endian. - Ender
- if (tag != MKID_BE('COMP')) {
- warning("Compressed sound %d invalid (%c%c%c%c)", index, tag>>24, tag>>16, tag>>8, tag);
+ tag = READ_BE_UINT32(ptr); ptr+=4;
+ if (tag != MKID_BE('iMUS')) {
+ warning("Decompression of bundle sound failed");
+ free(ptr);
return;
}
- /* Read compression table */
- for (i=0; i<num; i++) {
- table[i].offset = fileReadDwordBE(_sfxFile);
- table[i].size = fileReadDwordBE(_sfxFile);
- table[i].codec = fileReadDwordBE(_sfxFile);
- fileReadDwordBE(_sfxFile);
- }
-
- CompFinal = (unsigned char *)malloc(1000000);
-
- finalSize = 0;
-
- /* Decompress data */
- for (i=0; i<num; i++) {
- unsigned char *p;
- fileSeek(_sfxFile, bundle_table[index].offset + table[i].offset, SEEK_SET);
-
- CompInput = (unsigned char *)malloc(table[i].size);
- CompOutput = (unsigned char *)malloc(10000);
-
- fileRead((FILE *)_sfxFile, CompInput, table[i].size);
-
- switch(table[i].codec) {
- case 0:
- outputSize = table[i].size;
- memcpy(&CompOutput[0], &CompInput[0], outputSize);
- break;
-
- case 1:
- outputSize = CompDecode(&CompInput[0], &CompOutput[0]);
- break;
-
- case 2:
- outputSize = CompDecode(&CompInput[0], &CompOutput[0]);
- p = CompOutput;
- for (z = 1; z < outputSize; z++)
- p[z] += p[z - 1];
- break;
-
- case 3:
- outputSize = CompDecode(&CompInput[0], &CompOutput[0]);
- p = CompOutput;
- for (z = 2; z < outputSize; z++)
- p[z] += p[z - 1];
- for (z = 1; z < outputSize; z++)
- p[z] += p[z - 1];
- break;
-
- case 10:
- outputSize = CompDecode(&CompInput[0], &CompOutput[0]);
- p = CompOutput;
- for (z = 2; z < outputSize; z++)
- p[z] += p[z - 1];
- for (z = 1; z < outputSize; z++)
- p[z] += p[z - 1];
-
- t_table = (byte*)malloc(outputSize);
- memcpy (t_table, p, outputSize);
-
- offset1 = outputSize / 3;
- offset2 = offset1 * 2;
- offset3 = offset2;
- src = CompOutput;
- do {
- if (offset1 == 0) break;
- offset1--;
- offset2 -= 2;
- offset3--;
- *(t_table + offset2 + 0) = *(src + offset1);
- *(t_table + offset2 + 1) = *(src + offset3);
- } while(1);
-
- src = CompOutput;
- length = (outputSize * 8) / 12;
- k = 0;
- if (length > 0)
- {
- c = -12;
- s = 0;
- do {
- j = length + (k / 2);
- if (k & 1) {
- r = c / 8;
- t_tmp1 = *(t_table + k);
- t_tmp2 = *(t_table + j + 1);
- *(src + r + 2) = ((t_tmp1 & 0x0f) << 4) | ((t_tmp2 & 0xf0) >> 4);
- *(src + r + 1) = (*(src + r + 1)) | (t_tmp1 & 0xf0);
- } else {
- r = s / 8;
- t_tmp1 = *(t_table + k);
- t_tmp2 = *(t_table + j);
- *(src + r + 0) = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 & 0x0f);
- *(src + r + 1) = ((t_tmp1 & 0xf0) >> 4);
- }
- s += 12;
- k++;
- c += 12;
- } while (k <= length);
- }
+ ptr += 12;
+ while(tag != MKID_BE('DATA')) {
+ tag = READ_BE_UINT32(ptr); ptr+=4;
+ switch(tag) {
+ case MKID_BE('FRMT'):
+ size = READ_BE_UINT32(ptr); ptr+=16;
+ rate = READ_BE_UINT32(ptr); ptr+=8;
break;
-
- case 11:
- outputSize = CompDecode(&CompInput[0], &CompOutput[0]);
- p = CompOutput;
- for (z = 2; z < outputSize; z++)
- p[z] += p[z - 1];
- for (z = 1; z < outputSize; z++)
- p[z] += p[z - 1];
-
- t_table = (byte*)malloc(outputSize);
- memcpy (t_table, p, outputSize);
-
- offset1 = outputSize / 3;
- offset2 = offset1 * 2;
- offset3 = offset2;
- src = CompOutput;
- do {
- if (offset1 == 0) break;
- offset1--;
- offset2 -= 2;
- offset3--;
- *(t_table + offset2 + 0) = *(src + offset1);
- *(t_table + offset2 + 1) = *(src + offset3);
- } while(1);
-
- src = CompOutput;
- length = (outputSize * 8) / 12;
- k = 1;
- c = 0;
- s = 12;
- t_tmp1 = (*(t_table + length)) >> 4;
- *(src) = t_tmp1;
- t = length + k;
- if (t > k) {
- do {
- j = length + (k / 2);
- if (k & 1) {
- r = c / 8;
- t_tmp1 = *(t_table + k - 1);
- t_tmp2 = *(t_table + j);
- *(src + r + 0) = (*(src + r)) | (t_tmp1 & 0xf0);
- *(src + r + 1) = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 & 0x0f);
- } else {
- r = s / 8;
- t_tmp1 = *(t_table + k - 1);
- t_tmp2 = *(t_table + j);
- *(src + r + 0) = (t_tmp1 & 0xf0) >> 4;
- *(src + r - 1) = ((t_tmp1 & 0x0f) << 4) | ((t_tmp2 & 0xf0) >> 4);
- }
- s += 12;
- k++;
- c += 12;
- } while (k < t);
- }
-
+ case MKID_BE('TEXT'):
+ case MKID_BE('REGN'):
+ case MKID_BE('STOP'):
+ case MKID_BE('JUMP'):
+ size = READ_BE_UINT32(ptr); ptr+=size+4;
break;
- case 12:
- outputSize = CompDecode(&CompInput[0], &CompOutput[0]);
- p = CompOutput;
- for (z = 2; z < outputSize; z++)
- p[z] += p[z - 1];
- for (z = 1; z < outputSize; z++)
- p[z] += p[z - 1];
-
- t_table = (byte*)malloc(outputSize);
- memcpy (t_table, p, outputSize);
-
- offset1 = outputSize / 3;
- offset2 = offset1 * 2;
- offset3 = offset2;
- src = CompOutput;
- do {
- if (offset1 == 0) break;
- offset1--;
- offset2 -= 2;
- offset3--;
- *(t_table + offset2 + 0) = *(src + offset1);
- *(t_table + offset2 + 1) = *(src + offset3);
- } while(1);
-
- src = CompOutput;
- length = (outputSize * 8) / 12;
- k = 0;
- c = 0;
- s = -12;
- *(src) = *(outputSize + t_table - 1);
- *(src + outputSize - 1) = *(t_table + length - 1);
- t = length - 1;
- if (t > 0) {
- do {
- j = length + (k / 2);
- if (k & 1) {
- r = s / 8;
- t_tmp1 = *(t_table + k);
- t_tmp2 = *(t_table + j);
- *(src + r + 2) = (*(src + r + 2)) | (t_tmp1 & 0xf0);
- *(src + r + 3) = ((t_tmp1 & 0x0f) << 4) | ((t_tmp2 & 0xf0) >> 4);
- } else {
- r = c / 8;
- t_tmp1 = *(t_table + k);
- t_tmp2 = *(t_table + j);
- *(src + r + 2) = (t_tmp1 & 0xf0) >> 4;
- *(src + r + 1) = ((t_tmp1 & 0x0f) << 4) | (t_tmp2 & 0x0f);
- }
- s += 12;
- k++;
- c += 12;
- } while (k < t);
- }
-
+ case MKID_BE('DATA'):
+ size = READ_BE_UINT32(ptr); ptr+=4;
break;
default:
- printf("Unknown codec %d!\n", table[i].codec);
- outputSize = 0;
- break;
- }
- memcpy(&CompFinal[finalSize], &CompOutput[0], outputSize);
- finalSize+=outputSize;
-
- free(CompInput); CompInput = NULL;
- free(CompOutput); CompOutput= NULL;
- }
-
- { /* Parse decompressed data */
- int rate = 22050;
- byte *ptr = CompFinal;
- int tag, size = -1;
- tag = READ_BE_UINT32(ptr); ptr+=4;
- if (tag != MKID_BE('iMUS')) {
- warning("Decompression of bundle sound failed");
- free(CompFinal);
- return;
- }
-
- ptr+=12; /* Skip header */
- while(tag != MKID_BE('DATA')) {
- tag = READ_BE_UINT32(ptr); ptr+=4;
- switch(tag) {
- case MKID_BE('FRMT'):
- size = READ_BE_UINT32(ptr); ptr+=16;
- rate = READ_BE_UINT32(ptr); ptr+=8;
- break;
- case MKID_BE('TEXT'):
- case MKID_BE('REGN'):
- case MKID_BE('STOP'):
- size = READ_BE_UINT32(ptr); ptr+=size+4;
- break;
-
- case MKID_BE('DATA'):
- size = READ_BE_UINT32(ptr); ptr+=4;
- break;
-
- default:
- error("Unknown bundle header %c%c%c%c", tag>>24, tag>>16, tag>>8, tag);
- }
- }
-
- if (size < 0) {
- warning("Decompression of bundle sound failed (no size field)");
- free(CompFinal);
- return;
+ error("Unknown sound header %c%c%c%c", tag>>24, tag>>16, tag>>8, tag);
}
- Final = (unsigned char *)malloc(size);
- memcpy(&Final[0], &ptr[0], size);
- _mixer->play_raw(NULL, Final, size, rate, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE);
- free(CompFinal);
}
-}
-void Scumm::playBundleSound(char *sound)
-{
- if (!_sfxFile) {
- warning("playBundleSound: SFX file is not open");
+ if (size < 0) {
+ warning("Decompression sound failed (no size field)");
+ free(ptr);
return;
}
-
- for (int i=0; i < num_sound_effects; i++) {
- if (!scumm_stricmp(sound, bundle_table[i].filename)) {
- decompressBundleSound(i);
- return;
- }
- }
-
- warning("playBundleSound can't find %s", sound);
+
+ byte * final = (byte *)malloc(size);
+ memcpy(final, ptr, size);
+ _mixer->play_raw(NULL, final, size, rate, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE);
}
int Scumm::playSfxSound(void *sound, uint32 size, uint rate)
More information about the Scummvm-git-logs
mailing list