#else
# include <unistd.h>
#endif
-#include <assert.h> /* for FILE */
#include <stdio.h> /* for FILE */
#include <string.h> /* for strcmp() */
#include "FLAC/all.h"
static void error_callback(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
static void print_stats(const stream_info_struct *stream_info);
-int decode_wav(const char *infile, const char *outfile, bool analysis_mode, analysis_options aopts, bool verbose, uint64 skip)
+int flac__decode_wav(const char *infile, const char *outfile, bool analysis_mode, analysis_options aopts, bool verbose, uint64 skip)
{
bool md5_failure = false;
stream_info_struct stream_info;
stream_info.skip_count_too_high = false;
stream_info.samples_processed = 0;
stream_info.frame_counter = 0;
+ stream_info.fout = 0; /* initialized with an open file later if necessary */
- assert(!(stream_info.test_only && stream_info.analysis_mode));
+ FLAC__ASSERT(!(stream_info.test_only && stream_info.analysis_mode));
if(!stream_info.test_only) {
if(0 == strcmp(outfile, "-")) {
goto wav_abort_;
}
if(!FLAC__file_decoder_process_remaining_frames(decoder)) {
- if(verbose) { printf("\n"); fflush(stdout); }
+ if(verbose) fprintf(stderr, "\n");
fprintf(stderr, "%s: ERROR while decoding frames, state=%d:%s\n", infile, decoder->state, FLAC__FileDecoderStateString[decoder->state]);
goto wav_abort_;
}
if(decoder->state != FLAC__FILE_DECODER_OK && decoder->state != FLAC__FILE_DECODER_END_OF_FILE) {
- if(verbose) { printf("\n"); fflush(stdout); }
+ if(verbose) fprintf(stderr, "\n");
fprintf(stderr, "%s: ERROR during decoding, state=%d:%s\n", infile, decoder->state, FLAC__FileDecoderStateString[decoder->state]);
goto wav_abort_;
}
}
else {
if(!FLAC__file_decoder_process_whole_file(decoder)) {
- if(verbose) { printf("\n"); fflush(stdout); }
+ if(verbose) fprintf(stderr, "\n");
fprintf(stderr, "%s: ERROR while decoding data, state=%d:%s\n", infile, decoder->state, FLAC__FileDecoderStateString[decoder->state]);
goto wav_abort_;
}
if(decoder->state != FLAC__FILE_DECODER_OK && decoder->state != FLAC__FILE_DECODER_END_OF_FILE) {
- if(verbose) { printf("\n"); fflush(stdout); }
+ if(verbose) fprintf(stderr, "\n");
fprintf(stderr, "%s: ERROR during decoding, state=%d:%s\n", infile, decoder->state, FLAC__FileDecoderStateString[decoder->state]);
goto wav_abort_;
}
print_stats(&stream_info);
FLAC__file_decoder_free_instance(decoder);
}
- if(!stream_info.test_only)
+ if(0 != stream_info.fout && stream_info.fout != stdout)
fclose(stream_info.fout);
if(verbose)
- printf("\n");
- fflush(stdout);
+ fprintf(stderr, "\n");
if(analysis_mode)
analyze_finish(aopts);
if(md5_failure) {
}
else {
if(stream_info.test_only)
- printf("%s: ok\n", infile);
+ fprintf(stderr, "%s: ok\n", infile);
}
return 0;
wav_abort_:
FLAC__file_decoder_finish(decoder);
FLAC__file_decoder_free_instance(decoder);
}
- if(!stream_info.test_only) {
+ if(0 != stream_info.fout && stream_info.fout != stdout) {
fclose(stream_info.fout);
unlink(outfile);
}
return 1;
}
-int decode_raw(const char *infile, const char *outfile, bool analysis_mode, analysis_options aopts, bool verbose, uint64 skip, bool is_big_endian, bool is_unsigned_samples)
+int flac__decode_raw(const char *infile, const char *outfile, bool analysis_mode, analysis_options aopts, bool verbose, uint64 skip, bool is_big_endian, bool is_unsigned_samples)
{
bool md5_failure = false;
stream_info_struct stream_info;
stream_info.skip_count_too_high = false;
stream_info.samples_processed = 0;
stream_info.frame_counter = 0;
+ stream_info.fout = 0; /* initialized with an open file later if necessary */
- assert(!(stream_info.test_only && stream_info.analysis_mode));
+ FLAC__ASSERT(!(stream_info.test_only && stream_info.analysis_mode));
if(!stream_info.test_only) {
if(0 == strcmp(outfile, "-")) {
goto raw_abort_;
}
if(!FLAC__file_decoder_process_remaining_frames(decoder)) {
- if(verbose) { printf("\n"); fflush(stdout); }
+ if(verbose) fprintf(stderr, "\n");
fprintf(stderr, "%s: ERROR while decoding frames, state=%d:%s\n", infile, decoder->state, FLAC__FileDecoderStateString[decoder->state]);
goto raw_abort_;
}
if(decoder->state != FLAC__FILE_DECODER_OK && decoder->state != FLAC__FILE_DECODER_END_OF_FILE) {
- if(verbose) { printf("\n"); fflush(stdout); }
+ if(verbose) fprintf(stderr, "\n");
fprintf(stderr, "%s: ERROR during decoding, state=%d:%s\n", infile, decoder->state, FLAC__FileDecoderStateString[decoder->state]);
goto raw_abort_;
}
}
else {
if(!FLAC__file_decoder_process_whole_file(decoder)) {
- if(verbose) { printf("\n"); fflush(stdout); }
+ if(verbose) fprintf(stderr, "\n");
fprintf(stderr, "%s: ERROR while decoding data, state=%d:%s\n", infile, decoder->state, FLAC__FileDecoderStateString[decoder->state]);
goto raw_abort_;
}
if(decoder->state != FLAC__FILE_DECODER_OK && decoder->state != FLAC__FILE_DECODER_END_OF_FILE) {
- if(verbose) { printf("\n"); fflush(stdout); }
+ if(verbose) fprintf(stderr, "\n");
fprintf(stderr, "%s: ERROR during decoding, state=%d:%s\n", infile, decoder->state, FLAC__FileDecoderStateString[decoder->state]);
goto raw_abort_;
}
print_stats(&stream_info);
FLAC__file_decoder_free_instance(decoder);
}
- if(!stream_info.test_only)
+ if(0 != stream_info.fout && stream_info.fout != stdout)
fclose(stream_info.fout);
if(verbose)
- printf("\n");
- fflush(stdout);
+ fprintf(stderr, "\n");
if(analysis_mode)
analyze_finish(aopts);
if(md5_failure) {
}
else {
if(stream_info.test_only)
- printf("%s: ok\n", infile);
+ fprintf(stderr, "%s: ok\n", infile);
}
return 0;
raw_abort_:
FLAC__file_decoder_finish(decoder);
FLAC__file_decoder_free_instance(decoder);
}
- if(!stream_info.test_only) {
+ if(0 != stream_info.fout && stream_info.fout != stdout) {
fclose(stream_info.fout);
unlink(outfile);
}
stream_info->samples_processed += wide_samples;
stream_info->frame_counter++;
- if(stream_info->verbose && !(stream_info->frame_counter & 0x1f))
+ if(stream_info->verbose && !(stream_info->frame_counter & 0x7f))
print_stats(stream_info);
if(stream_info->analysis_mode) {
return FLAC__STREAM_DECODER_WRITE_ABORT;
}
else {
- assert(0);
+ FLAC__ASSERT(0);
}
}
return FLAC__STREAM_DECODER_WRITE_CONTINUE;
void print_stats(const stream_info_struct *stream_info)
{
if(stream_info->verbose) {
- printf("\r%s %u of %u samples, %6.2f%% complete",
- stream_info->test_only? "tested" : stream_info->analysis_mode? "analyzed" : "wrote",
- (unsigned)stream_info->samples_processed,
- (unsigned)stream_info->total_samples,
+ if(stream_info->total_samples > 0) {
+ fprintf(stderr, "\r%s %u of %u samples, %6.2f%% complete",
+ stream_info->test_only? "tested" : stream_info->analysis_mode? "analyzed" : "wrote",
+ (unsigned)stream_info->samples_processed,
+ (unsigned)stream_info->total_samples,
#ifdef _MSC_VER
- /* with VC++ you have to spoon feed it the casting */
- (double)(int64)stream_info->samples_processed / (double)(int64)stream_info->total_samples * 100.0
+ /* with VC++ you have to spoon feed it the casting */
+ (double)(int64)stream_info->samples_processed / (double)(int64)stream_info->total_samples * 100.0
#else
- (double)stream_info->samples_processed / (double)stream_info->total_samples * 100.0
+ (double)stream_info->samples_processed / (double)stream_info->total_samples * 100.0
#endif
- );
- fflush(stdout);
+ );
+ }
+ else {
+ fprintf(stderr, "\r%s %u of ? samples, ?%% complete",
+ stream_info->test_only? "tested" : stream_info->analysis_mode? "analyzed" : "wrote",
+ (unsigned)stream_info->samples_processed
+ );
+ }
}
}