diff --git a/linphone/mediastreamer2/src/winsndds.cpp b/linphone/mediastreamer2/src/winsndds.cpp
index 69722879791576950eddc397e1fe7e77de3cb19e..4e2cf7a3fbe193c8adda3bb9132e66ba449b2cb5 100644
--- a/linphone/mediastreamer2/src/winsndds.cpp
+++ b/linphone/mediastreamer2/src/winsndds.cpp
@@ -31,8 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include <dsound.h>
 
-#define WINSNDDS_NBUFS 10
-#define WINSNDDS_NSAMPLES 160
 #define WINSNDDS_MINIMUMBUFFER 5
 
 static MSFilter *ms_winsndds_read_new(MSSndCard *card);
@@ -313,13 +311,12 @@ typedef struct WinSndDs{
 	MSBufferizer output_buff;
 	LPDIRECTSOUND lpDirectSound;
     LPDIRECTSOUNDBUFFER  lpDirectSoundOutputBuffer;
-    DWORD                outputBufferWriteOffsetBytes;     /* last write position */
     double               dsw_framesWritten;
+    UINT                 writeOffset;      /* last read position */
 
 	LPDIRECTSOUNDCAPTURE lpDirectSoundCapture;
     LPDIRECTSOUNDCAPTUREBUFFER  lpDirectSoundInputBuffer;
     UINT                 readOffset;      /* last read position */
-    UINT                 inputSize;
 
 	int              framesPerDSBuffer;
 
@@ -333,7 +330,6 @@ typedef struct WinSndDs{
 	int32_t stat_output;
 	int32_t stat_notplayed;
 
-	int32_t stat_minimumbuffer;
 }WinSndDs;
 
 void *  
@@ -365,11 +361,9 @@ winsndds_read_thread(void *arg)
 		}
 
 		filled = readPos - d->readOffset;
-		if( filled < 0 ) filled += d->inputSize; // unwrap offset
+		if( filled < 0 ) filled += d->framesPerDSBuffer;
 		bytesFilled = filled;
 
-		//bytesFilled = 480 * d->wfx.nSamplesPerSec/8000;
-
 		hr = IDirectSoundCaptureBuffer_Lock ( d->lpDirectSoundInputBuffer,
 			d->readOffset, bytesFilled,
 			(void **) &lpInBuf1, &dwInSize1,
@@ -393,7 +387,7 @@ winsndds_read_thread(void *arg)
 			putq(&d->rq,m);
 			ms_mutex_unlock(&d->mutex);
 			d->bytes_read+=bytesFilled;
-			//ms_message("bytesFilled=%i\n",bytesFilled);
+			/* ms_message("bytesFilled=%i\n",bytesFilled); */
 		}
 		else
 		{
@@ -405,10 +399,10 @@ winsndds_read_thread(void *arg)
 			putq(&d->rq,m);
 			ms_mutex_unlock(&d->mutex);
 			d->bytes_read+=bytesFilled;
-			//ms_message("bytesFilled=%i\n",bytesFilled);
+			/* ms_message("bytesFilled=%i\n",bytesFilled); */
 		}
 
-		d->readOffset = (d->readOffset + bytesFilled) % d->inputSize;
+		d->readOffset = (d->readOffset + bytesFilled) % d->framesPerDSBuffer;
 
 		IDirectSoundCaptureBuffer_Unlock( d->lpDirectSoundInputBuffer,
 			lpInBuf1, dwInSize1, lpInBuf2, dwInSize2);
