[Scummvm-cvs-logs] CVS: tools simon2mp3.c,NONE,1.1 Makefile,1.3,1.4 Makefile.mingw,1.2,1.3 readme.txt,1.4,1.5
Travis Howell
kirben at users.sourceforge.net
Thu Oct 31 05:59:02 CET 2002
Update of /cvsroot/scummvm/tools
In directory usw-pr-cvs1:/tmp/cvs-serv31434
Modified Files:
Makefile Makefile.mingw readme.txt
Added Files:
simon2mp3.c
Log Message:
Add simon converter and update readme
--- NEW FILE: simon2mp3.c ---
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#ifndef WIN32
#include <unistd.h>
#endif
/* These are the defaults parameters for the Lame invocation */
#define minBitrDef 24
#define maxBitrDef 64
#define abrDef 0
#define vbrDef 1
#define algqualDef 2
#define vbrqualDef 4
/* The default for oggenc invocation is to use the --quality option only */
#define oggqualDef 3
FILE *input, *output_idx, *output_snd;
unsigned int offsets[32768];
char infile_base[256];
char fbuf_temp[1024];
char buf[256];
char tmp[256];
struct lameparams {
unsigned int minBitr;
unsigned int maxBitr;
unsigned int abr;
unsigned int vbr;
unsigned int algqual;
unsigned int vbrqual;
unsigned int silent;
} encparms = { minBitrDef, maxBitrDef, abrDef, vbrDef, algqualDef, vbrqualDef, 0 };
struct oggencparams {
int nominalBitr;
int minBitr;
int maxBitr;
int quality;
int silent;
} oggparms = { -1, -1, -1, oggqualDef, 0 };
int oggmode = 0;
void end(void)
{
int size;
char buf[2048];
fclose(output_snd);
fclose(output_idx);
fclose(input);
sprintf(tmp, "%s%s", infile_base, oggmode ? "ogg" : "mp3");
output_idx = fopen(tmp, "wb");
sprintf(tmp, "%sidx", infile_base);
input = fopen(tmp, "rb");
while ((size = fread(buf, 1, 2048, input)) > 0) {
fwrite(buf, 1, size, output_idx);
}
fclose(input);
sprintf(tmp, "%sdat", infile_base);
input = fopen(tmp, "rb");
while ((size = fread(buf, 1, 2048, input)) > 0) {
fwrite(buf, 1, size, output_idx);
}
fclose(input);
fclose(output_idx);
/* And some clean-up :-) */
sprintf(tmp, "%sidx", infile_base);
unlink(tmp);
sprintf(tmp, "%sdat", infile_base);
unlink(tmp);
unlink("tempfile.raw");
unlink(oggmode ? "tempfile.ogg" : "tempfile.mp3");
exit(0);
}
void get_string(int size)
{
int i = 0;
while (i < size) {
int c = fgetc(input);
buf[i++] = c;
}
buf[i] = '\0';
}
unsigned int get_int(void)
{
int i;
unsigned int ret = 0;
unsigned int c;
for (i = 0; i < 4; i++) {
c = fgetc(input);
ret |= c << i*8;
}
return ret;
}
void put_int(unsigned int val)
{
int i;
for (i = 3; i >= 0; i--) {
fputc((val << i*8) >> 24, output_idx);
}
}
int get_offsets(void)
{
int i;
for (i = 0;; i++) {
get_string(8);
if (!strncmp(buf, "Creative", 8) || !strncmp(buf, "RIFF", 4)) {
return(i);
}
fseek(input, -8, SEEK_CUR);
offsets[i] = get_int();
}
}
void get_voc(void);
void get_wav(void);
unsigned int get_sound(int sound)
{
FILE *f;
unsigned int tot_size;
char mp3name[256];
int size;
char fbuf[2048];
fseek(input, offsets[sound], SEEK_SET);
get_string(8);
if (!strncmp(buf, "Creative", 8)) {
printf("VOC found (pos = %d) :\n", offsets[sound]);
get_voc();
} else if (!strncmp(buf, "RIFF", 4)) {
printf("WAV found (pos = %d) :\n", offsets[sound]);
get_wav();
} else {
printf("Unexpected data at offset: %i\n", offsets[sound]);
exit(-1);
}
sprintf(mp3name, oggmode ? "tempfile.ogg" : "tempfile.mp3");
f = fopen(mp3name, "rb");
tot_size = 0;
while ((size = fread(fbuf, 1, 2048, f)) > 0) {
tot_size += size;
fwrite(fbuf, 1, size, output_snd);
}
fclose(f);
return(tot_size);
}
void get_wav(void) {
int length;
int i;
FILE *f;
char fbuf[2048];
char fbuf_o[4096];
int size;
char wavname[256];
char mp3name[256];
fseek(input, -4, SEEK_CUR);
length = get_int();
length += 8;
sprintf(wavname, "tempfile.wav");
sprintf(mp3name, oggmode ? "tempfile.ogg" : "tempfile.mp3");
f = fopen(wavname, "wb");
while (length > 0) {
size = fread(fbuf, 1, length > 2048 ? 2048 : length, input);
if (size <= 0)
break;
length -= size;
for (i = 0; i < size; i++) {
fbuf_o[2 * i] = fbuf[i] ^ 0x80;
fbuf_o[2 * i + 1] = 0;
}
fwrite(fbuf_o, 1, 2 * size, f);
}
fclose(f);
if (oggmode) {
sprintf(fbuf, "oggenc ");
if (oggparms.nominalBitr != -1) {
sprintf(fbuf_temp, "-b %i ", oggparms.nominalBitr);
strcat(fbuf, fbuf_temp);
}
if (oggparms.minBitr != -1) {
sprintf(fbuf_temp, "-m %i ", oggparms.minBitr);
strcat(fbuf, fbuf_temp);
}
if (oggparms.maxBitr != -1) {
sprintf(fbuf_temp, "-M %i ", oggparms.maxBitr);
strcat(fbuf, fbuf_temp);
}
if (oggparms.silent) {
strcat(fbuf, "--quiet ");
}
sprintf(fbuf_temp, "-q %i --resample 22050 %s -o %s",
oggparms.quality, wavname, mp3name);
strcat(fbuf, fbuf_temp);
system(fbuf);
} else {
if (encparms.abr == 1)
sprintf(fbuf_temp,"--abr %i",encparms.minBitr);
else
sprintf(fbuf_temp,"--vbr-new -b %i",encparms.minBitr);
if (encparms.silent == 1)
strcat(fbuf_temp," --silent");
sprintf(fbuf,
"lame -t -q %i %s -V %i -B %i --resample 22.05 -m m %s %s",
encparms.algqual, fbuf_temp, encparms.vbrqual,
encparms.maxBitr, wavname, mp3name);
system(fbuf);
}
}
void get_voc(void)
{
int blocktype;
get_string(18);
blocktype = fgetc(input);
switch (blocktype) {
case 0x01:{
int length = 0;
int i;
int sample_rate;
int comp;
FILE *f;
char fbuf[2048];
char fbuf_o[4096];
int size;
char rawname[256];
char mp3name[256];
int real_samplerate;
/* Sound Data */
printf(" Sound Data\n");
for (i = 0; i < 3; i++)
length = length | (fgetc(input) << (i * 8));
length -= 2;
printf(" - length = %d\n", length);
sample_rate = fgetc(input);
comp = fgetc(input);
real_samplerate = 1000000 / (256 - sample_rate);
printf(" - sample rate = %d (%02x)\n", 1000000 / (256 - sample_rate), sample_rate);
printf(" - compression = %s (%02x)\n",
(comp == 0 ? "8bits" :
(comp == 1 ? "4bits" :
(comp == 2 ? "2.6bits" :
(comp == 3 ? "2bits" :
"Multi")))), comp);
if (comp != 0) {
printf("Cannot handle compression\n");
exit(-1);
}
sprintf(rawname, "tempfile.raw");
sprintf(mp3name, oggmode ? "tempfile.ogg" : "tempfile.mp3");
f = fopen(rawname, "wb");
while (length > 0) {
size = fread(fbuf, 1, length > 2048 ? 2048 : length, input);
if (size <= 0)
break;
length -= size;
for (i = 0; i < size; i++) {
fbuf_o[2 * i] = fbuf[i] ^ 0x80;
fbuf_o[2 * i + 1] = 0;
}
fwrite(fbuf_o, 1, 2 * size, f);
}
fclose(f);
if (oggmode) {
sprintf(fbuf, "oggenc ");
if (oggparms.nominalBitr != -1) {
sprintf(fbuf_temp, "-b %i ", oggparms.nominalBitr);
strcat(fbuf, fbuf_temp);
}
if (oggparms.minBitr != -1) {
sprintf(fbuf_temp, "-m %i ", oggparms.minBitr);
strcat(fbuf, fbuf_temp);
}
if (oggparms.maxBitr != -1) {
sprintf(fbuf_temp, "-M %i ", oggparms.maxBitr);
strcat(fbuf, fbuf_temp);
}
if (oggparms.silent) {
strcat(fbuf, "--quiet ");
}
sprintf(fbuf_temp, "-q %i -r -C 1 --raw-endianness=1 -R %i --resample 22050 %s -o %s",
oggparms.quality, real_samplerate,
rawname, mp3name);
strcat(fbuf, fbuf_temp);
system(fbuf);
}
else {
if (encparms.abr == 1)
sprintf(fbuf_temp,"--abr %i",encparms.minBitr);
else
sprintf(fbuf_temp,"--vbr-new -b %i",encparms.minBitr);
if (encparms.silent == 1)
strcat(fbuf_temp," --silent");
sprintf(fbuf,
"lame -t -q %i %s -V %i -B %i --resample 22.05 -m m -r -s %d %s %s",
encparms.algqual, fbuf_temp, encparms.vbrqual,
encparms.maxBitr, real_samplerate, rawname, mp3name);
system(fbuf);
}
break;
}
default:
printf("Unknown chunk : %02x\n", blocktype);
exit(-1);
break;
}
}
void showhelp(char *exename)
{
printf("\nUsage: %s <params> file\n", exename);
printf("\nParams:\n");
printf("--mp3 encode to MP3 format (default)\n");
printf("--vorbis encode to Vorbis format (not yet implemented)\n");
printf("(If one of these is specified, it must be the first parameter.)\n");
printf("\nMP3 mode params:\n");
printf("-b <rate> <rate> is the target bitrate(ABR)/minimal bitrate(VBR) (default:%i)\n", minBitrDef);
printf("-B <rate> <rate> is the maximum VBR/ABR bitrate (default:%i)\n", maxBitrDef);
printf("--vbr LAME uses the VBR mode (default)\n");
printf("--abr LAME uses the ABR mode\n");
printf("-V <value> specifies the value (0 - 9) of VBR quality (0=best) (default:%i)\n", vbrqualDef);
printf("-q <value> specifies the MPEG algorithm quality (0-9; 0=best) (default:%i)\n", algqualDef);
printf("--silent the output of LAME is hidden (default:disabled)\n");
printf("\nVorbis mode params:\n");
printf("-b <rate> <rate> is the nominal bitrate (default:unset)\n");
printf("-m <rate> <rate> is the minimum bitrate (default:unset)\n");
printf("-M <rate> <rate> is the maximum bitrate (default:unset)\n");
printf("-q <value> specifies the value (0 - 10) of VBR quality (10=best) (default:%i)\n", oggqualDef);
printf("--silent the output of oggenc is hidden (default:disabled)\n");
printf("\n--help this help message\n");
printf("\n\nIf a parameter is not given the default value is used\n");
printf("If using VBR mode for MP3 -b and -B must be multiples of 8; the maximum is 160!\n");
exit(2);
}
void process_mp3_parms(int argc, char *argv[], int i) {
for(; i < argc; i++) {
if (strcmp(argv[i], "--vbr") == 0) {
encparms.vbr=1;
encparms.abr=0;
} else if (strcmp(argv[i], "--abr") == 0) {
encparms.vbr=0;
encparms.abr=1;
} else if (strcmp(argv[i], "-b") == 0) {
encparms.minBitr = atoi(argv[i + 1]);
if ((encparms.minBitr % 8) != 0)
encparms.minBitr -= encparms.minBitr % 8;
if (encparms.minBitr >160)
encparms.minBitr = 160;
if (encparms.minBitr < 8)
encparms.minBitr=8;
i++;
} else if (strcmp(argv[i], "-B") == 0) {
encparms.maxBitr = atoi(argv[i + 1]);
if ((encparms.maxBitr % 8) != 0)
encparms.maxBitr -= encparms.maxBitr % 8;
if (encparms.maxBitr > 160)
encparms.maxBitr = 160;
if (encparms.maxBitr < 8)
encparms.maxBitr = 8;
i++;
} else if (strcmp(argv[i], "-V") == 0) {
encparms.vbrqual = atoi(argv[i + 1]);
if(encparms.vbrqual < 0)
encparms.vbrqual = 0;
if(encparms.vbrqual > 9)
encparms.vbrqual = 9;
i++;
} else if (strcmp(argv[i], "-q") == 0) {
encparms.algqual = atoi(argv[i + 1]);
if (encparms.algqual < 0)
encparms.algqual = 0;
if (encparms.algqual > 9)
encparms.algqual = 9;
i++;
} else if (strcmp(argv[i], "--silent") == 0) {
encparms.silent = 1;
} else if (strcmp(argv[i], "--help") == 0) {
showhelp(argv[0]);
} else if (argv[i][0] == '-') {
showhelp(argv[0]);
} else {
break;
}
}
if (i != (argc - 1)) {
showhelp(argv[0]);
}
}
void process_ogg_parms(int argc, char *argv[], int i) {
for (; i < argc; i++) {
if (strcmp(argv[i], "-b") == 0) {
oggparms.nominalBitr = atoi(argv[i + 1]);
i++;
}
else if (strcmp(argv[i], "-m") == 0) {
oggparms.minBitr = atoi(argv[i + 1]);
i++;
}
else if (strcmp(argv[i], "-M") == 0) {
oggparms.maxBitr = atoi(argv[i + 1]);
i++;
}
else if (strcmp(argv[i], "-q") == 0) {
oggparms.quality = atoi(argv[i + 1]);
i++;
}
else if (strcmp(argv[i], "--silent") == 0) {
oggparms.silent = 1;
}
else if (strcmp(argv[i], "--help") == 0) {
showhelp(argv[0]);
}
else if (argv[i][0] == '-') {
showhelp(argv[0]);
}
else
break;
}
if (i != argc - 1)
showhelp(argv[0]);
}
int main(int argc, char *argv[])
{
int i, n, size, num;
if (argc < 2)
showhelp(argv[0]);
i = 1;
if (strcmp(argv[1], "--mp3") == 0) {
oggmode = 0;
i++;
}
else if (strcmp(argv[1], "--vorbis") == 0) {
oggmode = 1;
i++;
}
if (oggmode)
process_ogg_parms(argc, argv, i);
else
process_mp3_parms(argc, argv, i);
i = argc - 1;
n = strlen(argv[i]);
strncpy(infile_base, argv[i], n - 3);
input = fopen(argv[i], "rb");
if (!input) {
printf("Cannot open file: %s\n", argv[i]);
exit(-1);
}
sprintf(tmp, "%sidx", infile_base);
output_idx = fopen(tmp, "wb");
sprintf(tmp, "%sdat", infile_base);
output_snd = fopen(tmp, "wb");
num = get_offsets();
if (!num) {
printf("This does not seem to be a valid file\n");
exit(-1);
}
size = num*4;
put_int(0);
put_int(size);
for (i = 1; i < num; i++) {
if (offsets[i] == offsets[i+1]) {
put_int(size);
continue;
}
size += get_sound(i);
if (i < num - 1)
put_int(size);
}
end();
return(0);
}
Index: Makefile
===================================================================
RCS file: /cvsroot/scummvm/tools/Makefile,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- Makefile 27 Jul 2002 12:53:35 -0000 1.3
+++ Makefile 31 Oct 2002 13:57:59 -0000 1.4
@@ -5,7 +5,7 @@
CFLAGS = -g -O -Wall -Wstrict-prototypes -Wuninitialized -Wno-long-long -Wno-multichar
LDFLAGS :=
-TARGETS := descumm3$(EXEEXT) descumm5$(EXEEXT) descumm6$(EXEEXT) extract$(EXEEXT) rescumm$(EXEEXT)
+TARGETS := descumm3$(EXEEXT) descumm5$(EXEEXT) descumm6$(EXEEXT) extract$(EXEEXT) rescumm$(EXEEXT) simon2mp3$(EXEEXT)
all: $(TARGETS)
@@ -23,6 +23,10 @@
rescumm$(EXEEXT) : rescumm.o
$(CC) $(LFLAGS) -o $@ $+
+
+simon2mp3$(EXEEXT) : simon2mp3.o
+ $(CC) $(LFLAGS) -o $@ $+
+
clean:
rm -f *.o $(TARGETS)
Index: Makefile.mingw
===================================================================
RCS file: /cvsroot/scummvm/tools/Makefile.mingw,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- Makefile.mingw 8 Jul 2002 11:31:00 -0000 1.2
+++ Makefile.mingw 31 Oct 2002 13:57:59 -0000 1.3
@@ -13,5 +13,6 @@
strip descumm6.exe -o $(SCUMMVMPATH)/tools/descumm6.exe
strip extract.exe -o $(SCUMMVMPATH)/tools/extract.exe
strip rescumm.exe -o $(SCUMMVMPATH)/tools/rescumm.exe
+ strip simon2mp3.exe -o $(SCUMMVMPATH)/tools/simon2mp3.exe
dist: install
Index: readme.txt
===================================================================
RCS file: /cvsroot/scummvm/tools/readme.txt,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- readme.txt 1 Oct 2002 15:14:59 -0000 1.4
+++ readme.txt 31 Oct 2002 13:57:59 -0000 1.5
@@ -3,7 +3,9 @@
Included tools:
extract.cpp - Used to MP3 compress .sou files to .so3, for use with
- ScummVMs -DUSE_COMPRESSED_SOUND support. Requires MAD
+ ScummVMs -DUSE_MAD support. Requires MAD
+ Used to MP3 compress .sou files to .ogg, for use with
+ ScummVMs -DUSE_VORBIS support. Requires VORBIS
rescumm.cpp - Extracts macintosh "single file" SCUMM games into their
component parts, for use with ScummVM
@@ -16,3 +18,6 @@
descumm6.cpp - Decompiles SCUMM V6/V7/V8 scripts (eg, dott, FT, etc)
(When decompiling V7 'room-' scripts, you may need to
use the -7 switch)
+
+ simon2mp3.cpp - Used to MP3 compress .voc or .wav files to .mp3, for
+ use with ScummVMs -DUSE_MAD support. Requires MAD
More information about the Scummvm-git-logs
mailing list