* We can not consume directly what was copied by the read callback
* because we might need to feed unconsumend bytes to the decoder again
* after the read callback ran out of data and returned ABORT. So we
- * track how many bytes are unconsumed so far.
+ * track how many bytes have been fed to libflac but are unconsumed so far.
*/
size_t unconsumed;
};
}
if (*bytes > 0)
return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
+ /**
+ * Nothing was copied. If the input queue of the btrn is smaller than
+ * the minimal input queue size, our parent must have been gone, so
+ * we're not going to get more input. Since our remaining data is not
+ * sufficient do decode a single frame, we have an EOF condition.
+ */
+ if (btr_get_input_queue_size(btrn) < fn->min_iqs) {
+ assert(btr_no_parent(btrn));
+ return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
+ }
/*
* We are kind of screwed here. Returning CONTINUE with a byte count of
* zero leads to an endless loop, so we must return either EOF or
write_int16_host_endian(outbuffer + 4 * k + 2, right);
}
}
- btr_add_output(outbuffer, n * 4, btrn);
+ btr_add_output(outbuffer, n * channels * 2, btrn);
flac_consume(fn);
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
}
struct private_flacdec_data *pfd = fn->private_data;
struct btr_node *btrn = fn->btrn;
int ret;
+ FLAC__StreamDecoderState state;
if (output_queue_full(btrn))
return 0;
goto out;
}
pfd->have_more = false;
- FLAC__StreamDecoderState state;
FLAC__stream_decoder_process_single(pfd->decoder);
state = FLAC__stream_decoder_get_state(pfd->decoder);
ret = -E_FLACDEC_EOF;