/* * mp3towav.c - decodifica um MP3 para WAV PCM 16 bits (mesma taxa e canais do arquivo), sempre com os mesmos bytes. * Usa o minimp3 (lieff/minimp3, CC0). Serve para o build-panspermia.sh, porque o SDL_mixer do pygbag nao toca MP3. * Copyright (C) 2026 FredyGames. Mesma licenca do wav2ogg: GNU GPL versao 2 ou posterior. * * mp3towav entrada.mp3 saida.wav */ #define MINIMP3_IMPLEMENTATION #include "minimp3_ex.h" #include #include #include static void put32(FILE *f, unsigned v) { fputc(v & 255, f); fputc(v >> 8 & 255, f); fputc(v >> 16 & 255, f); fputc(v >> 24 & 255, f); } static void put16(FILE *f, unsigned v) { fputc(v & 255, f); fputc(v >> 8 & 255, f); } int main(int argc, char **argv) { if (argc != 3) { fprintf(stderr, "uso: mp3towav entrada.mp3 saida.wav\n"); return 2; } mp3dec_t dec; mp3dec_file_info_t info; if (mp3dec_load(&dec, argv[1], &info, NULL, NULL) || !info.samples) { fprintf(stderr, "erro ao decodificar %s\n", argv[1]); return 1; } FILE *out = fopen(argv[2], "wb"); if (!out) { perror(argv[2]); return 1; } unsigned bytes = info.samples * 2; fwrite("RIFF", 1, 4, out); put32(out, 36 + bytes); fwrite("WAVEfmt ", 1, 8, out); put32(out, 16); put16(out, 1); put16(out, info.channels); put32(out, info.hz); put32(out, info.hz * info.channels * 2); put16(out, info.channels * 2); put16(out, 16); fwrite("data", 1, 4, out); put32(out, bytes); for (size_t i = 0; i < info.samples; i++) put16(out, (unsigned short)info.buffer[i]); fclose(out); fprintf(stderr, "%s: %d Hz, %d canais, %.1f s\n", argv[1], info.hz, info.channels, (double)info.samples / info.channels / info.hz); free(info.buffer); return 0; }