FLAC__uint64 samples_processed;
unsigned frame_counter;
FLAC__bool abort_flag;
+ FLAC__bool aborting_due_to_until; /* true if we intentionally abort decoding prematurely because we hit the --until point */
struct {
FLAC__bool needs_fixup;
d->samples_processed = 0;
d->frame_counter = 0;
d->abort_flag = false;
+ d->aborting_due_to_until = false;
d->wave_chunk_size_fixup.needs_fixup = false;
print_error_with_state(d, "ERROR seeking while skipping bytes");
return false;
}
- if(!FLAC__file_decoder_process_until_end_of_file(d->decoder.flac.file)) {
+ if(!FLAC__file_decoder_process_until_end_of_file(d->decoder.flac.file) && !d->aborting_due_to_until) {
if(d->verbose) fprintf(stderr, "\n");
print_error_with_state(d, "ERROR while decoding frames");
return false;
}
- if(FLAC__file_decoder_get_state(d->decoder.flac.file) != FLAC__FILE_DECODER_OK && FLAC__file_decoder_get_state(d->decoder.flac.file) != FLAC__FILE_DECODER_END_OF_FILE) {
+ if(FLAC__file_decoder_get_state(d->decoder.flac.file) != FLAC__FILE_DECODER_OK && FLAC__file_decoder_get_state(d->decoder.flac.file) != FLAC__FILE_DECODER_END_OF_FILE && !d->aborting_due_to_until) {
if(d->verbose) fprintf(stderr, "\n");
print_error_with_state(d, "ERROR during decoding");
return false;
else {
#ifdef FLAC__HAS_OGG
if(d->is_ogg) {
- if(!OggFLAC__stream_decoder_process_until_end_of_stream(d->decoder.ogg.stream)) {
+ if(!OggFLAC__stream_decoder_process_until_end_of_stream(d->decoder.ogg.stream) && !d->aborting_due_to_until) {
if(d->verbose) fprintf(stderr, "\n");
print_error_with_state(d, "ERROR while decoding data");
return false;
}
- if(OggFLAC__stream_decoder_get_FLAC_stream_decoder_state(d->decoder.ogg.stream) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA && OggFLAC__stream_decoder_get_FLAC_stream_decoder_state(d->decoder.ogg.stream) != FLAC__STREAM_DECODER_END_OF_STREAM) {
+ if(OggFLAC__stream_decoder_get_FLAC_stream_decoder_state(d->decoder.ogg.stream) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA && OggFLAC__stream_decoder_get_FLAC_stream_decoder_state(d->decoder.ogg.stream) != FLAC__STREAM_DECODER_END_OF_STREAM && !d->aborting_due_to_until) {
if(d->verbose) fprintf(stderr, "\n");
print_error_with_state(d, "ERROR during decoding");
return false;
else
#endif
{
- if(!FLAC__file_decoder_process_until_end_of_file(d->decoder.flac.file)) {
+ if(!FLAC__file_decoder_process_until_end_of_file(d->decoder.flac.file) && !d->aborting_due_to_until) {
if(d->verbose) fprintf(stderr, "\n");
print_error_with_state(d, "ERROR while decoding data");
return false;
}
- if(FLAC__file_decoder_get_state(d->decoder.flac.file) != FLAC__FILE_DECODER_OK && FLAC__file_decoder_get_state(d->decoder.flac.file) != FLAC__FILE_DECODER_END_OF_FILE) {
+ if(FLAC__file_decoder_get_state(d->decoder.flac.file) != FLAC__FILE_DECODER_OK && FLAC__file_decoder_get_state(d->decoder.flac.file) != FLAC__FILE_DECODER_END_OF_FILE && !d->aborting_due_to_until) {
if(d->verbose) fprintf(stderr, "\n");
print_error_with_state(d, "ERROR during decoding");
return false;
#endif
{
if(d->decoder.flac.file) {
- md5_failure = !FLAC__file_decoder_finish(d->decoder.flac.file);
+ md5_failure = !FLAC__file_decoder_finish(d->decoder.flac.file) && !d->aborting_due_to_until;
print_stats(d);
FLAC__file_decoder_delete(d->decoder.flac.file);
}
FLAC__ASSERT(until >= input_samples_passed);
if(input_samples_passed + wide_samples > until)
wide_samples = (unsigned)(until - input_samples_passed);
+ if (wide_samples == 0) {
+ decoder_session->abort_flag = true;
+ decoder_session->aborting_due_to_until = true;
+ return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
+ }
}
if(wide_samples > 0) {