Index: /libmpcdec/branches/zorg/src/decoder.h
===================================================================
--- /libmpcdec/branches/zorg/src/decoder.h	(revision 125)
+++ /libmpcdec/branches/zorg/src/decoder.h	(revision 126)
@@ -67,11 +67,10 @@
 	mpc_uint32_t max_band;           ///< Maximum band-index used in stream (0...31)
 	mpc_uint32_t ms;                 ///< Mid/side stereo (0: off, 1: on)
-	mpc_uint32_t is_true_gapless;    ///< True gapless? (0: no, 1: yes)
-	mpc_uint32_t frames;             ///< Number of frames in stream
-	mpc_uint32_t last_frame_samples; ///< Number of valid samples within last frame
 	mpc_uint32_t channels;           ///< Number of channels in stream
 
+	mpc_uint64_t samples;            ///< Number of samples in stream
+
+	mpc_uint64_t decoded_samples;    ///< Number of samples decoded from file begining
 	mpc_uint32_t samples_to_skip;    ///< Number samples to skip (used for seeking)
-	mpc_uint32_t decoded_frames;     ///< Number of frames decoded from file begining
 
     // randomizer state variables
Index: /libmpcdec/branches/zorg/src/mpc_decoder.c
===================================================================
--- /libmpcdec/branches/zorg/src/mpc_decoder.c	(revision 125)
+++ /libmpcdec/branches/zorg/src/mpc_decoder.c	(revision 126)
@@ -70,9 +70,9 @@
 static void mpc_decoder_requantisierung(mpc_decoder *d);
 
-static void mpc_decoder_reset_y(mpc_decoder *d)
-{
-	memset(d->Y_L, 0, sizeof d->Y_L);
-	memset(d->Y_R, 0, sizeof d->Y_R);
-}
+// static void mpc_decoder_reset_y(mpc_decoder *d)
+// {
+// 	memset(d->Y_L, 0, sizeof d->Y_L);
+// 	memset(d->Y_R, 0, sizeof d->Y_R);
+// }
 
 void mpc_decoder_setup(mpc_decoder *d)
@@ -92,8 +92,10 @@
 	d->ms                 = si->ms;
 	d->max_band           = si->max_band;
-	d->frames             = si->frames;
-	d->is_true_gapless    = si->is_true_gapless;
 	d->channels           = si->channels;
-	d->last_frame_samples = si->last_frame_samples;
+
+	if (si->stream_version == 7 && si->is_true_gapless)
+		d->samples = ((si->samples + MPC_FRAME_LENGTH - 1) / MPC_FRAME_LENGTH) * MPC_FRAME_LENGTH;
+	else
+		d->samples = si->samples;
 }
 
