[ros-diffs] [silverblade] 39669: Rewrite DoWaveStreaming (makes CommitWaveHeaderToKernelDevice redundant). Tested with Media Player and NT's Sound Blaster 16 kernel-mode driver on Windows NT4. Audio buffers play correctly and don't suffer from the stuttering problem that my previous revision of this code did.

silverblade at svn.reactos.org silverblade at svn.reactos.org
Wed Feb 18 22:26:28 CET 2009


Author: silverblade
Date: Wed Feb 18 15:26:28 2009
New Revision: 39669

URL: http://svn.reactos.org/svn/reactos?rev=39669&view=rev
Log:
Rewrite DoWaveStreaming (makes CommitWaveHeaderToKernelDevice redundant).
Tested with Media Player and NT's Sound Blaster 16 kernel-mode driver on
Windows NT4. Audio buffers play correctly and don't suffer from the
stuttering problem that my previous revision of this code did.


Modified:
    trunk/reactos/include/reactos/libs/sound/mmebuddy.h
    trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c

Modified: trunk/reactos/include/reactos/libs/sound/mmebuddy.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/mmebuddy.h?rev=39669&r1=39668&r2=39669&view=diff
==============================================================================
--- trunk/reactos/include/reactos/libs/sound/mmebuddy.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/libs/sound/mmebuddy.h [iso-8859-1] Wed Feb 18 15:26:28 2009
@@ -595,7 +595,7 @@
     wave/streaming.c
 */
 
-MMRESULT
+VOID
 DoWaveStreaming(
     IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance);
 

Modified: trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c?rev=39669&r1=39668&r2=39669&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/sound/mmebuddy/wave/streaming.c [iso-8859-1] Wed Feb 18 15:26:28 2009
@@ -21,7 +21,7 @@
 */
 
 #define SOUND_KERNEL_BUFFER_COUNT       10
-#define SOUND_KERNEL_BUFFER_SIZE        200000
+#define SOUND_KERNEL_BUFFER_SIZE        16384
 
 
 /*
@@ -29,13 +29,15 @@
         Check if there is streaming to be done, and if so, do it.
 */
 
-MMRESULT
+VOID
 DoWaveStreaming(
     IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance)
 {
     MMRESULT Result;
     PSOUND_DEVICE SoundDevice;
     PMMFUNCTION_TABLE FunctionTable;
+    PWAVEHDR Header;
+    PWAVEHDR_EXTENSION HeaderExtension;
 
     Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
     SND_ASSERT( MMSUCCESS(Result) );
@@ -45,6 +47,91 @@
     SND_ASSERT( FunctionTable );
     SND_ASSERT( FunctionTable->CommitWaveBuffer );
 
+    /* No point in doing anything if no resources available to use */
+    if ( SoundDeviceInstance->OutstandingBuffers >= SOUND_KERNEL_BUFFER_COUNT )
+    {
+        SND_TRACE(L"DoWaveStreaming: No available buffers to stream with - doing nothing\n");
+        return;
+    }
+
+    /* Is there any work to do? */
+    Header = SoundDeviceInstance->HeadWaveHeader;
+
+    if ( ! Header )
+    {
+        SND_TRACE(L"DoWaveStreaming: No work to do - doing nothing\n");
+        return;
+    }
+
+    while ( ( SoundDeviceInstance->OutstandingBuffers < SOUND_KERNEL_BUFFER_COUNT ) &&
+            ( Header ) )
+    {
+        HeaderExtension = (PWAVEHDR_EXTENSION) Header->reserved;
+        SND_ASSERT( HeaderExtension );
+
+        /* Can never be *above* the length */
+        SND_ASSERT( HeaderExtension->BytesCommitted <= Header->dwBufferLength );
+
+        if ( HeaderExtension->BytesCommitted == Header->dwBufferLength )
+        {
+            Header = Header->lpNext;
+        }
+        else
+        {
+            PSOUND_OVERLAPPED Overlap;
+            LPVOID OffsetPtr;
+            DWORD BytesRemaining, BytesToCommit;
+            BOOL OK;
+
+            /* Where within the header buffer to stream from */
+            OffsetPtr = Header->lpData + HeaderExtension->BytesCommitted;
+
+            /* How much of this header has not been committed */
+            BytesRemaining = Header->dwBufferLength - HeaderExtension->BytesCommitted;
+
+            /* We can commit anything up to the buffer size limit */
+            BytesToCommit = BytesRemaining > SOUND_KERNEL_BUFFER_SIZE ?
+                            SOUND_KERNEL_BUFFER_SIZE :
+                            BytesRemaining;
+
+            /* Should always have something to commit by this point */
+            SND_ASSERT( BytesToCommit > 0 );
+
+            /* We need a new overlapped info structure for each buffer */
+            Overlap = AllocateStruct(SOUND_OVERLAPPED);
+
+            if ( Overlap )
+            {
+                ZeroMemory(Overlap, sizeof(SOUND_OVERLAPPED));
+                Overlap->SoundDeviceInstance = SoundDeviceInstance;
+                Overlap->Header = Header;
+
+                /* Adjust the commit-related counters */
+                HeaderExtension->BytesCommitted += BytesToCommit;
+                ++ SoundDeviceInstance->OutstandingBuffers;
+
+                OK = MMSUCCESS(FunctionTable->CommitWaveBuffer(SoundDeviceInstance,
+                                                               OffsetPtr,
+                                                               BytesToCommit,
+                                                               Overlap,
+                                                               CompleteIO));
+
+                if ( ! OK )
+                {
+                    /* Clean-up and try again on the next iteration (is this OK?) */
+                    SND_WARN(L"FAILED\n");
+
+                    FreeMemory(Overlap);
+                    HeaderExtension->BytesCommitted -= BytesToCommit;
+                    -- SoundDeviceInstance->OutstandingBuffers;
+                }
+            }
+        }
+    }
+
+
+#if 0
+
     // HACK
     SND_TRACE(L"Calling buffer submit routine\n");
 
@@ -68,6 +155,7 @@
     }
 
     return Result;
+#endif
 }
 
 



More information about the Ros-diffs mailing list