Fix SMPTE calculations

Francois Gouget fgouget at codeweavers.com
Wed Mar 2 06:26:12 CST 2005


Jeremy fixed the SMPTE calculation in wineoss but that code is 
duplicated in each backend audio driver. So this patch applies the same 
fix to each of them.


Changelog:

  * dlls/winmm/winealsa/audio.c
    dlls/winmm/winearts/audio.c
    dlls/winmm/wineaudioio/audio.c
    dlls/winmm/winejack/audio.c
    dlls/winmm/winenas/audio.c

    Francois Gouget <fgouget at codeweavers.com>
    Apply Jeremy White's SMPTE calculation fix to each audio driver.

-- 
Francois Gouget
fgouget at codeweavers.com

-------------- next part --------------
Index: dlls/winmm/winealsa/audio.c
===================================================================
RCS file: /var/cvs/wine/dlls/winmm/winealsa/audio.c,v
retrieving revision 1.63
diff -u -p -r1.63 audio.c
--- dlls/winmm/winealsa/audio.c	28 Jan 2005 17:21:07 -0000	1.63
+++ dlls/winmm/winealsa/audio.c	25 Feb 2005 18:38:02 -0000
@@ -284,7 +284,9 @@ static DWORD bytes_to_mmtime(LPMMTIME lp
         TRACE("TIME_MS=%lu\n", lpTime->u.ms);
         break;
     case TIME_SMPTE:
+        lpTime->u.smpte.fps = 30;
         position = position / (format->Format.wBitsPerSample / 8 * format->Format.nChannels);
+        position += (format->Format.nSamplesPerSec / lpTime->u.smpte.fps) - 1; /* round up */
         lpTime->u.smpte.sec = position / format->Format.nSamplesPerSec;
         position -= lpTime->u.smpte.sec * format->Format.nSamplesPerSec;
         lpTime->u.smpte.min = lpTime->u.smpte.sec / 60;
@@ -293,12 +295,6 @@ static DWORD bytes_to_mmtime(LPMMTIME lp
         lpTime->u.smpte.min -= 60 * lpTime->u.smpte.hour;
         lpTime->u.smpte.fps = 30;
         lpTime->u.smpte.frame = position * lpTime->u.smpte.fps / format->Format.nSamplesPerSec;
-        position -= lpTime->u.smpte.frame * format->Format.nSamplesPerSec / lpTime->u.smpte.fps;
-        if (position != 0)
-        {
-            /* Round up */
-            lpTime->u.smpte.frame++;
-        }
         TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
               lpTime->u.smpte.hour, lpTime->u.smpte.min,
               lpTime->u.smpte.sec, lpTime->u.smpte.frame);
Index: dlls/winmm/winearts/audio.c
===================================================================
RCS file: /var/cvs/wine/dlls/winmm/winearts/audio.c,v
retrieving revision 1.28
diff -u -p -r1.28 audio.c
--- dlls/winmm/winearts/audio.c	28 Jan 2005 17:21:07 -0000	1.28
+++ dlls/winmm/winearts/audio.c	25 Feb 2005 23:12:59 -0000
@@ -238,7 +238,9 @@ static DWORD bytes_to_mmtime(LPMMTIME lp
         TRACE("TIME_MS=%lu\n", lpTime->u.ms);
         break;
     case TIME_SMPTE:
+        lpTime->u.smpte.fps = 30;
         position = position / (format->wBitsPerSample / 8 * format->wf.nChannels);
+        position += (format->wf.nSamplesPerSec / lpTime->u.smpte.fps) - 1; /* round up */
         lpTime->u.smpte.sec = position / format->wf.nSamplesPerSec;
         position -= lpTime->u.smpte.sec * format->wf.nSamplesPerSec;
         lpTime->u.smpte.min = lpTime->u.smpte.sec / 60;
@@ -247,12 +249,6 @@ static DWORD bytes_to_mmtime(LPMMTIME lp
         lpTime->u.smpte.min -= 60 * lpTime->u.smpte.hour;
         lpTime->u.smpte.fps = 30;
         lpTime->u.smpte.frame = position * lpTime->u.smpte.fps / format->wf.nSamplesPerSec;
-        position -= lpTime->u.smpte.frame * format->wf.nSamplesPerSec / lpTime->u.smpte.fps;
-        if (position != 0)
-        {
-            /* Round up */
-            lpTime->u.smpte.frame++;
-        }
         TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
               lpTime->u.smpte.hour, lpTime->u.smpte.min,
               lpTime->u.smpte.sec, lpTime->u.smpte.frame);
Index: dlls/winmm/wineaudioio/audio.c
===================================================================
RCS file: /var/cvs/wine/dlls/winmm/wineaudioio/audio.c,v
retrieving revision 1.23
diff -u -p -r1.23 audio.c
--- dlls/winmm/wineaudioio/audio.c	28 Jan 2005 17:21:07 -0000	1.23
+++ dlls/winmm/wineaudioio/audio.c	25 Feb 2005 18:38:48 -0000
@@ -197,21 +197,17 @@ static DWORD bytes_to_mmtime(LPMMTIME lp
         TRACE("TIME_MS=%lu\n", lpTime->u.ms);
         break;
     case TIME_SMPTE:
-        position = position / (format->wBitsPerSample / 8 * format->wf.nChannels);
-        lpTime->u.smpte.sec = position / format->wf.nSamplesPerSec;
-        position -= lpTime->u.smpte.sec * format->wf.nSamplesPerSec;
+        lpTime->u.smpte.fps = 30;
+        position = position / (format->Format.wBitsPerSample / 8 * format->Format.nChannels);
+        position += (format->Format.nSamplesPerSec / lpTime->u.smpte.fps) - 1; /* round up */
+        lpTime->u.smpte.sec = position / format->Format.nSamplesPerSec;
+        position -= lpTime->u.smpte.sec * format->Format.nSamplesPerSec;
         lpTime->u.smpte.min = lpTime->u.smpte.sec / 60;
         lpTime->u.smpte.sec -= 60 * lpTime->u.smpte.min;
         lpTime->u.smpte.hour = lpTime->u.smpte.min / 60;
         lpTime->u.smpte.min -= 60 * lpTime->u.smpte.hour;
         lpTime->u.smpte.fps = 30;
-        lpTime->u.smpte.frame = position * lpTime->u.smpte.fps / format->wf.nSamplesPerSec;
-        position -= lpTime->u.smpte.frame * format->wf.nSamplesPerSec / lpTime->u.smpte.fps;
-        if (position != 0)
-        {
-            /* Round up */
-            lpTime->u.smpte.frame++;
-        }
+        lpTime->u.smpte.frame = position * lpTime->u.smpte.fps / format->Format.nSamplesPerSec;
         TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
               lpTime->u.smpte.hour, lpTime->u.smpte.min,
               lpTime->u.smpte.sec, lpTime->u.smpte.frame);
Index: dlls/winmm/winejack/audio.c
===================================================================
RCS file: /var/cvs/wine/dlls/winmm/winejack/audio.c,v
retrieving revision 1.21
diff -u -p -r1.21 audio.c
--- dlls/winmm/winejack/audio.c	28 Jan 2005 17:21:07 -0000	1.21
+++ dlls/winmm/winejack/audio.c	25 Feb 2005 23:14:59 -0000
@@ -233,7 +233,9 @@ static DWORD bytes_to_mmtime(LPMMTIME lp
         TRACE("TIME_MS=%lu\n", lpTime->u.ms);
         break;
     case TIME_SMPTE:
+        lpTime->u.smpte.fps = 30;
         position = position / (format->wBitsPerSample / 8 * format->wf.nChannels);
+        position += (format->wf.nSamplesPerSec / lpTime->u.smpte.fps) - 1; /* round up */
         lpTime->u.smpte.sec = position / format->wf.nSamplesPerSec;
         position -= lpTime->u.smpte.sec * format->wf.nSamplesPerSec;
         lpTime->u.smpte.min = lpTime->u.smpte.sec / 60;
@@ -242,12 +244,6 @@ static DWORD bytes_to_mmtime(LPMMTIME lp
         lpTime->u.smpte.min -= 60 * lpTime->u.smpte.hour;
         lpTime->u.smpte.fps = 30;
         lpTime->u.smpte.frame = position * lpTime->u.smpte.fps / format->wf.nSamplesPerSec;
-        position -= lpTime->u.smpte.frame * format->wf.nSamplesPerSec / lpTime->u.smpte.fps;
-        if (position != 0)
-        {
-            /* Round up */
-            lpTime->u.smpte.frame++;
-        }
         TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
               lpTime->u.smpte.hour, lpTime->u.smpte.min,
               lpTime->u.smpte.sec, lpTime->u.smpte.frame);
Index: dlls/winmm/winenas/audio.c
===================================================================
RCS file: /var/cvs/wine/dlls/winmm/winenas/audio.c,v
retrieving revision 1.21
diff -u -p -r1.21 audio.c
--- dlls/winmm/winenas/audio.c	28 Jan 2005 17:21:07 -0000	1.21
+++ dlls/winmm/winenas/audio.c	25 Feb 2005 23:15:42 -0000
@@ -295,7 +295,9 @@ static DWORD bytes_to_mmtime(LPMMTIME lp
         TRACE("TIME_MS=%lu\n", lpTime->u.ms);
         break;
     case TIME_SMPTE:
+        lpTime->u.smpte.fps = 30;
         position = position / (format->wBitsPerSample / 8 * format->wf.nChannels);
+        position += (format->wf.nSamplesPerSec / lpTime->u.smpte.fps) - 1; /* round up */
         lpTime->u.smpte.sec = position / format->wf.nSamplesPerSec;
         position -= lpTime->u.smpte.sec * format->wf.nSamplesPerSec;
         lpTime->u.smpte.min = lpTime->u.smpte.sec / 60;
@@ -304,12 +306,6 @@ static DWORD bytes_to_mmtime(LPMMTIME lp
         lpTime->u.smpte.min -= 60 * lpTime->u.smpte.hour;
         lpTime->u.smpte.fps = 30;
         lpTime->u.smpte.frame = position * lpTime->u.smpte.fps / format->wf.nSamplesPerSec;
-        position -= lpTime->u.smpte.frame * format->wf.nSamplesPerSec / lpTime->u.smpte.fps;
-        if (position != 0)
-        {
-            /* Round up */
-            lpTime->u.smpte.frame++;
-        }
         TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
               lpTime->u.smpte.hour, lpTime->u.smpte.min,
               lpTime->u.smpte.sec, lpTime->u.smpte.frame);


More information about the wine-patches mailing list