changeset 14555:6fb9eca97d41

support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
author faust3
date Fri, 21 Jan 2005 13:22:59 +0000
parents d1023c2b0414
children 31cb219364a4
files libao2/ao_dsound.c
diffstat 1 files changed, 10 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/libao2/ao_dsound.c	Fri Jan 21 12:14:48 2005 +0000
+++ b/libao2/ao_dsound.c	Fri Jan 21 13:22:59 2005 +0000
@@ -114,7 +114,7 @@
 static LPDIRECTSOUNDBUFFER hdsbuf = NULL; ///secondary direct sound buffer (stream buffer)
 static int buffer_size = 0;               ///size in bytes of the direct sound buffer   
 static int write_offset = 0;              ///offset of the write cursor in the direct sound buffer
-static int min_free_space = 4096;         ///if the free space is below this value get_space() will return 0
+static int min_free_space = 0;            ///if the free space is below this value get_space() will return 0
 static int device_num = 0;                ///wanted device number
 static GUID device;                       ///guid of the device 
 
@@ -481,6 +481,7 @@
 	dsbdesc.dwBufferBytes = ao_data.buffersize;
 	dsbdesc.lpwfxFormat = (WAVEFORMATEX *)&wformat;
 	buffer_size = dsbdesc.dwBufferBytes;
+	write_offset = 0;
 	ao_data.outburst = wformat.Format.nBlockAlign * 512;
 
 	// create primary buffer and set its format
@@ -546,11 +547,17 @@
 
 /** 
 \brief close audio device
-\param immed stop playback immediately, currently not supported
+\param immed stop playback immediately
 */
 static void uninit(int immed)
 {
-	reset();
+	if(immed)reset();
+	else{
+		DWORD status;
+		IDirectSoundBuffer_Play(hdsbuf, 0, 0, 0);
+		while(!IDirectSoundBuffer_GetStatus(hdsbuf,&status) && (status&DSBSTATUS_PLAYING))
+			usec_sleep(20000);
+	}
 	DestroyBuffer();
 	UninitDirectSound();
 }