--- sox.20050917-inst6/src/wav.c.orig	2007-01-03 07:13:00.000000000 +0100
+++ sox.20050917-inst6/src/wav.c	2007-03-01 16:32:26.134431000 +0100
@@ -1750,9 +1750,11 @@
 #ifdef ENABLE_GSM
         case WAVE_FORMAT_GSM610:
 	    {	st_size_t	gsmoff;
-		/* rounding bytes to blockAlign */
-		gsmoff = offset * wav->blockAlign / wav->samplesPerBlock + wav->blockAlign * ft->info.channels / 2;
-		gsmoff -= gsmoff % (wav->blockAlign * ft->info.channels);
+		/* rounding bytes down to blockAlign */
+		gsmoff = offset / wav->samplesPerBlock * wav->blockAlign;
+		/* is the fraction bigger than half of the block? */
+		if ( (offset % wav->samplesPerBlock) * wav->blockAlign / wav->samplesPerBlock >
+			 wav->blockAlign * ft->info.channels / 2 ) gsmoff += wav->blockAlign * ft->info.channels;
 		ft->st_errno = st_seek(ft, gsmoff + wav->dataStart, SEEK_SET);
 		if( ft->st_errno == ST_SUCCESS )
 		    new_offset = offset;
