示例#1
0
int main(int argc, char *argv[]) {
	WAVE_16BS *sampleBuffer;
	UINT32 bufferedLength;
	FILE *outputFile;

	long int wavRIFFLengthPos;
	long int wavDataLengthPos;
	int sampleBytesWritten = 0;

	// Initialize VGMPlay before parsing arguments, so we can set VGMMaxLoop and FadeTime
	VGMPlay_Init();
	VGMPlay_Init2();

	VGMMaxLoop = 2;
	FadeTime = 5000;
	WriteSmplChunk = true;

	int c;

	// Parse command line arguments
#ifdef VGM2WAV_HAS_GETOPT
	static struct option long_options[] = {
		{ "loop-count", required_argument, NULL, 'l' },
		{ "fade-ms", required_argument, NULL, 'f' },
		{ "no-smpl-chunk", no_argument, NULL, 'S' },
		{ "help", no_argument, NULL, '?' },
		{ NULL, 0, NULL, 0 }
	};
	while ((c = getopt_long(argc, argv, "", long_options, NULL)) != -1) {
		switch (c) {
		case 'l':
			c = atoi(optarg);
			if (c <= 0) {
				fputs("Error: loop count must be at least 1.\n", stderr);
				usage(argv[0]);
				return 1;
			}
			VGMMaxLoop = c;
			//fprintf(stderr, "Setting max loops to %u\n", VGMMaxLoop);
			break;
		case 'f':
			FadeTime = atoi(optarg);
			//fprintf(stderr, "Setting fade-out time in milliseconds to %u\n", FadeTime);
			break;
		case 'S':
			WriteSmplChunk = false;
			break;
		case -1:
			break;
		case '?':
			usage(argv[0]);
			return 0;
		default:
			usage(argv[0]);
			return 1;
		}
	}

	// Pretend for the rest of the program that those options don't exist
	argv[optind - 1] = argv[0];
	argc -= optind - 1;
	argv += optind - 1;
#endif
	if (argc < 3) {
		usage(argv[0]);
		return 1;
	}

	if (!OpenVGMFile(argv[1])) {
		fprintf(stderr, "vgm2wav: error: failed to open vgm_file (%s)\n", argv[1]);
		return 1;
	}

	if (argv[2][0] == '-' && argv[2][1] == '\0') {
#ifdef O_BINARY
		setmode(fileno(stdout), O_BINARY);
#endif
		outputFile = stdout;
	} else {
		outputFile = fopen(argv[2], "wb");
		if (outputFile == NULL) {
			fprintf(stderr, "vgm2wav: error: failed to open wav_file (%s)\n", argv[2]);
			return 1;
		}
	}

	if (WriteSmplChunk && VGMHead.lngLoopSamples == 0) {
		WriteSmplChunk = false;
	}

	fwrite("RIFF", 1, 4, outputFile);

	wavRIFFLengthPos = ftell(outputFile);
	fputLE32(-1, outputFile);

	fwrite("WAVE", 1, 4, outputFile);

	fwrite("fmt ", 1, 4, outputFile);
	fputLE32(16, outputFile);
	fputLE16(1, outputFile);
	fputLE16(2, outputFile);
	fputLE32(SampleRate, outputFile);
	fputLE32(SampleRate * 2 * 2, outputFile);
	fputLE16(2 * 2, outputFile);
	fputLE16(16, outputFile);

	if (WriteSmplChunk) {
		fwrite("smpl", 1, 4, outputFile);
		fputLE32(60, outputFile);
		fputLE32(0, outputFile);
		fputLE32(0, outputFile);
		fputLE32(0, outputFile);
		fputLE32(0, outputFile);
		fputLE32(0, outputFile);
		fputLE32(0, outputFile);
		fputLE32(0, outputFile);
		fputLE32(1, outputFile);
		fputLE32(0, outputFile);

		fputLE32(0, outputFile);
		fputLE32(0, outputFile);
		fputLE32(VGMHead.lngTotalSamples - VGMHead.lngLoopSamples, outputFile);
		fputLE32(VGMHead.lngTotalSamples, outputFile);
		fputLE32(0, outputFile);
		fputLE32(0, outputFile);
	}

	fwrite("data", 1, 4, outputFile);

	wavDataLengthPos = ftell(outputFile);
	fputLE32(-1, outputFile);

	PlayVGM();

	sampleBuffer = (WAVE_16BS*)malloc(SAMPLESIZE * SampleRate);
	if (sampleBuffer == NULL) {
		fprintf(stderr, "vgm2wav: error: failed to allocate %u bytes of memory\n", SAMPLESIZE * SampleRate);
		return 1;
	}

	while (!EndPlay) {
		UINT32 bufferSize = SampleRate;
		bufferedLength = FillBuffer(sampleBuffer, bufferSize);
		if (bufferedLength) {
			UINT32 numberOfSamples;
			UINT32 currentSample;
			const UINT16* sampleData;

			sampleData = (INT16*)sampleBuffer;
			numberOfSamples = SAMPLESIZE * bufferedLength / 0x02;
			for (currentSample = 0x00; currentSample < numberOfSamples; currentSample++) {
				fputLE16(sampleData[currentSample], outputFile);
				sampleBytesWritten += 2;
			}
		}
	}

	fflush(outputFile);
	StopVGM();

	CloseVGMFile();

	VGMPlay_Deinit();

	if (wavRIFFLengthPos >= 0) {
		fseek(outputFile, wavRIFFLengthPos, SEEK_SET);
		if (WriteSmplChunk) {
			fputLE32(sampleBytesWritten + 28 + 68 + 8, outputFile);
		} else {
			fputLE32(sampleBytesWritten + 28 + 8, outputFile);
		}
	}
	if (wavDataLengthPos >= 0) {
		fseek(outputFile, wavDataLengthPos, SEEK_SET);
		fputLE32(sampleBytesWritten, outputFile);
	}

	return 0;
}
示例#2
0
int main(int argc, char* argv[])
{
	int argbase;
	int ErrVal;
	char FileName[0x100];
	
	printf("Remove 1 Sample Delays\n----------------------\n\n");
	
	ErrVal = 0;
	MAX_SMALL_DELAY = 0x0000;
	argbase = 1;
	while(argbase < argc && argv[argbase][0] == '-')
	{
		if (! strncmp(argv[argbase], "-delay:", 7))
		{
			MAX_SMALL_DELAY = (UINT16)strtoul(argv[argbase] + 7, NULL, 0);
			argbase ++;
		}
		else
		{
			break;
		}
	}
	if (! MAX_SMALL_DELAY)
		MAX_SMALL_DELAY = 1;
	
	printf("File Name:\t");
	if (argc <= argbase + 0)
	{
		ReadFilename(FileName, sizeof(FileName));
	}
	else
	{
		strcpy(FileName, argv[argbase + 0]);
		printf("%s\n", FileName);
	}
	if (! strlen(FileName))
		return 0;
	
	if (! OpenVGMFile(FileName))
	{
		printf("Error opening the file!\n");
		ErrVal = 1;
		goto EndProgram;
	}
	printf("\n");
	
	RoundVGMData();
	
	if (DidSomething)
	{
		if (argc > argbase + 1)
			strcpy(FileName, argv[argbase + 1]);
		else
			strcpy(FileName, "");
		if (FileName[0] == '\0')
		{
			strcpy(FileName, FileBase);
			strcat(FileName, "_no1smpl.vgm");
		}
		WriteVGMFile(FileName);
	}
	
	free(VGMData);
	free(DstData);
	
EndProgram:
	DblClickWait(argv[0]);
	
	return ErrVal;
}
示例#3
0
int main(int argc, char* argv[])
{
	int argbase;
	int ErrVal;
	char FileName[0x100];
	UINT8 CurROM;
	
	printf("VGM Sample-ROM Optimizer\n------------------------\n\n");
	
	ErrVal = 0;
	argbase = 1;
	printf("File Name:\t");
	if (argc <= argbase + 0)
	{
		ReadFilename(FileName, sizeof(FileName));
	}
	else
	{
		strcpy(FileName, argv[argbase + 0]);
		printf("%s\n", FileName);
	}
	if (! strlen(FileName))
		return 1;
	
	if (! OpenVGMFile(FileName))
	{
		printf("Error opening the file!\n");
		ErrVal = 1;
		goto EndProgram;
	}
	printf("\n");
	
	DstData = NULL;
	for (CurROM = 0x00; CurROM < ROM_TYPES; CurROM ++)
	{
		ROMRgnLst[CurROM][0x00].Regions = NULL;
		ROMRgnLst[CurROM][0x01].Regions = NULL;
	}
	
	if (! VGMHead.lngHzSPCM && ! VGMHead.lngHzYM2608 && ! VGMHead.lngHzYM2610 &&
		! VGMHead.lngHzY8950 && ! VGMHead.lngHzYMZ280B && ! VGMHead.lngHzRF5C68 &&
		! VGMHead.lngHzRF5C164 && ! VGMHead.lngHzYMF271 && ! VGMHead.lngHzOKIM6295 &&
		! VGMHead.lngHzK054539 && ! VGMHead.lngHzC140 && ! VGMHead.lngHzK053260 &&
		! VGMHead.lngHzQSound && ! VGMHead.lngHzUPD7759 && ! VGMHead.lngHzMultiPCM &&
		! VGMHead.lngHzNESAPU && ! VGMHead.lngHzES5503 && /*! VGMHead.lngHzES5506 &&*/
		! VGMHead.lngHzGA20 && ! VGMHead.lngHzX1_010 && ! VGMHead.lngHzC352 &&
		! VGMHead.lngHzYMF278B)
	{
		printf("No chips with Sample-ROM used!\n");
		ErrVal = 2;
		goto BreakProgress;
	}
	
	CancelFlag = false;
	FindUsedROMData();
	if (CancelFlag)
	{
		ErrVal = 9;
		goto BreakProgress;
	}
	EnumerateROMRegions();
	OptimizeVGMSampleROM();
	
	if (DstDataLen < VGMDataLen)
	{
		if (argc > argbase + 1)
			strcpy(FileName, argv[argbase + 1]);
		else
			strcpy(FileName, "");
		if (FileName[0] == '\0')
		{
			strcpy(FileName, FileBase);
			strcat(FileName, "_optimized.vgm");
		}
		WriteVGMFile(FileName);
	}
	
BreakProgress:
	free(VGMData);
	free(DstData);
	for (CurROM = 0x00; CurROM < ROM_TYPES; CurROM ++)
	{
		free(ROMRgnLst[CurROM][0x00].Regions);	ROMRgnLst[CurROM][0x00].Regions = NULL;
		free(ROMRgnLst[CurROM][0x01].Regions);	ROMRgnLst[CurROM][0x01].Regions = NULL;
	}
	
EndProgram:
	DblClickWait(argv[0]);
	
	return ErrVal;
}