Index: apps/codecs/libmusepack/mpc_demux.c =================================================================== --- apps/codecs/libmusepack/mpc_demux.c (revision 28184) +++ apps/codecs/libmusepack/mpc_demux.c (working copy) @@ -120,6 +120,26 @@ */ static void mpc_demux_seek(mpc_demux * d, mpc_seek_t fpos, mpc_uint32_t min_bytes) { + mpc_seek_t next_pos; + mpc_int_t bit_offset; + + next_pos = fpos >> 3; + + if (d->si.stream_version == 7) + next_pos = ((next_pos - d->si.header_position) & (-1 << 2)) + d->si.header_position; + bit_offset = (int) (fpos - (next_pos << 3)); + + d->r->seek(d->r, (mpc_int32_t) next_pos); + mpc_demux_clear_buff(d); + if (d->si.stream_version == 7) + mpc_demux_fill(d, (min_bytes + ((bit_offset + 7) >> 3) + 3) & (~3), MPC_BUFFER_SWAP); + else + mpc_demux_fill(d, min_bytes + ((bit_offset + 7) >> 3), 0); + d->bits_reader.buff += bit_offset >> 3; + d->bits_reader.count = 8 - (bit_offset & 7); + + + /* // d->bits_reader.buff - d->buffer = current byte position within buffer // d->bytes_total = buffer is filled with bytes_total bytes // fpos = desired file position in bit (not byte) @@ -147,6 +167,7 @@ d->bits_reader.buff += buf_fpos >> 3; d->bits_reader.count = 8 - (buf_fpos & 7); } + */ } /** @@ -297,7 +318,7 @@ cur = mpc_demux_pos(d); mpc_bits_get_size(&d->bits_reader, &ptr); - mpc_demux_seek(d, (ptr - size) * 8 + cur, 11); + mpc_demux_seek(d, (ptr - size) * 8 + cur, 20); st_head_size = mpc_bits_get_block(&d->bits_reader, &b); if (memcmp(b.key, "ST", 2) == 0) { /* rockbox: not used @@ -322,7 +343,7 @@ if (d->chap_pos == 0) { mpc_uint64_t cur_pos = (d->si.header_position + 4) * 8; - mpc_demux_seek(d, cur_pos, 11); // seek to the beginning of the stream + mpc_demux_seek(d, cur_pos, 20); // seek to the beginning of the stream size = mpc_bits_get_block(&d->bits_reader, &b); while (memcmp(b.key, "SE", 2) != 0) { if (mpc_check_key(b.key) != MPC_STATUS_OK) @@ -332,7 +353,7 @@ } else d->chap_pos = 0; cur_pos += (size + b.size) * 8; - mpc_demux_seek(d, cur_pos, 11); + mpc_demux_seek(d, cur_pos, 20); size = mpc_bits_get_block(&d->bits_reader, &b); } if (d->chap_pos == 0) @@ -357,7 +378,7 @@ d->chap = malloc(sizeof(mpc_chap_info) * d->chap_nb + tag_size); ptag = (char*)(d->chap + d->chap_nb); - mpc_demux_seek(d, d->chap_pos, 11); + mpc_demux_seek(d, d->chap_pos, 20); size = mpc_bits_get_block(&d->bits_reader, &b); while (memcmp(b.key, "CT", 2) == 0) { mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, 0); @@ -611,7 +632,7 @@ if (d->si.stream_version >= 8) { mpc_block b; int size; - mpc_demux_seek(d, fpos, 11); + mpc_demux_seek(d, fpos, 20); size = mpc_bits_get_block(&d->bits_reader, &b); while(i < fwd) { if (memcmp(b.key, "AP", 2) == 0) { @@ -623,7 +644,7 @@ i++; } fpos += ((mpc_uint32_t)b.size + size) * 8; - mpc_demux_seek(d, fpos, 11); + mpc_demux_seek(d, fpos, 20); size = mpc_bits_get_block(&d->bits_reader, &b); } d->bits_reader.buff -= size; Index: apps/codecs/mpc.c =================================================================== --- apps/codecs/mpc.c (revision 28184) +++ apps/codecs/mpc.c (working copy) @@ -134,6 +134,8 @@ else { samplesdone = 0; + retval = CODEC_ERROR; + goto done; } } @@ -149,6 +151,11 @@ samplesdone = new_offset; ci->set_elapsed(ci->seek_time); } + else + { + retval = CODEC_ERROR; + goto done; + } ci->seek_complete(); }