[Scummvm-git-logs] scummvm-tools master -> bdf059dd03c80138f96991d8ea797bfbdb418873

sev- sev at scummvm.org
Mon Dec 7 22:08:12 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm-tools' repo located at https://github.com/scummvm/scummvm-tools .

Summary:
0a5cd25d6d SCUMM: Repack raw iMuse as used by Akella COMI localization
bdf059dd03 SCUMM: Skip garbage files when converting BUNs


Commit: 0a5cd25d6d12a030b48fca5ea7a031423e4ab4f7
    https://github.com/scummvm/scummvm-tools/commit/0a5cd25d6d12a030b48fca5ea7a031423e4ab4f7
Author: Vladimir Serbinenko (phcoder at google.com)
Date: 2020-12-07T23:08:08+01:00

Commit Message:
SCUMM: Repack raw iMuse as used by Akella COMI localization

This is a counterpart of https://github.com/scummvm/scummvm/pull/2668

Changed paths:
    engines/scumm/compress_scumm_bun.cpp
    engines/scumm/compress_scumm_bun.h


diff --git a/engines/scumm/compress_scumm_bun.cpp b/engines/scumm/compress_scumm_bun.cpp
index 4065c1393..89faefbcb 100644
--- a/engines/scumm/compress_scumm_bun.cpp
+++ b/engines/scumm/compress_scumm_bun.cpp
@@ -696,7 +696,7 @@ void CompressScummBun::writeWaveHeader(int s_size, int rate, int chan) {
 	_waveTmpFile.close();
 }
 
