Andrew Eikum : mmdevapi: Store period size in frames.

Alexandre Julliard julliard at winehq.org
Wed Jan 5 12:40:29 CST 2011


Module: wine
Branch: master
Commit: bbbf72ddcb12022a1cc229068690302a147b5456
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bbbf72ddcb12022a1cc229068690302a147b5456

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue Jan  4 15:30:27 2011 -0600

mmdevapi: Store period size in frames.

There are three different units to represent durations of audio: time,
bytes, and frames. Since all three are in use in this module, we should
be more explicit about the unit of each variable.

---

 dlls/mmdevapi/audio.c |   36 +++++++++++++++++-------------------
 1 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/dlls/mmdevapi/audio.c b/dlls/mmdevapi/audio.c
index 0433b84..6659681 100644
--- a/dlls/mmdevapi/audio.c
+++ b/dlls/mmdevapi/audio.c
@@ -64,7 +64,7 @@ typedef struct ACImpl {
     BOOL init, running;
     CRITICAL_SECTION *crst;
     HANDLE handle;
-    DWORD locked, flags, bufsize, pad, padpartial, ofs, psize, candisconnect;
+    DWORD locked, flags, bufsize, pad, padpartial, ofs, periodsize_frames, candisconnect;
     BYTE *buffer;
     WAVEFORMATEX *pwfx;
     ALuint source;
@@ -515,15 +515,14 @@ static HRESULT WINAPI AC_Initialize(IAudioClient *iface, AUDCLNT_SHAREMODE mode,
     if (FAILED(hr))
         goto out;
 
-    This->psize = (DWORD64)This->pwfx->nSamplesPerSec * time / (DWORD64)10000000;
+    This->periodsize_frames = (DWORD64)This->pwfx->nSamplesPerSec * time / (DWORD64)10000000;
     if (duration > 20000000)
         duration = 20000000;
 
-    bufsize = duration / time * This->psize;
+    bufsize = duration / time * This->periodsize_frames;
     if (duration % time)
-        bufsize += This->psize;
+        bufsize += This->periodsize_frames;
     This->bufsize = bufsize;
-    This->psize *= This->pwfx->nBlockAlign;
     bufsize *= pwfx->nBlockAlign;
 
     This->format = get_format(This->pwfx);
@@ -694,20 +693,20 @@ static HRESULT WINAPI AC_GetCurrentPadding(IAudioClient *iface, UINT32 *numpad)
             This->laststamp += period;
 
             if (This->parent->flow == eCapture) {
-                This->pad += This->psize;
+                This->pad += This->periodsize_frames;
                 if (This->pad > This->bufsize)
                     This->pad = This->bufsize;
             } else {
-                if (This->pad <= This->psize) {
+                if (This->pad <= This->periodsize_frames) {
                     This->pad = 0;
                     break;
                 } else
-                    This->pad -= This->psize;
+                    This->pad -= This->periodsize_frames;
             }
         }
 
         if (This->parent->flow == eCapture)
-            *numpad = This->pad >= This->psize ? This->psize : 0;
+            *numpad = This->pad >= This->periodsize_frames ? This->periodsize_frames: 0;
         else
             *numpad = This->pad;
     } else if (This->parent->flow == eRender) {
@@ -726,8 +725,8 @@ static HRESULT WINAPI AC_GetCurrentPadding(IAudioClient *iface, UINT32 *numpad)
 #if 0 /* Manipulative lie */
         } else if (This->running) {
             ALint size = This->pad - padpart;
-            if (size > This->psize)
-                size = This->psize;
+            if (size > This->periodsize_frames)
+                size = This->periodsize_frames;
             played = (gettime() - This->laststamp)*8;
             played = played * This->pwfx->nSamplesPerSec / 10000000;
             if (played > size)
@@ -735,13 +734,12 @@ static HRESULT WINAPI AC_GetCurrentPadding(IAudioClient *iface, UINT32 *numpad)
 #endif
         }
         *numpad = This->pad - This->padpartial - played;
-        if (This->handle && *numpad + This->psize <= This->bufsize)
+        if (This->handle && (*numpad + This->periodsize_frames) <= This->bufsize)
             SetEvent(This->handle);
         getALError();
         popALContext();
     } else {
         DWORD block = This->pwfx->nBlockAlign;
-        DWORD psize = This->psize / block;
         palcGetIntegerv(This->dev, ALC_CAPTURE_SAMPLES, 1, &avail);
         if (avail) {
             DWORD ofs = This->ofs + This->pad;
@@ -766,15 +764,15 @@ static HRESULT WINAPI AC_GetCurrentPadding(IAudioClient *iface, UINT32 *numpad)
                 DWORD rest;
                 WARN("Overflowed! %u bytes\n", This->pad - This->bufsize);
                 This->ofs += This->pad - This->bufsize;
-                rest = This->ofs % psize;
+                rest = This->ofs % This->periodsize_frames;
                 if (rest)
-                    This->ofs += psize - rest;
+                    This->ofs += This->periodsize_frames - rest;
                 This->ofs %= This->bufsize;
                 This->pad = This->bufsize;
             }
         }
-        if (This->pad >= psize)
-            *numpad = psize;
+        if (This->pad >= This->periodsize_frames)
+            *numpad = This->periodsize_frames;
         else
             *numpad = 0;
     }
@@ -1387,8 +1385,8 @@ static HRESULT WINAPI ACC_GetBuffer(IAudioCaptureClient *iface, BYTE **data, UIN
         goto out;
     IAudioCaptureClient_GetNextPacketSize(iface, frames);
     ofs = This->parent->ofs;
-    if ( (ofs*block) % This->parent->psize)
-        ERR("Unaligned offset %u with %u\n", ofs*block, This->parent->psize);
+    if ( ofs % This->parent->periodsize_frames)
+        ERR("Unaligned offset %u with %u\n", ofs, This->parent->periodsize_frames);
     *data = This->parent->buffer + ofs * block;
     This->parent->locked = *frames;
     if (devpos)




More information about the wine-cvs mailing list