Index: /libmpcdec/branches/zorg/include/mpcdec/mpcdec.h
===================================================================
--- /libmpcdec/branches/zorg/include/mpcdec/mpcdec.h	(revision 106)
+++ /libmpcdec/branches/zorg/include/mpcdec/mpcdec.h	(revision 107)
@@ -58,6 +58,4 @@
 typedef struct mpc_frame_info_t {
 	mpc_uint32_t samples;	// number of samples in the frame
-	mpc_uint32_t sample_freq;	// frame sample frequency
-	mpc_uint8_t channels;	// number of channels
 	MPC_SAMPLE_FORMAT * buffer;	// frame samples buffer (size = samples * channels * sizeof(MPC_SAMPLE_FORMAT)
 } mpc_frame_info;
Index: /libmpcdec/branches/zorg/src/decoder.h
===================================================================
--- /libmpcdec/branches/zorg/src/decoder.h	(revision 106)
+++ /libmpcdec/branches/zorg/src/decoder.h	(revision 107)
@@ -64,14 +64,14 @@
     /// @name internal state variables
     //@{
-    mpc_uint32_t  SampleRate;                 // Sample frequency
-    mpc_uint32_t  StreamVersion;              // version of bitstream
-    mpc_uint32_t  Max_Band;
-    mpc_uint32_t  MS_used;                    // MS-coding used ?
-	mpc_uint32_t  TrueGaplessPresent;
-	mpc_uint32_t  OverallFrames;              // number of frames in the stream, 0 = unknow
-	mpc_uint32_t  LastFrameSamples;           // number of samples in the last frame
+	mpc_uint32_t  stream_version; ///< Streamversion of stream
+	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_uint32_t  samples_to_skip;
-	mpc_uint32_t  DecodedFrames;
+	mpc_uint32_t  decoded_frames;
 
     // randomizer state variables
Index: /libmpcdec/branches/zorg/src/mpc_decoder.c
===================================================================
--- /libmpcdec/branches/zorg/src/mpc_decoder.c	(revision 106)
+++ /libmpcdec/branches/zorg/src/mpc_decoder.c	(revision 107)
@@ -89,10 +89,11 @@
 void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si)
 {
-	d->StreamVersion      = si->stream_version;
-	d->MS_used            = si->ms;
-	d->Max_Band           = si->max_band;
-	d->OverallFrames      = si->frames;
-	d->TrueGaplessPresent = si->is_true_gapless;
-	d->SampleRate         = si->sample_freq;
+	d->stream_version     = si->stream_version;
+	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;
 }
 
@@ -118,52 +119,28 @@
 							  mpc_frame_info * i)
 {
-	// FIXME : sauter dÃ©codage si d->samples_to_skip > MPC_FRAME_LENGTH pour sv7
-	switch (d->StreamVersion) {
-		case 0x07:
-		case 0x17:
-		case 0x08:
-			i->channels = 2;
-			i->sample_freq = d->SampleRate;
-			i->samples = MPC_FRAME_LENGTH;
-			mpc_decoder_read_bitstream_sv7(d, r);
-			break;
+	d->decoded_frames++;
+
+	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);
 	}
-
-	// synthesize signal
-	mpc_decoder_requantisierung(d);
 	mpc_decoder_synthese_filter_float(d, i->buffer);
 
-	d->DecodedFrames++;
-
-//     // cut off first MPC_DECODER_SYNTH_DELAY zero-samples
-// 	if (d->DecodedFrames == d->OverallFrames  && d->StreamVersion >= 6) {
-//         // reconstruct exact filelength
-// 		mpc_int32_t  mod_block   = mpc_bits_read(r,  11);
-// 		mpc_int32_t  FilterDecay;
-//
-// 		if (mod_block == 0) {
-//             // Encoder bugfix
-// 			mod_block = 1152;
-// 		}
-// 		FilterDecay = (mod_block + MPC_DECODER_SYNTH_DELAY) % MPC_FRAME_LENGTH;
-//
-//         // 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_bits_read(r, 20);
-// 				mpc_decoder_read_bitstream_sv7(d, FALSE);
-// 				mpc_decoder_requantisierung(d, d->Max_Band);
-// 			}
-//
-// 			mpc_decoder_synthese_filter_float(d, buffer + 2304);
-//
-// 			i->samples = MPC_FRAME_LENGTH + FilterDecay;
-// 		}
-// 		else {                              // there are only FilterDecay samples needed for this frame
-// 			i->samples = FilterDecay;
-// 		}
-// 	}
+    // cut off first MPC_DECODER_SYNTH_DELAY zero-samples
+    // reconstruct exact filelength
+	if (d->decoded_frames == d->frames && (d->stream_version & 15) == 7) {
+		d->last_frame_samples = mpc_bits_read(r, 11);
+		if (d->last_frame_samples == 0) {
+            // Encoder bugfix
+			d->last_frame_samples = MPC_FRAME_LENGTH;
+		}
+	}
+
+	mpc_int32_t samples_left = d->last_frame_samples + MPC_DECODER_SYNTH_DELAY
+			+ (d->frames - d->decoded_frames) * MPC_FRAME_LENGTH;
+
+	i->samples = samples_left > MPC_FRAME_LENGTH ? MPC_FRAME_LENGTH : samples_left < 0 ? 0 : samples_left;
 
 	if (d->samples_to_skip) {
@@ -173,6 +150,6 @@
 		} else {
 			i->samples -= d->samples_to_skip;
-			memmove(i->buffer, i->buffer + d->samples_to_skip * i->channels,
-					i->samples * i->channels * sizeof (MPC_SAMPLE_FORMAT));
+			memmove(i->buffer, i->buffer + d->samples_to_skip * d->channels,
+					i->samples * d->channels * sizeof (MPC_SAMPLE_FORMAT));
 			d->samples_to_skip = 0;
 		}
