Fixed invalid buffer size by rounding up to next multiple of
authorRobert Reif <reif@earthlink.net>
Wed, 16 Feb 2005 16:09:02 +0000 (16:09 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 16 Feb 2005 16:09:02 +0000 (16:09 +0000)
nBlockAlign.
Added test to verify buffer rounding behavior.

dlls/dsound/buffer.c
dlls/dsound/tests/ds3d.c
dlls/dsound/tests/ds3d8.c
dlls/dsound/tests/dsound.c
dlls/dsound/tests/dsound8.c
dlls/dsound/tests/dsound_test.h

index 3a695ca8e7245208e19f56ace6bad06d4d595a77..2856ea94dc7c4aea6b09282f884633ab19610114 100644 (file)
@@ -1060,9 +1060,14 @@ HRESULT WINAPI IDirectSoundBufferImpl_Create(
 
        CopyMemory(dsb->pwfx, wfex, cp_size);
 
-       dsb->buflen = dsbd->dwBufferBytes;
-       dsb->freq = dsbd->lpwfxFormat->nSamplesPerSec;
+       if (dsbd->dwBufferBytes % dsbd->lpwfxFormat->nBlockAlign)
+               dsb->buflen = dsbd->dwBufferBytes + 
+                       (dsbd->lpwfxFormat->nBlockAlign - 
+                       (dsbd->dwBufferBytes % dsbd->lpwfxFormat->nBlockAlign));
+       else
+               dsb->buflen = dsbd->dwBufferBytes;
 
+       dsb->freq = dsbd->lpwfxFormat->nSamplesPerSec;
        dsb->notify = NULL;
        dsb->notifies = NULL;
        dsb->nrofnotifies = 0;
index 9670a7396fab09f875f84f213c5a9f55f074ea09..5fc6bc670885a7cedeb4ed8f7481beba4542403d 100644 (file)
@@ -713,7 +713,8 @@ static HRESULT test_secondary(LPGUID lpGuid, int play,
         else
             bufdesc.dwFlags|=
                 (DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
-        bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+        bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                    wfx.nBlockAlign);
         bufdesc.lpwfxFormat=&wfx;
         if (winetest_interactive) {
             trace("  Testing a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d "
index 88eb7921b994ceadcdafca09cafbf23054e20561..3ff51041208145b9012eb73003276ce794dbb29b 100644 (file)
@@ -615,7 +615,8 @@ static HRESULT test_secondary8(LPGUID lpGuid, int play,
         else
             bufdesc.dwFlags|=
                 (DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
-        bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+        bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                    wfx.nBlockAlign);
         bufdesc.lpwfxFormat=&wfx;
         if (has_3d) {
             /* a stereo 3D buffer should fail */
index eeb6f0d6025ddcb5784d5978a55f2348495edab4..93fb2fe314fd805f304301f572b23a8250058a1b 100644 (file)
@@ -305,7 +305,8 @@ static HRESULT test_dsound(LPGUID lpGuid)
         ZeroMemory(&bufdesc, sizeof(bufdesc));
         bufdesc.dwSize=sizeof(bufdesc);
         bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D;
-        bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+        bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                    wfx.nBlockAlign);
         bufdesc.lpwfxFormat=&wfx;
         rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
         ok(rc==DS_OK && secondary!=NULL,
@@ -573,7 +574,8 @@ static HRESULT test_primary_secondary(LPGUID lpGuid)
             ZeroMemory(&bufdesc, sizeof(bufdesc));
             bufdesc.dwSize=sizeof(bufdesc);
             bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
-            bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+            bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                        wfx.nBlockAlign);
             bufdesc.lpwfxFormat=&wfx2;
             if (winetest_interactive) {
                 trace("  Testing a primary buffer at %ldx%dx%d with a "
@@ -672,7 +674,8 @@ static HRESULT test_secondary(LPGUID lpGuid)
             ZeroMemory(&bufdesc, sizeof(bufdesc));
             bufdesc.dwSize=sizeof(bufdesc);
             bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
-            bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+            bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                        wfx.nBlockAlign);
             rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
             ok(rc==DSERR_INVALIDPARAM,"IDirectSound_CreateSoundBuffer() "
                "should have returned DSERR_INVALIDPARAM, returned: %s\n",
@@ -684,7 +687,8 @@ static HRESULT test_secondary(LPGUID lpGuid)
             ZeroMemory(&bufdesc, sizeof(bufdesc));
             bufdesc.dwSize=sizeof(bufdesc);
             bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
-            bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+            bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                        wfx.nBlockAlign);
             bufdesc.lpwfxFormat=&wfx;
             if (winetest_interactive) {
                 trace("  Testing a secondary buffer at %ldx%dx%d "
@@ -727,6 +731,53 @@ EXIT:
     return rc;
 }
 
+static HRESULT test_block_align(LPGUID lpGuid)
+{
+    HRESULT rc;
+    LPDIRECTSOUND dso=NULL;
+    LPDIRECTSOUNDBUFFER secondary=NULL;
+    DSBUFFERDESC bufdesc;
+    DSBCAPS dsbcaps;
+    WAVEFORMATEX wfx;
+    int ref;
+
+    /* Create the DirectSound object */
+    rc=DirectSoundCreate(lpGuid,&dso,NULL);
+    ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
+       "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
+    if (rc!=DS_OK)
+        return rc;
+
+    init_format(&wfx,WAVE_FORMAT_PCM,11025,16,2);
+    ZeroMemory(&bufdesc, sizeof(bufdesc));
+    bufdesc.dwSize=sizeof(bufdesc);
+    bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
+    bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec + 1;
+    bufdesc.lpwfxFormat=&wfx;
+    rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
+    ok(rc==DS_OK,"IDirectSound_CreateSoundBuffer() "
+       "should have returned DS_OK, returned: %s\n",
+       DXGetErrorString8(rc));
+
+    if (rc==DS_OK && secondary!=NULL) {
+        rc=IDirectSoundBuffer_GetCaps(secondary,&dsbcaps);
+        ok(rc==DS_OK,"IDirectSoundBuffer_GetCaps() should have returned DS_OK, "
+           "returned: %s\n", DXGetErrorString8(rc));
+        ok(dsbcaps.dwBufferBytes==(wfx.nAvgBytesPerSec + 4),
+           "Buffer size not a multiple of nBlockAlign\n");
+        ref=IDirectSoundBuffer_Release(secondary);
+        ok(ref==0,"IDirectSoundBuffer_Release() secondary has %d references, "
+           "should have 0\n",ref);
+    }
+
+    ref=IDirectSound_Release(dso);
+    ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
+    if (ref!=0)
+        return DSERR_GENERIC;
+
+    return rc;
+}
+
 static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
                                    LPCSTR lpcstrModule, LPVOID lpContext)
 {
@@ -738,6 +789,7 @@ static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
     else if (rc == DSERR_ALLOCATED)
         trace("  Already In Use\n");
     else {
+        test_block_align(lpGuid);
         test_primary(lpGuid);
         test_primary_secondary(lpGuid);
         test_secondary(lpGuid);
index 80b661403f32e989350eb075e63740587248de7c..0f733aad4edd2ffef2132d88042cf0497dacff8d 100644 (file)
 
 static HRESULT (WINAPI *pDirectSoundCreate8)(LPCGUID,LPDIRECTSOUND8*,LPUNKNOWN)=NULL;
 
+int align(int length, int align)
+{
+    return (length / align) * align;
+}
+
 static void IDirectSound8_test(LPDIRECTSOUND8 dso, BOOL initialized,
                                LPCGUID lpGuid)
 {
@@ -315,7 +320,8 @@ static HRESULT test_dsound8(LPGUID lpGuid)
         ZeroMemory(&bufdesc, sizeof(bufdesc));
         bufdesc.dwSize=sizeof(bufdesc);
         bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D;
-        bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+        bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                    wfx.nBlockAlign);
         bufdesc.lpwfxFormat=&wfx;
         rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
         ok(rc==DS_OK && secondary!=NULL,
@@ -594,7 +600,8 @@ static HRESULT test_primary_secondary8(LPGUID lpGuid)
             ZeroMemory(&bufdesc, sizeof(bufdesc));
             bufdesc.dwSize=sizeof(bufdesc);
             bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
-            bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+            bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                        wfx.nBlockAlign);
             bufdesc.lpwfxFormat=&wfx2;
             if (winetest_interactive) {
                 trace("  Testing a primary buffer at %ldx%dx%d with a "
@@ -693,7 +700,8 @@ static HRESULT test_secondary8(LPGUID lpGuid)
             ZeroMemory(&bufdesc, sizeof(bufdesc));
             bufdesc.dwSize=sizeof(bufdesc);
             bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
-            bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+            bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                        wfx.nBlockAlign);
             rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
             ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_CreateSoundBuffer() "
                "should have returned DSERR_INVALIDPARAM, returned: %s\n",
@@ -705,7 +713,8 @@ static HRESULT test_secondary8(LPGUID lpGuid)
             ZeroMemory(&bufdesc, sizeof(bufdesc));
             bufdesc.dwSize=sizeof(bufdesc);
             bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
-            bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+            bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
+                                        wfx.nBlockAlign);
             bufdesc.lpwfxFormat=&wfx;
             if (winetest_interactive) {
                 trace("  Testing a secondary buffer at %ldx%dx%d "
index 88f319d5d1612446d8a08aec385c2ea2c7a261f2..49e6a9d6658c005e677e65962c29496b031fe1ab 100644 (file)
@@ -50,7 +50,6 @@ static const unsigned int formats[][4]={
 #define TIME_SLICE     31
 #define BUFFER_LEN    400
 
-
 extern char* wave_generate_la(WAVEFORMATEX*,double,DWORD*);
 extern HWND get_hwnd(void);
 extern void init_format(WAVEFORMATEX*,int,int,int,int);
@@ -61,3 +60,4 @@ extern void test_buffer8(LPDIRECTSOUND8,LPDIRECTSOUNDBUFFER,
                          BOOL,BOOL,LONG,BOOL,LONG,BOOL,double,BOOL,
                          LPDIRECTSOUND3DLISTENER,BOOL,BOOL);
 extern const char * getDSBCAPS(DWORD xmask);
+extern int align(int length, int align);