0.5.1 (to be announced) "temporary implication"
----------------------------------------------
- - audiod improvements and fixes.
- - buffer tree robustness improvements.
- - cleanup of the mood subsystem.
+Lots of fixes and improvements all over the place.
+
+ - Audiod improvements and fixes.
+ - Buffer tree robustness improvements.
+ - Cleanup of the mood subsystem.
+ - Fixes and cleanups for the flac decoder.
----------------------------------------
0.5.0 (2013-08-23) "invertible validity"
*
* \return Zero or a negative error code. If the underlying call to readv(2)
* returned zero (indicating an end of file condition) or failed for some
- * reason other than \p EAGAIN, a negative return value is returned.
+ * reason other than \p EAGAIN, a negative error code is returned.
*
* In any case, \a num_bytes contains the number of bytes that have been
* successfully read from \a fd (zero if the first readv() call failed with
* 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;
goto out;
if (state == FLAC__STREAM_DECODER_ABORTED) {
FLAC__stream_decoder_flush(pfd->decoder);
- fn->min_iqs = pfd->unconsumed + 1;
+ pfd->unconsumed = 0; /* feed unconsumed bytes again */
+ fn->min_iqs = btr_get_input_queue_size(btrn) + 1;
ret = 1;
goto out;
}
+ pfd->have_more = true;
fn->min_iqs = 0;
ret = 1;
out: