static int lame_decoder(lame_t gfp, FILE * outf, char *inPath, char *outPath) { short int Buffer[2][1152]; int i, iread; double wavsize; int tmp_num_channels = lame_get_num_channels(gfp); int skip_start = samples_to_skip_at_start(); int skip_end = samples_to_skip_at_end(); DecoderProgress dp = 0; if (!(tmp_num_channels >= 1 && tmp_num_channels <= 2)) { error_printf("Internal error. Aborting."); exit(-1); } if (global_ui_config.silent < 9) { console_printf("\rinput: %s%s(%g kHz, %i channel%s, ", strcmp(inPath, "-") ? inPath : "<stdin>", strlen(inPath) > 26 ? "\n\t" : " ", lame_get_in_samplerate(gfp) / 1.e3, tmp_num_channels, tmp_num_channels != 1 ? "s" : ""); printInputFormat(gfp); console_printf(")\noutput: %s%s(16 bit, Microsoft WAVE)\n", strcmp(outPath, "-") ? outPath : "<stdout>", strlen(outPath) > 45 ? "\n\t" : " "); if (skip_start > 0) console_printf("skipping initial %i samples (encoder+decoder delay)\n", skip_start); if (skip_end > 0) console_printf("skipping final %i samples (encoder padding-decoder delay)\n", skip_end); switch (global_reader.input_format) { case sf_mp3: case sf_mp2: case sf_mp1: dp = decoder_progress_init(lame_get_num_samples(gfp), global_decoder.mp3input_data.framesize); break; case sf_raw: case sf_wave: case sf_aiff: default: dp = decoder_progress_init(lame_get_num_samples(gfp), lame_get_in_samplerate(gfp) < 32000 ? 576 : 1152); break; } } if (0 == global_decoder.disable_wav_header) WriteWaveHeader(outf, 0x7FFFFFFF, lame_get_in_samplerate(gfp), tmp_num_channels, 16); /* unknown size, so write maximum 32 bit signed value */ wavsize = 0; do { iread = get_audio16(gfp, Buffer); /* read in 'iread' samples */ if (iread >= 0) { wavsize += iread; if (dp != 0) { decoder_progress(dp, &global_decoder.mp3input_data, iread); } put_audio16(outf, Buffer, iread, tmp_num_channels); } } while (iread > 0); i = (16 / 8) * tmp_num_channels; assert(i > 0); if (wavsize <= 0) { if (global_ui_config.silent < 10) error_printf("WAVE file contains 0 PCM samples\n"); wavsize = 0; } else if (wavsize > 0xFFFFFFD0 / i) { if (global_ui_config.silent < 10) error_printf("Very huge WAVE file, can't set filesize accordingly\n"); wavsize = 0xFFFFFFD0; } else { wavsize *= i; } /* if outf is seekable, rewind and adjust length */ if (!global_decoder.disable_wav_header && strcmp("-", outPath) && !fseek(outf, 0l, SEEK_SET)) WriteWaveHeader(outf, (int) wavsize, lame_get_in_samplerate(gfp), tmp_num_channels, 16); fclose(outf); close_infile(); if (dp != 0) decoder_progress_finish(dp); return 0; }
int lame_decoder(lame_global_flags * gfp, FILE * outf, int skip, char *inPath, char *outPath) { short int Buffer[2][1152]; int iread; double wavsize; int i; void (*WriteFunction) (FILE * fp, char *p, int n); int tmp_num_channels = lame_get_num_channels( gfp ); if (silent < 10) fprintf(stderr, "\rinput: %s%s(%g kHz, %i channel%s, ", strcmp(inPath, "-") ? inPath : "<stdin>", strlen(inPath) > 26 ? "\n\t" : " ", lame_get_in_samplerate( gfp ) / 1.e3, tmp_num_channels, tmp_num_channels != 1 ? "s" : ""); switch (input_format) { case sf_mp3: if (skip==0) { if (enc_delay>-1) skip = enc_delay + 528+1; else skip=lame_get_encoder_delay(gfp)+528+1; }else{ /* user specified a value of skip. just add for decoder */ skip += 528+1; /* mp3 decoder has a 528 sample delay, plus user supplied "skip" */ } if (silent < 10) fprintf(stderr, "MPEG-%u%s Layer %s", 2 - lame_get_version(gfp), lame_get_out_samplerate( gfp ) < 16000 ? ".5" : "", "III"); break; case sf_mp2: skip += 240 + 1; if (silent < 10) fprintf(stderr, "MPEG-%u%s Layer %s", 2 - lame_get_version(gfp), lame_get_out_samplerate( gfp ) < 16000 ? ".5" : "", "II"); break; case sf_mp1: skip += 240 + 1; if (silent < 10) fprintf(stderr, "MPEG-%u%s Layer %s", 2 - lame_get_version(gfp), lame_get_out_samplerate( gfp ) < 16000 ? ".5" : "", "I"); break; case sf_raw: if (silent < 10) fprintf(stderr, "raw PCM data"); mp3input_data.nsamp = lame_get_num_samples( gfp ); mp3input_data.framesize = 1152; skip = 0; /* other formats have no delay *//* is += 0 not better ??? */ break; case sf_wave: if (silent < 10) fprintf(stderr, "Microsoft WAVE"); mp3input_data.nsamp = lame_get_num_samples( gfp ); mp3input_data.framesize = 1152; skip = 0; /* other formats have no delay *//* is += 0 not better ??? */ break; case sf_aiff: if (silent < 10) fprintf(stderr, "SGI/Apple AIFF"); mp3input_data.nsamp = lame_get_num_samples( gfp ); mp3input_data.framesize = 1152; skip = 0; /* other formats have no delay *//* is += 0 not better ??? */ break; default: if (silent < 10) fprintf(stderr, "unknown"); mp3input_data.nsamp = lame_get_num_samples( gfp ); mp3input_data.framesize = 1152; skip = 0; /* other formats have no delay *//* is += 0 not better ??? */ assert(0); break; } if (silent < 10) { fprintf(stderr, ")\noutput: %s%s(16 bit, Microsoft WAVE)\n", strcmp(outPath, "-") ? outPath : "<stdout>", strlen(outPath) > 45 ? "\n\t" : " "); if (skip > 0) fprintf(stderr, "skipping initial %i samples (encoder+decoder delay)\n", skip); } if ( 0 == disable_wav_header ) WriteWaveHeader(outf, 0x7FFFFFFF, lame_get_in_samplerate( gfp ), tmp_num_channels, 16); /* unknown size, so write maximum 32 bit signed value */ wavsize = -skip; WriteFunction = swapbytes ? WriteBytesSwapped : WriteBytes; mp3input_data.totalframes = mp3input_data.nsamp / mp3input_data.framesize; assert(tmp_num_channels >= 1 && tmp_num_channels <= 2); do { iread = get_audio16(gfp, Buffer); /* read in 'iread' samples */ mp3input_data.framenum += iread / mp3input_data.framesize; wavsize += iread; if (silent <= 0) decoder_progress(gfp, &mp3input_data); skip -= (i = skip < iread ? skip : iread); /* 'i' samples are to skip in this frame */ for (; i < iread; i++) { if ( disable_wav_header ) { WriteFunction(outf, (char *) &Buffer[0][i], sizeof(short)); if (tmp_num_channels == 2) WriteFunction(outf, (char *) &Buffer[1][i], sizeof(short)); } else { Write16BitsLowHigh(outf, Buffer[0][i]); if (tmp_num_channels == 2) Write16BitsLowHigh(outf, Buffer[1][i]); } } } while (iread); i = (16 / 8) * tmp_num_channels; assert(i > 0); if (wavsize <= 0) { if (silent < 10) fprintf(stderr, "WAVE file contains 0 PCM samples\n"); wavsize = 0; } else if (wavsize > 0xFFFFFFD0 / i) { if (silent < 10) fprintf(stderr, "Very huge WAVE file, can't set filesize accordingly\n"); wavsize = 0xFFFFFFD0; } else { wavsize *= i; } if ( 0 == disable_wav_header ) if (!fseek(outf, 0l, SEEK_SET)) /* if outf is seekable, rewind and adjust length */ WriteWaveHeader(outf, (int)wavsize, lame_get_in_samplerate( gfp ), tmp_num_channels, 16); fclose(outf); if (silent <= 0) decoder_progress_finish(gfp); return 0; }