@@ -449,7 +443,6 @@ static void winsndds_init(MSFilter *f){
 	d->stat_input=0;
 	d->stat_output=0;
 	d->stat_notplayed=0;
-	d->stat_minimumbuffer=WINSNDDS_MINIMUMBUFFER;
 
 	d->framesPerDSBuffer = 320 * (8000 / 1000);
 
@@ -483,25 +476,23 @@ static void winsndds_read_preprocess(MSFilter *f){
 	d->stat_input=0;
 	d->stat_output=0;
 	d->stat_notplayed=0;
-	d->stat_minimumbuffer=WINSNDDS_MINIMUMBUFFER;
 
+	d->framesPerDSBuffer = 320 * (d->wfx.nSamplesPerSec / 1000) /2;
 	winsndds_apply_settings(d);
 	ms_DirectSoundCaptureCreate( &d->in_guid, &d->lpDirectSoundCapture, NULL );
 
-	d->inputSize = d->framesPerDSBuffer;
-
 	ZeroMemory(&captureDesc, sizeof(DSCBUFFERDESC));
     captureDesc.dwSize = sizeof(DSCBUFFERDESC);
     captureDesc.dwFlags =  0;
-    captureDesc.dwBufferBytes = d->framesPerDSBuffer; //bytesPerBuffer;
+    captureDesc.dwBufferBytes = d->framesPerDSBuffer;
 	captureDesc.lpwfxFormat = &d->wfx;
-    // Create the capture buffer
+
 	if ((hr = IDirectSoundCapture_CreateCaptureBuffer( d->lpDirectSoundCapture,
 		&captureDesc, &d->lpDirectSoundInputBuffer, NULL)) != DS_OK)
 	{
-		return; /* hr; */
+		return;
 	}
-    d->readOffset = 0;  // reset last read position to start of buffer
+    d->readOffset = 0;
 
     hr = IDirectSoundCaptureBuffer_Start( d->lpDirectSoundInputBuffer, DSCBSTART_LOOPING );
 	
@@ -513,7 +504,7 @@ static void winsndds_read_preprocess(MSFilter *f){
 	ms_cond_wait(&d->thread_cond,&d->thread_lock);
 	ms_mutex_unlock(&d->thread_lock);
 
-	return; /* DS_OK; */
+	return;
 }
 
 static void winsndds_read_postprocess(MSFilter *f){
@@ -566,13 +557,14 @@ static void winsndds_write_preprocess(MSFilter *f){
     DSBUFFERDESC   primaryDesc;
     DSBUFFERDESC   secondaryDesc;
     unsigned char* pDSBuffData;
+    DWORD outputBufferWriteOffsetBytes;
 
 
 	d->stat_input=0;
 	d->stat_output=0;
 	d->stat_notplayed=0;
-	d->stat_minimumbuffer=WINSNDDS_MINIMUMBUFFER;
 
+	d->framesPerDSBuffer = 320 * (d->wfx.nSamplesPerSec / 1000);
 	winsndds_apply_settings(d);
 
 
@@ -588,75 +580,67 @@ static void winsndds_write_preprocess(MSFilter *f){
 
     ZeroMemory(&primaryDesc, sizeof(DSBUFFERDESC));
     primaryDesc.dwSize        = sizeof(DSBUFFERDESC);
-    primaryDesc.dwFlags       = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_PRIMARYBUFFER; // all panning, mixing, etc done by synth
+    primaryDesc.dwFlags       = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_PRIMARYBUFFER;
     primaryDesc.dwBufferBytes = 0;
     primaryDesc.lpwfxFormat   = NULL;
-    // Create the buffer
     if ((hr = IDirectSound_CreateSoundBuffer( d->lpDirectSound,
                   &primaryDesc, &pPrimaryBuffer, NULL)) != DS_OK)
 	{
-		return ;//hr;
+		return ;
 	}
 
 	if ((hr = IDirectSoundBuffer_SetFormat( pPrimaryBuffer, &d->wfx)) != DS_OK)
 	{
-		return ;//hr;
+		return ;
 	}
 	IDirectSoundBuffer_Release(pPrimaryBuffer);
 
-    // Setup the secondary buffer description
     ZeroMemory(&secondaryDesc, sizeof(DSBUFFERDESC));
     secondaryDesc.dwSize = sizeof(DSBUFFERDESC);
     secondaryDesc.dwFlags =  DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2;
-    secondaryDesc.dwBufferBytes = d->framesPerDSBuffer; //bytesPerBuffer;
+    secondaryDesc.dwBufferBytes = d->framesPerDSBuffer;
 	secondaryDesc.lpwfxFormat = &d->wfx;
-    // Create the secondary buffer
     if ((hr = IDirectSound_CreateSoundBuffer( d->lpDirectSound,
                   &secondaryDesc, &d->lpDirectSoundOutputBuffer, NULL)) != DS_OK)
 	{
-		return ;//hr;
+		return ;
 	}
 
-    // Lock the DS buffer
 	if ((hr = IDirectSoundBuffer_Lock( d->lpDirectSoundOutputBuffer, 0,
 		d->framesPerDSBuffer,
 		(LPVOID*)&pDSBuffData,
 		&dwDataLen, NULL, 0, 0)) != DS_OK)
 	{
-		return ;//hr;
+		return ;
 	}
 
-    // Zero the DS buffer
-    ZeroMemory(pDSBuffData, dwDataLen);
-    // Unlock the DS buffer
+	ZeroMemory(pDSBuffData, dwDataLen);
 	if ((hr = IDirectSoundBuffer_Unlock( d->lpDirectSoundOutputBuffer,
 		pDSBuffData, dwDataLen, NULL, 0)) != DS_OK)
 	{
-		return ;//hr;
+		return ;
 	}
 
-	// Let DSound set the starting write position because if we set it to zero, it looks like the
-    // buffer is full to begin with. This causes a long pause before sound starts when using large buffers.
 	hr = IDirectSoundBuffer_GetCurrentPosition( d->lpDirectSoundOutputBuffer,
-            &playCursor, &d->outputBufferWriteOffsetBytes );
+            &playCursor, &outputBufferWriteOffsetBytes );
     if( hr != DS_OK )
     {
-        return ;//hr;
+        return ;
     }
 	
     hr = IDirectSoundBuffer_SetCurrentPosition( d->lpDirectSoundOutputBuffer, 0 );
     if( hr != DS_OK )
     {
-        return ;//hr;
+        return ;
     }
     hr = IDirectSoundBuffer_Play( d->lpDirectSoundOutputBuffer, 0, 0, DSBPLAY_LOOPING);
     if( hr != DS_OK )
     {
-        return ;//hr;
+        return ;
     }
-	d->readOffset=-1;
+	d->writeOffset=-1;
 	
-	return ;//hr;
+	return ;
 }
 
 static void winsndds_write_postprocess(MSFilter *f){
@@ -676,7 +660,7 @@ static void winsndds_write_postprocess(MSFilter *f){
     }
 
 	ms_message("Shutting down sound device (playing: %i) (input-output: %i) (notplayed: %i)", d->nbufs_playing, d->stat_input - d->stat_output, d->stat_notplayed);
-	d->readOffset=-1;
+	d->writeOffset=-1;
 }
 
 static void winsndds_write_process(MSFilter *f){
@@ -690,15 +674,15 @@ static void winsndds_write_process(MSFilter *f){
 
 	ms_bufferizer_put_from_queue(&d->output_buff,f->inputs[0]);
 
-	if (d->readOffset==-1)
+	if (d->writeOffset==-1)
 	{
-		if (ms_bufferizer_get_avail(&d->output_buff)>=4096*3)
+		if (ms_bufferizer_get_avail(&d->output_buff)>=d->framesPerDSBuffer/2)
 		{
 		    DWORD playCursor;
-
+			DWORD outputBufferWriteOffsetBytes;
 			IDirectSoundBuffer_GetCurrentPosition( d->lpDirectSoundOutputBuffer,
-					&playCursor, &d->outputBufferWriteOffsetBytes );
-			d->readOffset = d->outputBufferWriteOffsetBytes;
+					&playCursor, &outputBufferWriteOffsetBytes );
+			d->writeOffset = outputBufferWriteOffsetBytes;
 		}
 		else
 			return;
@@ -715,9 +699,9 @@ static void winsndds_write_process(MSFilter *f){
 		char input[15360];
 
 		hr = IDirectSoundBuffer_Lock ( d->lpDirectSoundOutputBuffer,
-			d->readOffset, msize,
+			d->writeOffset, msize,
 			(void **) &lpOutBuf1, &dwOutSize1,
-			(void **) &lpOutBuf2, &dwOutSize2, 0); //DSBLOCK_FROMWRITECURSOR);
+			(void **) &lpOutBuf2, &dwOutSize2, 0); /* DSBLOCK_FROMWRITECURSOR); */
 		if (hr != DS_OK)
 		{
 			ms_error("DirectSound IDirectSoundBuffer_Lock failed, hresult = 0x%x\n", hr);
@@ -746,7 +730,7 @@ static void winsndds_write_process(MSFilter *f){
 			memcpy(lpOutBuf2, input+dwOutSize1, dwOutSize2);
 		}
 
-		d->readOffset=(d->readOffset+dwOutSize1+dwOutSize2) % d->framesPerDSBuffer;
+		d->writeOffset=(d->writeOffset+dwOutSize1+dwOutSize2) % d->framesPerDSBuffer;
         IDirectSoundBuffer_Unlock( d->lpDirectSoundOutputBuffer,
 			lpOutBuf1, dwOutSize1, lpOutBuf2, dwOutSize2);
 		if (dwOutSize1==0)
@@ -768,7 +752,6 @@ static int get_rate(MSFilter *f, void *arg){
 static int set_rate(MSFilter *f, void *arg){
 	WinSndDs *d=(WinSndDs*)f->data;
 	d->wfx.nSamplesPerSec=*((int*)arg);
-	d->framesPerDSBuffer = 320 * (d->wfx.nSamplesPerSec / 1000);
 	return 0;
 }