static int decode_file(FILE *in, FILE *out, char *infile, char *outfile) { OggVorbis_File vf; int bs = 0; char buf[8192], outbuf[8192]; char *p_outbuf; int buflen = 8192; unsigned int written = 0; int ret; ogg_int64_t length = 0; ogg_int64_t done = 0; int size = 0; int seekable = 0; int percent = 0; int channels; int samplerate; if (ov_open_callbacks(in, &vf, NULL, 0, OV_CALLBACKS_DEFAULT) < 0) { fprintf(stderr, _("ERROR: Failed to open input as Vorbis\n")); fclose(in); return 1; } channels = ov_info(&vf,0)->channels; samplerate = ov_info(&vf,0)->rate; if(ov_seekable(&vf)) { int link; int chainsallowed = 0; for(link = 0; link < ov_streams(&vf); link++) { if(ov_info(&vf, link)->channels == channels && ov_info(&vf, link)->rate == samplerate) { chainsallowed = 1; } } seekable = 1; if(chainsallowed) length = ov_pcm_total(&vf, -1); else length = ov_pcm_total(&vf, 0); size = bits/8 * channels; if(!quiet) fprintf(stderr, _("Decoding \"%s\" to \"%s\"\n"), infile?infile:_("standard input"), outfile?outfile:_("standard output")); } if(!raw) { if(write_prelim_header(&vf, out, length)) { ov_clear(&vf); return 1; } } while((ret = ov_read(&vf, buf, buflen, endian, bits/8, sign, &bs)) != 0) { if(bs != 0) { vorbis_info *vi = ov_info(&vf, -1); if(channels != vi->channels || samplerate != vi->rate) { fprintf(stderr, _("Logical bitstreams with changing parameters are not supported\n")); break; } } if(ret < 0 ) { if( !quiet ) { fprintf(stderr, _("WARNING: hole in data (%d)\n"), ret); } continue; } if(channels > 2 && !raw) { /* Then permute! */ permute_channels(buf, outbuf, ret, channels, bits/8); p_outbuf = outbuf; } else { p_outbuf = buf; } if(fwrite(p_outbuf, 1, ret, out) != ret) { fprintf(stderr, _("Error writing to file: %s\n"), strerror(errno)); ov_clear(&vf); return 1; } written += ret; if(!quiet && seekable) { done += ret/size; if((double)done/(double)length * 200. > (double)percent) { percent = (int)((double)done/(double)length *200); fprintf(stderr, "\r\t[%5.1f%%]", (double)percent/2.); } } } if(seekable && !quiet) fprintf(stderr, "\n"); if(!raw) rewrite_header(out, written); /* We don't care if it fails, too late */ ov_clear(&vf); return 0; }
static int decode_file(char *infile, char *outfile) { FILE *in, *out=NULL; OggVorbis_File vf; int bs = 0; char buf[8192]; int buflen = 8192; unsigned int written = 0; int ret; ogg_int64_t length = 0; ogg_int64_t done = 0; int size; int seekable = 0; int percent = 0; if(!infile) { #ifdef __BORLANDC__ setmode(fileno(stdin), O_BINARY); #elif _WIN32 _setmode(_fileno(stdin), _O_BINARY); #endif in = stdin; } else { in = fopen(infile, "rb"); if(!in) { fprintf(stderr, "ERROR: Failed to open input file: %s\n", strerror(errno)); return 1; } } if(ov_open(in, &vf, NULL, 0) < 0) { fprintf(stderr, "ERROR: Failed to open input as vorbis\n"); fclose(in); return 1; } if(!outfile) { #ifdef __BORLANDC__ setmode(fileno(stdout), O_BINARY); #elif _WIN32 _setmode(_fileno(stdout), _O_BINARY); #endif out = stdout; } else { out = fopen(outfile, "wb"); if(!out) { fprintf(stderr, "ERROR: Failed to open output file: %s\n", strerror(errno)); return 1; } } if(ov_seekable(&vf)) { seekable = 1; length = ov_pcm_total(&vf, 0); size = bits/8 * ov_info(&vf, 0)->channels; if(!quiet) fprintf(stderr, "Decoding \"%s\" to \"%s\"\n", infile?infile:"standard input", outfile?outfile:"standard output"); } if(!raw) { if(write_prelim_header(&vf, out, length)) { ov_clear(&vf); fclose(out); return 1; } } while((ret = ov_read(&vf, buf, buflen, endian, bits/8, sign, &bs)) != 0) { if(bs != 0) { fprintf(stderr, "Only one logical bitstream currently supported\n"); break; } if(ret < 0 ) { if( !quiet ) { fprintf(stderr, "Warning: hole in data\n"); } continue; } if(fwrite(buf, 1, ret, out) != ret) { fprintf(stderr, "Error writing to file: %s\n", strerror(errno)); ov_clear(&vf); fclose(out); return 1; } written += ret; if(!quiet && seekable) { done += ret/size; if((double)done/(double)length * 200. > (double)percent) { percent = (double)done/(double)length *200; fprintf(stderr, "\r\t[%5.1f%%]", (double)percent/2.); } } } if(seekable && !quiet) fprintf(stderr, "\n"); if(!raw) rewrite_header(out, written); /* We don't care if it fails, too late */ ov_clear(&vf); fclose(out); return 0; }