From 910b695822c1ee578ccc5fb296cca971d5397b92 Mon Sep 17 00:00:00 2001 From: Francois Gouget Date: Fri, 16 Jul 2004 23:42:32 +0000 Subject: [PATCH] Keep track of how much has been played and get rid of last_pos. This fixes a bug where buffer_service() would not detect that everything had been played. Check that the actual sound duration was within 10% of the expected value. Make BUFFER_LEN and TIME_SLICE independent, make sure TIME_SLICE does not divide BUFFER_LEN to spice things up a bit. --- dlls/dsound/tests/ds3d.c | 67 +++++++++++++++++++++++------------------ dlls/dsound/tests/dsound_test.h | 4 +-- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/dlls/dsound/tests/ds3d.c b/dlls/dsound/tests/ds3d.c index 88e35cbc503..61b1bb4bde0 100644 --- a/dlls/dsound/tests/ds3d.c +++ b/dlls/dsound/tests/ds3d.c @@ -104,9 +104,8 @@ typedef struct { LPWAVEFORMATEX wfx; DWORD buffer_size; DWORD written; + DWORD played; DWORD offset; - - DWORD last_pos; } play_state_t; static int buffer_refill(play_state_t* state, DWORD size) @@ -166,48 +165,53 @@ static int buffer_silence(play_state_t* state, DWORD size) static int buffer_service(play_state_t* state) { - DWORD play_pos,write_pos,buf_free; + DWORD last_play_pos,play_pos,buf_free; HRESULT rc; - rc=IDirectSoundBuffer_GetCurrentPosition(state->dsbo,&play_pos,&write_pos); + rc=IDirectSoundBuffer_GetCurrentPosition(state->dsbo,&play_pos,NULL); ok(rc==DS_OK,"GetCurrentPosition: %lx\n",rc); if (rc!=DS_OK) { goto STOP; } + /* Update the amount played */ + last_play_pos=state->played % state->buffer_size; + if (play_posplayed+=state->buffer_size-last_play_pos+play_pos; + else + state->played+=play_pos-last_play_pos; + + if (winetest_debug > 1) + trace("buf size=%ld last_play_pos=%ld play_pos=%ld played=%ld / %ld\n", + state->buffer_size,last_play_pos,play_pos,state->played,state->wave_len); + + if (state->played>state->wave_len) + { + /* Everything has been played */ + goto STOP; + } + /* Refill the buffer */ - if (state->offset<=play_pos) { + if (state->offset<=play_pos) buf_free=play_pos-state->offset; - } else { + else buf_free=state->buffer_size-state->offset+play_pos; - } + if (winetest_debug > 1) - trace("buf pos=%ld free=%ld written=%ld / %ld\n", - play_pos,buf_free,state->written,state->wave_len); + trace("offset=%ld free=%ld written=%ld / %ld\n", + state->offset,buf_free,state->written,state->wave_len); if (buf_free==0) return 1; - if (state->writtenwave_len) { + if (state->writtenwave_len) + { int w=buffer_refill(state,buf_free); if (w==-1) goto STOP; buf_free-=w; - if (state->written==state->wave_len) { - state->last_pos=(state->offset 1) - trace("last sound byte at %ld\n", - (state->written % state->buffer_size)); - } - } else { - if (state->last_pos!=0 && play_poslast_pos) { - /* We wrapped around the end of the buffer */ - state->last_pos=0; - } - if (state->last_pos==0 && - play_pos>(state->written % state->buffer_size)) { - /* Now everything has been played */ - goto STOP; - } + if (state->written==state->wave_len && winetest_debug > 1) + trace("last sound byte at %ld\n", + (state->written % state->buffer_size)); } if (buf_free>0) { @@ -341,6 +345,7 @@ void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER dsbo, DS3DLISTENER listener_param; LPDIRECTSOUND3DBUFFER buffer=NULL; DS3DBUFFER buffer_param; + DWORD start_time,now; trace(" Playing %g second 440Hz tone at %ldx%dx%d\n", duration, wfx.nSamplesPerSec, wfx.wBitsPerSample,wfx.nChannels); @@ -397,7 +402,7 @@ void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER dsbo, buffer_param.dwSize=sizeof(buffer_param); rc=IDirectSound3DBuffer_GetAllParameters(buffer,&buffer_param); ok(rc==DS_OK,"IDirectSound3DBuffer_GetAllParameters failed: 0x%lx\n",rc); -} + } if (set_volume) { if (dsbcaps.dwFlags & DSBCAPS_CTRLVOLUME) { LONG val; @@ -433,7 +438,7 @@ void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER dsbo, state.dsbo=dsbo; state.wfx=&wfx; state.buffer_size=dsbcaps.dwBufferBytes; - state.written=state.offset=0; + state.played=state.written=state.offset=0; buffer_refill(&state,state.buffer_size); rc=IDirectSoundBuffer_Play(dsbo,0,0,DSBPLAY_LOOPING); @@ -469,8 +474,9 @@ void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER dsbo, ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition failed 0x%lx\n",rc); } + start_time=GetTickCount(); while (buffer_service(&state)) { - WaitForSingleObject(GetCurrentProcess(),TIME_SLICE/2); + WaitForSingleObject(GetCurrentProcess(),TIME_SLICE); if (listener && move_listener) { listener_param.vPosition.x += 0.5; rc=IDirectSound3DListener_SetPosition(listener,listener_param.vPosition.x,listener_param.vPosition.y,listener_param.vPosition.z,DS3D_IMMEDIATE); @@ -482,6 +488,9 @@ void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER dsbo, ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition failed 0x%lx\n",rc); } } + /* Check the sound duration was within 10% of the expected value */ + now=GetTickCount(); + ok(fabs(1000*duration-now+start_time)<=100*duration,"The sound played for %ld ms instead of %g ms\n",now-start_time,1000*duration); free(state.wave); if (is_primary) { diff --git a/dlls/dsound/tests/dsound_test.h b/dlls/dsound/tests/dsound_test.h index 40cac9edae9..2c45342d023 100644 --- a/dlls/dsound/tests/dsound_test.h +++ b/dlls/dsound/tests/dsound_test.h @@ -47,8 +47,8 @@ static const unsigned int formats[][3]={ #define NB_FORMATS (sizeof(formats)/sizeof(*formats)) /* The time slice determines how often we will service the buffer */ -#define TIME_SLICE 100 -#define BUFFER_LEN (4*TIME_SLICE) +#define TIME_SLICE 31 +#define BUFFER_LEN 400 extern char* wave_generate_la(WAVEFORMATEX*,double,DWORD*); -- 2.11.4.GIT