           }
           if (bT > oSound.lastValues.bytes) {
             oSound.lastValues.bytes = bT;
+            hasNew = true;
+          }
+          if (bufferLength != oSound.lastValues.bufferLength) {
+            oSound.lastValues.bufferLength = bufferLength;
             hasNew = true;
           }
           if (oSound.loaded != true && nD > 0 && bL == bT) {

      var bT: int = 0;
      var nD: int = 0;
      var nP: int = 0;
      var lP:Number = 0;
      var rP:Number = 0;
      var isBuffering:Object = null;

        // We can detect the end of the stream when Play.Stop is called followed by Buffer.Empty.
        // However, if you pause and let the whole song buffer, Buffer.Flush is called followed by
        // Buffer.Empty, so handle that case too.
        //
        // Ignore this event if we are more than 5 seconds from the end of the song.
        if (e.info.code == "NetStream.Buffer.Empty" && (oSound.lastNetStatus == 'NetStream.Play.Stop' || oSound.lastNetStatus == 'NetStream.Buffer.Flush')) {
          if (oSound.duration && (oSound.ns.time * 1000) < (oSound.duration - 5000)) {
            writeDebug('Ignoring Buffer.Empty because this is too early to be the end of the stream! (time: '+(oSound.ns.time*1000)+', duration: '+oSound.duration+')');
          } else {
            oSound.didJustBeforeFinish = false; // reset
            oSound.finished = true;
            writeDebug('calling onfinish for sound '+oSound.sID);
            checkProgress();
            ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onfinish");
          }

        } else if (e.info.code == "NetStream.Buffer.Empty") {