@@ -193,5 +170,5 @@
     mpc_int32_t*    L;
     mpc_int32_t*    R;
-	const mpc_int32_t Last_Band = d->Max_Band;
+	const mpc_int32_t Last_Band = d->max_band;
 
 #ifdef MPC_FIXED_POINT
@@ -363,5 +340,5 @@
     *ResL = mpc_bits_read(r, 4);
     *ResR = mpc_bits_read(r, 4);
-    if (d->MS_used && !(*ResL==0 && *ResR==0)) {
+	if (d->ms && !(*ResL==0 && *ResR==0)) {
         d->MS_Flag[0] = mpc_bits_read(r, 1);
     }
@@ -369,5 +346,5 @@
     // consecutive subbands
     ++ResL; ++ResR; // increase pointers
-    for (n=1; n <= d->Max_Band; ++n, ++ResL, ++ResR)
+	for (n=1; n <= d->max_band; ++n, ++ResL, ++ResR)
     {
 		idx   = mpc_bits_huff_dec(r, mpc_table_HuffHdr);
@@ -377,5 +354,5 @@
         *ResR = (idx!=4) ? *(ResR-1) + idx : (int) mpc_bits_read(r, 4);
 
-        if (d->MS_used && !(*ResL==0 && *ResR==0)) {
+		if (d->ms && !(*ResL==0 && *ResR==0)) {
             d->MS_Flag[n] = mpc_bits_read(r, 1);
         }
Index: /libmpcdec/branches/zorg/src/mpc_demux.c
===================================================================
--- /libmpcdec/branches/zorg/src/mpc_demux.c	(revision 106)
+++ /libmpcdec/branches/zorg/src/mpc_demux.c	(revision 107)
@@ -172,10 +172,7 @@
 void mpc_demux_decode(mpc_demux * d, mpc_frame_info * i)
 {
-	i->samples = 0;
-	if (d->d->OverallFrames != 0 && d->d->DecodedFrames == d->d->OverallFrames)
-		return;
 	if (d->si.stream_version == 8) {
 		mpc_bits_reader r;
-		if (d->block_bits < 8){
+		if (d->block_bits < 8 && (d->d->decoded_frames < d->d->frames || d->d->frames == 0)){
 			mpc_block b;
 			d->bits_reader.count &= -8;
@@ -195,14 +192,9 @@
 		d->block_bits -= (d->bits_reader.buff - r.buff) * 8 + r.count - d->bits_reader.count;
 	} else {
-		int frame_size;
 		mpc_bits_reader r;
 		mpc_demux_fill(d, MAX_FRAME_SIZE, MPC_BUFFER_FULL | MPC_BUFFER_SWAP);
-		frame_size = mpc_bits_read(&d->bits_reader, 20); // read frame size
+		mpc_bits_read(&d->bits_reader, 20); // read frame size
 		r = d->bits_reader;
 		mpc_decoder_decode_frame(d->d, &d->bits_reader, i);
-		if ((d->bits_reader.buff - r.buff) * 8 + r.count - d->bits_reader.count != frame_size){
-			frame_size--;
-			frame_size += 1;
-		}
 	}
 }
@@ -215,13 +207,13 @@
 // 	mpc_uint32_t  FrameBitCnt = 0;
 //
-// 	if (d->DecodedFrames >= d->OverallFrames) {
+// 	if (d->decoded_frames >= d->OverallFrames) {
 // 		return (mpc_uint32_t)(-1);                           // end of file -> abort decoding
 // 	}
 //
 //     // add seeking info
-// 	if (d->seeking_table_frames < d->DecodedFrames &&
-// 		   (d->DecodedFrames & ((1 << d->seeking_pwr) - 1)) == 0) {
-// 		d->seeking_table[d->DecodedFrames >> d->seeking_pwr] = mpc_decoder_bits_read(d);
-// 		d->seeking_table_frames = d->DecodedFrames;
+// 	if (d->seeking_table_frames < d->decoded_frames &&
+// 		   (d->decoded_frames & ((1 << d->seeking_pwr) - 1)) == 0) {
+// 		d->seeking_table[d->decoded_frames >> d->seeking_pwr] = mpc_decoder_bits_read(d);
+// 		d->seeking_table_frames = d->decoded_frames;
 // 		   }
 //
