/* * oggdec.c - decodifica um Ogg Vorbis para WAV PCM 16 bits estereo (para o build do TerraTactician Expandoria recomprimir a * musica com o wav2ogg de ../pygame-music). Usa o vorbisfile do libvorbis 1.3.7. * Copyright (C) 2026 FredyGames. GNU GPL versao 2 ou posterior (como o wav2ogg). * * oggdec entrada.ogg saida.wav */ #include #include #include #include static void put32(unsigned char *p, unsigned v) { p[0] = v; p[1] = v >> 8; p[2] = v >> 16; p[3] = v >> 24; } int main(int argc, char **argv) { if (argc != 3) { fprintf(stderr, "uso: oggdec entrada.ogg saida.wav\n"); return 2; } FILE *in = fopen(argv[1], "rb"); if (!in) { perror(argv[1]); return 1; } OggVorbis_File vf; if (ov_open_callbacks(in, &vf, NULL, 0, OV_CALLBACKS_NOCLOSE) < 0) { fprintf(stderr, "nao e Ogg Vorbis\n"); return 1; } vorbis_info *vi = ov_info(&vf, -1); if (vi->channels != 2) { fprintf(stderr, "precisa de estereo\n"); return 1; } unsigned rate = vi->rate; size_t cap = 1 << 20, len = 0; unsigned char *pcm = malloc(cap); char buf[4096]; int bitstream; for (;;) { long n = ov_read(&vf, buf, sizeof buf, 0, 2, 1, &bitstream); if (n == 0) break; if (n < 0) continue; if (len + n > cap) { cap *= 2; pcm = realloc(pcm, cap); } memcpy(pcm + len, buf, n); len += n; } ov_clear(&vf); fclose(in); FILE *out = fopen(argv[2], "wb"); unsigned char h[44] = "RIFF\0\0\0\0WAVEfmt \x10\0\0\0\x01\0\x02\0\0\0\0\0\0\0\0\0\x04\0\x10\0data\0\0\0\0"; put32(h + 4, 36 + len); put32(h + 24, rate); put32(h + 28, rate * 4); put32(h + 40, len); fwrite(h, 1, 44, out); fwrite(pcm, 1, len, out); fclose(out); return 0; }