Added speed support for 1.0 to 2.0, but still has bugs
diff --git a/sonic.c b/sonic.c
index 95f43ff..aa3b033 100644
--- a/sonic.c
+++ b/sonic.c
@@ -16,6 +16,7 @@
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "sonic.h"
@@ -134,11 +135,21 @@
     double speed,
     int period)
 {
-    int newSamples = period/(speed - 1.0); /* Note that speed is >= 2.0 */
-    double scale = 1.0/newSamples;
+    int t, newSamples, extraLength;
+    double scale;
     float *out;
-    int t;
 
+    if(speed >= 2.0) {
+	newSamples = period/(speed - 1.0);
+	extraLength = 0;
+    } else if(speed > 1.0) {
+	newSamples = period;
+	stream->remainingInputToCopy = period*(2.0 - speed)/(speed - 1.0);
+    } else {
+	fprintf(stderr, "Speed currently must be > 1\n");
+	exit(1);
+    }
+    scale = 1.0/newSamples;
     if(!enlargeOutputBufferIfNeeded(stream, newSamples)) {
 	return 0;
     }
@@ -198,6 +209,27 @@
     stream->numInputSamples = remainingSamples;
 }
 
+/* Just copy from the input buffer to the output buffer.  Return 0 if we fail to
+   resize the output buffer.  Otherwise, return numSamples */
+static int copyInputToOutput(
+    sonicStream stream,
+    int position)
+{
+    int numSamples = stream->remainingInputToCopy;
+
+    if(numSamples > stream->maxRequired) {
+	numSamples = stream->maxRequired;
+    }
+    if(!enlargeOutputBufferIfNeeded(stream, numSamples)) {
+	return 0;
+    }
+    memcpy(stream->outputBuffer + stream->numOutputSamples, stream->inputBuffer + position,
+        numSamples*sizeof(float));
+    stream->numOutputSamples += numSamples;
+    stream->remainingInputToCopy -= numSamples;
+    return numSamples;
+}
+
 /* Resample as many pitch periods as we have buffered on the input.  Return 0 if
    we fail to resize an input or output buffer */
 int sonicWriteToStream(
@@ -218,8 +250,13 @@
     samples = stream->inputBuffer;
     numSamples = stream->numInputSamples;
     do {
-	period = findPitchPeriod(stream, samples + position);
-        newSamples = resamplePitchPeriod(stream, samples + position, speed, period);
+	if(stream->remainingInputToCopy > 0) {
+	    period = 0;
+            newSamples = copyInputToOutput(stream, position);
+	} else {
+	    period = findPitchPeriod(stream, samples + position);
+	    newSamples = resamplePitchPeriod(stream, samples + position, speed, period);
+	}
 	if(newSamples == 0) {
 	    return 0; /* Failed to resize output buffer */
 	}