summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/codecs/libmusepack/decoder.h2
-rw-r--r--apps/codecs/libmusepack/mpc_decoder.c31
-rw-r--r--apps/codecs/libmusepack/musepack.h2
3 files changed, 21 insertions, 14 deletions
diff --git a/apps/codecs/libmusepack/decoder.h b/apps/codecs/libmusepack/decoder.h
index 759670ee72..708533b09e 100644
--- a/apps/codecs/libmusepack/decoder.h
+++ b/apps/codecs/libmusepack/decoder.h
@@ -67,7 +67,7 @@ typedef struct mpc_decoder_t {
mpc_uint32_t Zaehler; /// actual index within read-buffer
mpc_uint32_t samples_to_skip;
-
+ mpc_uint32_t last_block_samples;
mpc_uint32_t FwdJumpInfo;
mpc_uint32_t ActDecodePos;
diff --git a/apps/codecs/libmusepack/mpc_decoder.c b/apps/codecs/libmusepack/mpc_decoder.c
index 1291055327..ee98722a05 100644
--- a/apps/codecs/libmusepack/mpc_decoder.c
+++ b/apps/codecs/libmusepack/mpc_decoder.c
@@ -351,6 +351,21 @@ mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer)
mpc_uint32_t FrameBitCnt = 0;
+ // output the last part of the last frame here, if needed
+ if (d->last_block_samples > 0) {
+ output_frame_length = d->last_block_samples;
+ d->last_block_samples = 0; // it's going to be handled now, so reset it
+ if (!d->TrueGaplessPresent) {
+ mpc_decoder_reset_y(d);
+ } else {
+ mpc_decoder_bitstream_read(d, 20);
+ mpc_decoder_read_bitstream_sv7(d);
+ mpc_decoder_requantisierung(d, d->Max_Band);
+ }
+ mpc_decoder_synthese_filter_float(d, buffer);
+ return output_frame_length;
+ }
+
if (d->DecodedFrames >= d->OverallFrames) {
return (mpc_uint32_t)(-1); // end of file -> abort decoding
}
@@ -403,19 +418,10 @@ mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer)
// additional FilterDecay samples are needed for decay of synthesis filter
if (MPC_DECODER_SYNTH_DELAY + mod_block >= MPC_FRAME_LENGTH) {
- if (!d->TrueGaplessPresent) {
- mpc_decoder_reset_y(d);
- } else {
- mpc_decoder_bitstream_read(d, 20);
- mpc_decoder_read_bitstream_sv7(d);
- mpc_decoder_requantisierung(d, d->Max_Band);
- }
-
- mpc_decoder_synthese_filter_float(d, buffer + 2304);
-
- output_frame_length = MPC_FRAME_LENGTH + FilterDecay;
+ // this variable will be checked for at the top of the function
+ d->last_block_samples = FilterDecay;
}
- else { // there are only FilterDecay samples needed for this frame
+ else { // there are only FilterDecay samples needed for this frame
output_frame_length = FilterDecay;
}
}
@@ -1173,6 +1179,7 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r)
d->OverallFrames = 0;
d->DecodedFrames = 0;
d->TrueGaplessPresent = 0;
+ d->last_block_samples = 0;
d->WordsRead = 0;
d->Max_Band = 0;
d->SampleRate = 0;
diff --git a/apps/codecs/libmusepack/musepack.h b/apps/codecs/libmusepack/musepack.h
index d631c6d05d..9155f3f74d 100644
--- a/apps/codecs/libmusepack/musepack.h
+++ b/apps/codecs/libmusepack/musepack.h
@@ -58,7 +58,7 @@ extern "C" {
enum {
MPC_FRAME_LENGTH = (36 * 32), /// samples per mpc frame
- MPC_DECODER_BUFFER_LENGTH = 4 * MPC_FRAME_LENGTH /// required buffer size for decoder
+ MPC_DECODER_BUFFER_LENGTH = 2 * MPC_FRAME_LENGTH /// required buffer size for decoder
};
// error codes