@@ -119,28 +121,28 @@
 							  mpc_frame_info * i)
 {
+	mpc_bits_reader r_sav = *r;
 	mpc_int64_t samples_left;
-	if (d->decoded_frames >= d->frames && !d->is_true_gapless) {
-		mpc_decoder_reset_y(d);
-	} else {
-		mpc_decoder_read_bitstream_sv7(d, r);
-		mpc_decoder_requantisierung(d);
+
+	if (d->decoded_samples >= d->samples && d->samples != 0) {
+		i->samples = 0;
+		return;
 	}
+
+	mpc_decoder_read_bitstream_sv7(d, r);
+	mpc_decoder_requantisierung(d);
 	mpc_decoder_synthese_filter_float(d, i->buffer);
 
-	d->decoded_frames++;
-
-    // cut off first MPC_DECODER_SYNTH_DELAY zero-samples
+	d->decoded_samples += MPC_FRAME_LENGTH;
+
     // reconstruct exact filelength
-	if (d->decoded_frames == d->frames && (d->stream_version & 15) == 7 &&
-		(d->last_frame_samples = mpc_bits_read(r, 11)) == 0)
-		// Encoder bugfix
-		d->last_frame_samples = MPC_FRAME_LENGTH;
-
-	samples_left = d->last_frame_samples + MPC_DECODER_SYNTH_DELAY
-			+ ((mpc_int64_t)d->frames - d->decoded_frames) * MPC_FRAME_LENGTH;
-
+	if (d->decoded_samples == d->samples && d->stream_version == 7) {
+		int last_frame_samples = mpc_bits_read(r, 11);
+		if (last_frame_samples == 0) last_frame_samples = MPC_FRAME_LENGTH;
+		d->samples += last_frame_samples - MPC_FRAME_LENGTH;
+	}
+
+	samples_left = d->samples - d->decoded_samples + MPC_DECODER_SYNTH_DELAY;
 	i->samples = samples_left > MPC_FRAME_LENGTH ? MPC_FRAME_LENGTH : samples_left < 0 ? 0 : samples_left;
-
-	if (samples_left <= MPC_FRAME_LENGTH) d->is_true_gapless = 0;
+	i->bits = ((r->buff - r_sav.buff) << 3) + r_sav.count - r->count;
 
 	if (d->samples_to_skip) {
Index: /libmpcdec/branches/zorg/src/mpc_demux.c
===================================================================
--- /libmpcdec/branches/zorg/src/mpc_demux.c	(revision 125)
+++ /libmpcdec/branches/zorg/src/mpc_demux.c	(revision 126)
@@ -119,6 +119,7 @@
 
 	if (memcmp(magic, "MP+", 3) == 0) {
-		d->si.stream_version = magic[3];
-		if ((d->si.stream_version & 15) == 7) {
+		d->si.stream_version = magic[3] & 15;
+		d->si.pns = magic[3] >> 4;
+		if (d->si.stream_version == 7) {
 			mpc_demux_fill(d, 6 * 4, MPC_BUFFER_SWAP); // header block size + endian convertion
 			streaminfo_read_header_sv7(&d->si, &d->bits_reader);
@@ -183,5 +184,5 @@
 	if (d->si.stream_version == 8) {
 		mpc_bits_reader r;
-		if (d->block_bits < 8 && (d->d->decoded_frames < d->d->frames || d->d->frames == 0)){
+		if (d->block_bits < 8 && (d->d->decoded_samples < d->d->samples || d->d->samples == 0)){
 			mpc_block b;
 			d->bits_reader.count &= -8;
@@ -199,5 +200,5 @@
 		r = d->bits_reader;
 		mpc_decoder_decode_frame(d->d, &d->bits_reader, i);
-		d->block_bits -= (d->bits_reader.buff - r.buff) * 8 + r.count - d->bits_reader.count;
+		d->block_bits -= ((d->bits_reader.buff - r.buff) << 3) + r.count - d->bits_reader.count;
 	} else {
 		mpc_bits_reader r;
Index: /libmpcdec/branches/zorg/src/streaminfo.c
===================================================================
--- /libmpcdec/branches/zorg/src/streaminfo.c	(revision 125)
+++ /libmpcdec/branches/zorg/src/streaminfo.c	(revision 126)
@@ -99,7 +99,8 @@
 {
     mpc_uint16_t Estimatedpeak_title = 0;
+	mpc_uint32_t frames, last_frame_samples;
 
 	si->bitrate            = 0;
-	si->frames             = mpc_bits_read(r, 32);
+	frames                 = mpc_bits_read(r, 32);
 	mpc_bits_read(r, 1); // intensity stereo : should be 0
 	si->ms                 = mpc_bits_read(r, 1);
@@ -115,5 +116,5 @@
 	si->peak_album         = (mpc_uint16_t) mpc_bits_read(r, 16);
 	si->is_true_gapless    = mpc_bits_read(r, 1); // true gapless: used?
-	si->last_frame_samples = mpc_bits_read(r, 11); // true gapless: valid samples for last frame
+	last_frame_samples     = mpc_bits_read(r, 11); // true gapless: valid samples for last frame
 	si->fast_seek          = mpc_bits_read(r, 1); // fast seeking
 	mpc_bits_read(r, 19); // unused
@@ -123,10 +124,13 @@
 	mpc_get_encoder_string(si);
 
-	// estimation, exact value needs too much time
-	si->pcm_samples     = 1152 * si->frames - 576;
-	si->average_bitrate = 0;
-	if (si->pcm_samples > 0)
-		si->average_bitrate = (si->tag_offset  - si->header_position) * 8.0
-				*  si->sample_freq / si->pcm_samples;
+	if (last_frame_samples == 0) last_frame_samples = MPC_FRAME_LENGTH;
+	si->samples = (mpc_int64_t) frames * MPC_FRAME_LENGTH;
+	if (si->is_true_gapless)
+		si->samples -= (MPC_FRAME_LENGTH - last_frame_samples);
+	else
+		si->samples -= MPC_DECODER_SYNTH_DELAY;
+
+	si->average_bitrate = (si->tag_offset  - si->header_position) * 8.0
+			*  si->sample_freq / si->samples;
 
     return MPC_STATUS_OK;
@@ -138,5 +142,4 @@
 {
 	mpc_uint32_t CRC;
-	mpc_uint64_t sampleCount = 0;
 	mpc_bits_reader r = *r_in;
 
@@ -144,8 +147,6 @@
 	CRC = mpc_bits_read(&r, 32);
 	si->stream_version = mpc_bits_read(&r, 8);
-	mpc_bits_get_size(&r, &sampleCount);
-	si->frames = (sampleCount + MPC_FRAME_LENGTH - 1) / MPC_FRAME_LENGTH;
+	mpc_bits_get_size(&r, &si->samples);
 	si->is_true_gapless = 1;
-	si->last_frame_samples = sampleCount - (si->frames - 1) * MPC_FRAME_LENGTH;
 	si->sample_freq = samplefreqs[mpc_bits_read(&r, 4)];
 	si->channels = mpc_bits_read(&r, 4) + 1;
@@ -156,9 +157,6 @@
 	si->bitrate = 0;
 
-	si->pcm_samples     = sampleCount;
-	si->average_bitrate = 0;
-	if (si->pcm_samples > 0)
-		si->average_bitrate = (si->tag_offset - si->header_position) * 8.0
-				*  si->sample_freq / si->pcm_samples;
+	si->average_bitrate = (si->tag_offset - si->header_position) * 8.0
+			*  si->sample_freq / si->samples;
 
 	return MPC_STATUS_OK;
@@ -198,15 +196,9 @@
 mpc_streaminfo_get_length(mpc_streaminfo * si)
 {
-    return (double) mpc_streaminfo_get_length_samples(si) / si->sample_freq;
-}
-
-mpc_int64_t
-mpc_streaminfo_get_length_samples(mpc_streaminfo * si)
-{
-    mpc_int64_t samples = (mpc_int64_t) si->frames * MPC_FRAME_LENGTH;
-    if (si->is_true_gapless)
-        samples -= (MPC_FRAME_LENGTH - si->last_frame_samples);
-    else
-        samples -= MPC_DECODER_SYNTH_DELAY;
-    return samples;
-}
+    return (double) si->samples / si->sample_freq;
+}
+
+mpc_int64_t mpc_streaminfo_get_length_samples(mpc_streaminfo *si)
+{
+	return si->samples;
+}
