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; }
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; }
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; }