Index: MpJitterBuffer.cpp
===================================================================
--- MpJitterBuffer.cpp	(revision 7943)
+++ MpJitterBuffer.cpp	(working copy)
@@ -48,7 +48,7 @@
 
 int MpJitterBuffer::pushPacket(MpRtpBufPtr &rtpPacket)
 {
-   unsigned decodedSamples; // number of samples, returned from decoder
+   int decodedSamples; // number of samples, returned from decoder
    UCHAR payloadType;       // RTP packet payload type
    MpDecoderBase* decoder;  // decoder for the packet
 
@@ -64,14 +64,26 @@
       return 0; // If we can't decode it, we must ignore it?
 
    // Decode packet
-   decodedSamples = decoder->decode(rtpPacket, JbQueueSize-JbQCount, JbQ+JbQIn);
+   decodedSamples = decoder->decode(rtpPacket, JbTempBufferSize, JbTempBuffer);
+   assert(decodedSamples >= 0);
+   assert(decodedSamples <= JbTempBufferSize);
 
+   int left = decodedSamples;
+   int offset = 0;
+   while (0 != left)
+   {
+	  int chunk = min(JbQueueSize - JbQIn, left);
+	  memmove(JbQ + JbQIn, JbTempBuffer + offset, chunk * sizeof(MpAudioSample));
+	  left -= chunk;
+	  offset += chunk;
+	  JbQIn += chunk;
+	  JbQIn %= JbQueueSize;
+   }
+
    // Update buffer state
    JbQCount += decodedSamples;
-   JbQIn += decodedSamples;
-   // Reset write pointer if we reach end of buffer
-   if (JbQIn >= JbQueueSize)
-      JbQIn = 0;
+   if (JbQCount >= JbQueueSize)
+	   OutputDebugString("MpJitterBuffer::pushPacket(): buffer overrun, expect glitches\n");
 
    return 0;
 }
@@ -79,19 +91,35 @@
 int MpJitterBuffer::getSamples(MpAudioSample *samplesBuffer, JB_size samplesNumber)
 {
    // Check does we have available decoded data
-   if (JbQCount != 0) {
-      // We could not return more then we have
-      samplesNumber = min(samplesNumber,JbQCount);
+   if (JbQCount == 0)
+   {
+//	   OutputDebugString("MpJitterBuffer::getSamples(): buffer underrun, inserting low-power noise\n");
+//	   for (int i = 0; i < samplesNumber; ++i)
+//	   {
+//		   float normalized = 2 * rand()/float(RAND_MAX) - 1.f;
+//		   MpAudioSample sample = MpAudioSample(normalized * 0.01f * 32767 + 0.5f);
+//		   samplesBuffer[i] = sample;
+//	   }
+	   return samplesNumber;
+   }
 
-      memcpy(samplesBuffer, JbQ+JbQOut, samplesNumber * sizeof(MpAudioSample));
-
-      JbQCount -= samplesNumber;
-      JbQOut += samplesNumber;
-      if (JbQOut >= JbQueueSize)
-         JbQOut -= JbQueueSize;
+   assert(samplesNumber <= JbQCount);
+  // We could not return more then we have
+   samplesNumber = min(samplesNumber, JbQCount);
+   int left = samplesNumber;
+   int offset = 0;
+   while (left != 0)
+   {
+	   int chunk = min(left, JbQueueSize - JbQOut);
+	   memmove(samplesBuffer + offset, JbQ + JbQOut, chunk * sizeof(MpAudioSample));
+	   left -= chunk;
+	   offset += chunk;
+	   JbQOut += chunk;
+	   JbQOut %= JbQueueSize;
    }
 
-   return samplesNumber;
+  JbQCount -= samplesNumber;
+  return samplesNumber;
 }
 
 int MpJitterBuffer::setCodepoint(const JB_char* codec, JB_size sampleRate,
