[DSOUND_NEW]
[reactos.git] / reactos / dll / directx / dsound_new / secondary.c
index 47a2ad7..c2f29bf 100644 (file)
@@ -17,6 +17,7 @@ typedef struct
 
     LPFILTERINFO Filter;
     DWORD dwLevel;
+    DWORD dwFlags;
     LPWAVEFORMATEX Format;
     PUCHAR Buffer;
     DWORD BufferSize;
@@ -97,8 +98,27 @@ SecondaryDirectSoundBuffer8Impl_fnGetCaps(
     LPDIRECTSOUNDBUFFER8 iface,
     LPDSBCAPS pDSBufferCaps)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (!pDSBufferCaps)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    if (pDSBufferCaps->dwSize < sizeof(DSBCAPS))
+    {
+        /* invalid buffer size */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* get buffer details */
+    pDSBufferCaps->dwUnlockTransferRate = 0;
+    pDSBufferCaps->dwPlayCpuOverhead = 0;
+    pDSBufferCaps->dwSize = This->BufferSize;
+    pDSBufferCaps->dwFlags = This->dwFlags;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -255,7 +275,7 @@ SecondaryDirectSoundBuffer8Impl_fnLock(
 
         return DS_OK;
     }
-    else if (dwFlags & DSBLOCK_FROMWRITECURSOR)
+    else if (dwFlags == DSBLOCK_FROMWRITECURSOR)
     {
         UNIMPLEMENTED
         return DSERR_UNSUPPORTED;
@@ -263,8 +283,9 @@ SecondaryDirectSoundBuffer8Impl_fnLock(
     else
     {
         ASSERT(dwOffset < This->BufferSize);
-        ASSERT(dwBytes < This->BufferSize);
-        ASSERT(dwBytes + dwOffset <= This->BufferSize);
+        ASSERT(dwBytes <= This->BufferSize);
+
+        dwBytes = min(This->BufferSize - dwOffset, dwBytes);
 
         *ppvAudioPtr1 = This->Buffer + dwOffset;
         *pdwAudioBytes1 = dwBytes;
@@ -294,25 +315,29 @@ SecondaryDirectSoundBuffer8Impl_fnPlay(
         return DSERR_INVALIDPARAM;
     }
 
-    DPRINT("SecondaryDirectSoundBuffer8Impl_fnPlay dwPriority %x dwFlags %x\n", dwPriority, dwFlags);
-    hResult = PrimaryDirectSoundBuffer_SetFormat(This->PrimaryBuffer, This->Format, (dwFlags & DSBPLAY_LOOPING));
+    /* sanity check */
+    ASSERT(dwFlags & DSBPLAY_LOOPING);
+
+    /* set dataformat */
+    hResult = PrimaryDirectSoundBuffer_SetFormat(This->PrimaryBuffer, This->Format, TRUE);
 
-    DPRINT("Result %x\n", hResult);
     if (!SUCCEEDED(hResult))
     {
         /* failed */
+        DPRINT1("Failed to set format Tag %u Samples %u Bytes %u nChannels %u\n", This->Format->wFormatTag, This->Format->nSamplesPerSec, This->Format->wBitsPerSample, This->Format->nChannels);
         return hResult;
     }
 
+    /* start primary buffer */
     PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_RUN);
-
-
+    /* acquire primary buffer */
     PrimaryDirectSoundBuffer_AcquireLock(This->PrimaryBuffer);
-
+    /* HACK write buffer */
     PrimaryDirectSoundBuffer_Write(This->PrimaryBuffer, This->Buffer, This->BufferSize);
-
+    /* release primary buffer */
     PrimaryDirectSoundBuffer_ReleaseLock(This->PrimaryBuffer);
 
+    DPRINT("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer);
     return DS_OK;
 }
 
@@ -523,6 +548,7 @@ NewSecondarySoundBuffer(
     This->lpVtbl = &vt_DirectSoundBuffer8;
     This->Filter = Filter;
     This->dwLevel = dwLevel;
+    This->dwFlags = lpcDSBufferDesc->dwFlags;
     This->State = KSSTATE_STOP;
     This->Flags = 0;
     This->Position = 0;