int main(int argc, char **argv) { /* Default values */ oe_options opt = { NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, 1, 0, 0, 0, 16,44100,2, 0, NULL, DEFAULT_NAMEFMT_REMOVE, DEFAULT_NAMEFMT_REPLACE, NULL, 0, -1,-1,-1, .3,-1, 0,0,0.f, 0, 0, 0, 0, 0}; input_format raw_format = {NULL, 0, raw_open, wav_close, "raw", N_("RAW file reader")}; int i; char **infiles; int numfiles; int errors=0; get_args_from_ucs16(&argc, &argv); setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); parse_options(argc, argv, &opt); if(optind >= argc) { fprintf(stderr, _("ERROR: No input files specified. Use -h for help.\n")); return 1; } else { infiles = argv + optind; numfiles = argc - optind; } /* Now, do some checking for illegal argument combinations */ for(i = 0; i < numfiles; i++) { if(!strcmp(infiles[i], "-") && numfiles > 1) { fprintf(stderr, _("ERROR: Multiple files specified when using stdin\n")); exit(1); } } if(numfiles > 1 && opt.outfile) { fprintf(stderr, _("ERROR: Multiple input files with specified output filename: suggest using -n\n")); exit(1); } if(!opt.fixedserial) { /* We randomly pick a serial number. This is then incremented for each file. The random seed includes the PID so two copies of oggenc that start in the same second will generate different serial numbers. */ srand(time(NULL) ^ getpid()); opt.serial = rand(); } opt.skeleton_serial = opt.serial + numfiles; opt.kate_serial = opt.skeleton_serial + numfiles; for(i = 0; i < numfiles; i++) { /* Once through the loop for each file */ oe_enc_opt enc_opts; vorbis_comment vc; char *out_fn = NULL; FILE *in, *out = NULL; int foundformat = 0; int closeout = 0, closein = 0; char *artist=NULL, *album=NULL, *title=NULL, *track=NULL; char *date=NULL, *genre=NULL; char *lyrics=NULL, *lyrics_language=NULL; input_format *format; int resampled = 0; /* Set various encoding defaults */ enc_opts.serialno = opt.serial++; enc_opts.skeleton_serialno = opt.skeleton_serial++; enc_opts.kate_serialno = opt.kate_serial++; enc_opts.progress_update = update_statistics_full; enc_opts.start_encode = start_encode_full; enc_opts.end_encode = final_statistics; enc_opts.error = encode_error; enc_opts.comments = &vc; enc_opts.copy_comments = opt.copy_comments; enc_opts.with_skeleton = opt.with_skeleton; enc_opts.ignorelength = opt.ignorelength; /* OK, let's build the vorbis_comments structure */ build_comments(&vc, &opt, i, &artist, &album, &title, &track, &date, &genre); if(opt.lyrics_count) { if(i >= opt.lyrics_count) { lyrics = NULL; } else lyrics = opt.lyrics[i]; } if(opt.lyrics_language_count) { if(i >= opt.lyrics_language_count) { if(!opt.quiet) fprintf(stderr, _("WARNING: Insufficient lyrics languages specified, defaulting to final lyrics language.\n")); lyrics_language = opt.lyrics_language[opt.lyrics_language_count-1]; } else lyrics_language = opt.lyrics_language[i]; } if(!strcmp(infiles[i], "-")) { setbinmode(stdin); in = stdin; infiles[i] = NULL; if(!opt.outfile) { setbinmode(stdout); out = stdout; } } else { in = oggenc_fopen(infiles[i], "rb", opt.isutf8); if(in == NULL) { fprintf(stderr, _("ERROR: Cannot open input file \"%s\": %s\n"), infiles[i], strerror(errno)); free(out_fn); errors++; continue; } closein = 1; } /* Now, we need to select an input audio format - we do this before opening the output file so that we don't end up with a 0-byte file if the input file can't be read */ if(opt.rawmode) { enc_opts.rate=opt.raw_samplerate; enc_opts.channels=opt.raw_channels; enc_opts.samplesize=opt.raw_samplesize; enc_opts.endianness=opt.raw_endianness; format = &raw_format; format->open_func(in, &enc_opts, NULL, 0); foundformat=1; } else { format = open_audio_file(in, &enc_opts); if(format) { if(!opt.quiet) fprintf(stderr, _("Opening with %s module: %s\n"), format->format, format->description); foundformat=1; } } if(!foundformat) { fprintf(stderr, _("ERROR: Input file \"%s\" is not a supported format\n"), infiles[i]?infiles[i]:"(stdin)"); if(closein) fclose(in); errors++; continue; } if(enc_opts.rate <= 0) { fprintf(stderr, _("ERROR: Input file \"%s\" has invalid sampling rate\n"), infiles[i]?infiles[i]:"(stdin)"); if(closein) fclose(in); errors++; continue; } /* Ok. We can read the file - so now open the output file */ if(opt.outfile && !strcmp(opt.outfile, "-")) { setbinmode(stdout); out = stdout; } else if(out == NULL) { if(opt.outfile) { out_fn = strdup(opt.outfile); } else if(opt.namefmt) { out_fn = generate_name_string(opt.namefmt, opt.namefmt_remove, opt.namefmt_replace, artist, title, album, track,date, genre); } /* This bit was widely derided in mid-2002, so it's been removed */ /* else if(opt.title) { out_fn = malloc(strlen(title) + 5); strcpy(out_fn, title); strcat(out_fn, ".ogg"); } */ else if(infiles[i]) { /* Create a filename from existing filename, replacing extension with .ogg or .oga */ char *start, *end; char *extension; /* if adding Skeleton or Kate, we're not Vorbis I anymore */ extension = (opt.with_skeleton || opt.lyrics_count>0) ? ".oga" : ".ogg"; start = infiles[i]; end = strrchr(infiles[i], '.'); end = end?end:(start + strlen(infiles[i])+1); out_fn = malloc(end - start + 5); strncpy(out_fn, start, end-start); out_fn[end-start] = 0; strcat(out_fn, extension); } else { /* if adding skeleton or kate, we're not Vorbis I anymore */ if (opt.with_skeleton || opt.lyrics_count>0) out_fn = strdup("default.oga"); else out_fn = strdup("default.ogg"); fprintf(stderr, _("WARNING: No filename, defaulting to \"%s\"\n"), out_fn); } /* Create any missing subdirectories, if possible */ if(create_directories(out_fn, opt.isutf8)) { if(closein) fclose(in); fprintf(stderr, _("ERROR: Could not create required subdirectories for output filename \"%s\"\n"), out_fn); errors++; free(out_fn); continue; } if(infiles[i] && !strcmp(infiles[i], out_fn)) { fprintf(stderr, _("ERROR: Input filename is the same as output filename \"%s\"\n"), out_fn); errors++; free(out_fn); continue; } out = oggenc_fopen(out_fn, "wb", opt.isutf8); if(out == NULL) { if(closein) fclose(in); fprintf(stderr, _("ERROR: Cannot open output file \"%s\": %s\n"), out_fn, strerror(errno)); errors++; free(out_fn); continue; } closeout = 1; } /* Now, set the rest of the options */ enc_opts.out = out; enc_opts.comments = &vc; #ifdef _WIN32 enc_opts.filename = NULL; enc_opts.infilename = NULL; if (opt.isutf8) { if (out_fn) { utf8_decode(out_fn, &enc_opts.filename); } if (infiles[i]) { utf8_decode(infiles[i], &enc_opts.infilename); } } else { if (out_fn) { enc_opts.filename = strdup(out_fn); } if (infiles[i]) { enc_opts.infilename = strdup(infiles[i]); } } #else enc_opts.filename = out_fn; enc_opts.infilename = infiles[i]; #endif enc_opts.managed = opt.managed; enc_opts.bitrate = opt.nominal_bitrate; enc_opts.min_bitrate = opt.min_bitrate; enc_opts.max_bitrate = opt.max_bitrate; enc_opts.quality = opt.quality; enc_opts.quality_set = opt.quality_set; enc_opts.advopt = opt.advopt; enc_opts.advopt_count = opt.advopt_count; enc_opts.lyrics = lyrics; enc_opts.lyrics_language = lyrics_language; if(opt.resamplefreq && opt.resamplefreq != enc_opts.rate) { int fromrate = enc_opts.rate; resampled = 1; enc_opts.resamplefreq = opt.resamplefreq; if(setup_resample(&enc_opts)) { errors++; goto clear_all; } else if(!opt.quiet) { fprintf(stderr, _("Resampling input from %d Hz to %d Hz\n"), fromrate, opt.resamplefreq); } } if(opt.downmix) { if(enc_opts.channels == 2) { setup_downmix(&enc_opts); if(!opt.quiet) { fprintf(stderr, _("Downmixing stereo to mono\n")); } } else { fprintf(stderr, _("WARNING: Can't downmix except from stereo to mono\n")); opt.downmix = 0; } } if(opt.scale > 0.f) { setup_scaler(&enc_opts, opt.scale); if(!opt.quiet) { fprintf(stderr, _("Scaling input to %f\n"), opt.scale); } } if(enc_opts.total_samples_per_channel <= 0) { enc_opts.progress_update = update_statistics_notime; } if(opt.quiet) { enc_opts.start_encode = start_encode_null; enc_opts.progress_update = update_statistics_null; enc_opts.end_encode = final_statistics_null; } if(oe_encode(&enc_opts)) { errors++; } if(opt.scale > 0) { clear_scaler(&enc_opts); } if(opt.downmix) { clear_downmix(&enc_opts); } if(resampled) { clear_resample(&enc_opts); } clear_all: if(out_fn) free(out_fn); if(opt.outfile) free(opt.outfile); #ifdef _WIN32 if(enc_opts.filename) free(enc_opts.filename); if(enc_opts.infilename) free(enc_opts.infilename); #endif vorbis_comment_clear(&vc); format->close_func(enc_opts.readdata); if(closein) { fclose(in); } if(closeout) { fclose(out); } }/* Finished this file, loop around to next... */ return errors?1:0; }
int Encode ( char* szInput, char* szOutput, float fQuality ) { oe_options OggOptions = { "ISO-8859-1", NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, 0, 0, 16, 44100, 2, NULL, DEFAULT_NAMEFMT_REMOVE, DEFAULT_NAMEFMT_REPLACE, NULL, -1, -1, -1, -1,0 }; int i; char infiles [ 10 ] [ 256 ]; int numfiles; int errors = 0; setlocale ( LC_ALL, "" ); OggOptions.outfile = szOutput; OggOptions.raw_samplerate = 44100; OggOptions.serial = 0; OggOptions.nominal_bitrate = -1; OggOptions.min_bitrate = -1; OggOptions.max_bitrate = -1; OggOptions.quality = 0.1f; numfiles = 1; strcpy ( &infiles [ 0 ] [ 0 ], szInput ); if ( OggOptions.serial == 0 ) OggOptions.serial = rand ( ); for ( i = 0; i < numfiles; i++ ) { oe_enc_opt enc_opts; vorbis_comment vc; char* out_fn = NULL; FILE* in = NULL; FILE* out = NULL; int foundformat = 0; int closeout = 0, closein = 0; char *artist=NULL, *album=NULL, *title=NULL, *track=NULL; char *date=NULL, *genre=NULL; input_format *format; enc_opts.serialno = OggOptions.serial++; memset ( &vc, 0, sizeof ( vc ) ); in = fopen ( infiles [ i ], "rb" ); if ( in == NULL ) { free ( out_fn ); errors++; continue; } closein = 1; format = open_audio_file ( in, &enc_opts ); if ( format ) foundformat = 1; if ( !foundformat ) { if ( closein ) fclose ( in ); errors++; continue; } if ( OggOptions.outfile ) out_fn = strdup ( OggOptions.outfile ); out = fopen ( out_fn, "wb" ); if ( out == NULL ) { if ( closein ) fclose ( in ); errors++; free ( out_fn ); continue; } closeout = 1; enc_opts.out = out; enc_opts.comments = &vc; enc_opts.filename = out_fn; enc_opts.infilename = infiles [ i ]; enc_opts.bitrate = OggOptions.nominal_bitrate; enc_opts.min_bitrate = OggOptions.min_bitrate; enc_opts.max_bitrate = OggOptions.max_bitrate; enc_opts.quality = OggOptions.quality; if ( oe_encode ( &enc_opts ) ) errors++; if ( out_fn ) free ( out_fn ); vorbis_comment_clear ( &vc ); if ( !OggOptions.rawmode ) format->close_func ( enc_opts.readdata ); if ( closein ) fclose ( in ); if ( closeout ) fclose ( out ); } return errors ? 1 : 0; }