-void CompressScummBun::writeToTempWave(char *fileName, byte *output_data, unsigned int size) {
+void CompressScummBun::writeToTempWave(char *fileName, byte *output_data, unsigned int size, bool littleEndian) {
 	if (!_waveTmpFile.isOpen()) {
 		_waveTmpFile.open(fileName, "wb");
 		byte wav[44];
@@ -704,10 +704,12 @@ void CompressScummBun::writeToTempWave(char *fileName, byte *output_data, unsign
 		_waveTmpFile.write(output_data, 44);
 		_waveDataSize = 0;
 	}
-	for (unsigned int j = 0; j < size - 1; j += 2) {
-		byte tmp = output_data[j + 0];
-		output_data[j + 0] = output_data[j + 1];
-		output_data[j + 1] = tmp;
+	if (!littleEndian) {
+		for (unsigned int j = 0; j < size - 1; j += 2) {
+			byte tmp = output_data[j + 0];
+			output_data[j + 0] = output_data[j + 1];
+			output_data[j + 1] = tmp;
+		}
 	}
 	_waveTmpFile.write(output_data, size);
 	_waveDataSize += size;
@@ -715,13 +717,22 @@ void CompressScummBun::writeToTempWave(char *fileName, byte *output_data, unsign
 
 typedef struct { int offset, size, codec; } CompTable;
 
-byte *CompressScummBun::decompressBundleSound(int index, Common::File  &input, int32 &finalSize) {
+byte *CompressScummBun::decompressBundleSound(int index, Common::File  &input, int32 &finalSize, bool &rawMuse) {
 	byte compOutput[0x2000];
 	int i;
 
 	input.seek(_bundleTable[index].offset, SEEK_SET);
 
 	uint32 tag = input.readUint32BE();
+	if (tag == 'iMUS') {
+		input.seek(_bundleTable[index].offset, SEEK_SET);
+		finalSize = _bundleTable[index].size;
+		byte *compFinal = (byte *)malloc(finalSize);
+		input.read_throwsOnError(compFinal, finalSize);
+		rawMuse = true;
+		return compFinal;
+	}
+	rawMuse = false;
 	assert(tag == 'COMP');
 	int numCompItems = input.readUint32BE();
 	input.seek(8, SEEK_CUR);
@@ -867,7 +878,7 @@ struct Marker {
 static Region *_region;
 static int _numRegions;
 
-void CompressScummBun::writeRegions(byte *ptr, int bits, int freq, int channels, const char *dir, char *filename, Common::File &output) {
+void CompressScummBun::writeRegions(byte *ptr, int bits, int freq, int channels, const char *dir, char *filename, Common::File &output, bool littleEndian) {
 	char tmpPath[200];
 
 	for (int l = 0; l < _numRegions; l++) {
@@ -876,7 +887,7 @@ void CompressScummBun::writeRegions(byte *ptr, int bits, int freq, int channels,
 		int offset = _region[l].offset;
 		byte *outputData = convertTo16bit(ptr + offset, size, outputSize, bits, freq, channels);
 		sprintf(tmpPath, "%s%s_reg%03d.wav", dir, filename, l);
-		writeToTempWave(tmpPath, outputData, outputSize);
+		writeToTempWave(tmpPath, outputData, outputSize, littleEndian);
 		writeWaveHeader(_waveDataSize, freq, channels);
 		free(outputData);
 		sprintf(tmpPath, "%s%s_reg%03d", dir, filename, l);
@@ -1143,9 +1154,10 @@ void CompressScummBun::execute() {
 
 		int offsetData = 0, bits = 0, freq = 0, channels = 0;
 		int32 size = 0;
-		byte *compFinal = decompressBundleSound(i, input, size);
+		bool rawMuse = false;
+		byte *compFinal = decompressBundleSound(i, input, size, rawMuse);
 		writeToRMAPFile(compFinal, output, _bundleTable[i].filename, offsetData, bits, freq, channels);
-		writeRegions(compFinal + offsetData, bits, freq, channels, outpath.getPath().c_str(), _bundleTable[i].filename, output);
+		writeRegions(compFinal + offsetData, bits, freq, channels, outpath.getPath().c_str(), _bundleTable[i].filename, output, rawMuse && bits == 16);
 		free(compFinal);
 	}
 
diff --git a/engines/scumm/compress_scumm_bun.h b/engines/scumm/compress_scumm_bun.h
index 63b9c0f21..fcd58bff9 100644
--- a/engines/scumm/compress_scumm_bun.h
+++ b/engines/scumm/compress_scumm_bun.h
@@ -52,11 +52,12 @@ protected:
 	void encodeWaveWithOgg(char *filename);
 	void encodeWaveWithLame(char *filename);
 	void writeWaveHeader(int s_size, int rate, int chan);
-	void writeToTempWave(char *fileName, byte *output_data, unsigned int size);
-	byte *decompressBundleSound(int index, Common::File  &input, int32 &finalSize);
+	void writeToTempWave(char *fileName, byte *output_data, unsigned int size, bool littleEndian);
+	byte *decompressBundleSound(int index, Common::File  &input, int32 &finalSize, bool &rawBundle);
 	byte *convertTo16bit(byte *ptr, int inputSize, int &outputSize, int bits, int freq, int channels);
 	void countMapElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs, int &numMarkers);
-	void writeRegions(byte *ptr, int bits, int freq, int channels, const char *dir, char *filename, Common::File &output);
+	void writeRegions(byte *ptr, int bits, int freq, int channels, const char *dir, char *filename, Common::File &output,
+			  bool littleEndian);
 	void recalcRegions(int32 &value, int bits, int freq, int channels);
 	void writeToRMAPFile(byte *ptr, Common::File &output, char *filename, int &offsetData, int &bits, int &freq, int &channels);
 };


Commit: bdf059dd03c80138f96991d8ea797bfbdb418873
    https://github.com/scummvm/scummvm-tools/commit/bdf059dd03c80138f96991d8ea797bfbdb418873
Author: Vladimir Serbinenko (phcoder at google.com)
Date: 2020-12-07T23:08:08+01:00

Commit Message:
SCUMM: Skip garbage files when converting BUNs

Akella localization has 2 garbage files, drop them when repacking. This is
counterpart of https://github.com/scummvm/scummvm/pull/2668

Changed paths:
    engines/scumm/compress_scumm_bun.cpp


diff --git a/engines/scumm/compress_scumm_bun.cpp b/engines/scumm/compress_scumm_bun.cpp
index 89faefbcb..23efabdf8 100644
--- a/engines/scumm/compress_scumm_bun.cpp
+++ b/engines/scumm/compress_scumm_bun.cpp
@@ -732,6 +732,9 @@ byte *CompressScummBun::decompressBundleSound(int index, Common::File  &input, i
 		rawMuse = true;
 		return compFinal;
 	}
+
+	if (tag != 'COMP')
+		return nullptr;
 	rawMuse = false;
 	assert(tag == 'COMP');
 	int numCompItems = input.readUint32BE();
@@ -1156,6 +1159,10 @@ void CompressScummBun::execute() {
 		int32 size = 0;
 		bool rawMuse = false;
 		byte *compFinal = decompressBundleSound(i, input, size, rawMuse);
+		if (!compFinal) {
+			printf("%s is garbage. Skipping\n", _bundleTable[i].filename);
+			continue;
+		}
 		writeToRMAPFile(compFinal, output, _bundleTable[i].filename, offsetData, bits, freq, channels);
 		writeRegions(compFinal + offsetData, bits, freq, channels, outpath.getPath().c_str(), _bundleTable[i].filename, output, rawMuse && bits == 16);
 		free(compFinal);




More information about the Scummvm-git-logs mailing list