wave drivers GetPosition patch
Robert Reif
reif at earthlink.net
Mon May 31 19:59:43 CDT 2004
Fix calculation of SMPTE time (round up to full frame).
More accurate ms calculation.
-------------- next part --------------
Index: dlls/winmm/winealsa/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winealsa/audio.c,v
retrieving revision 1.43
diff -u -r1.43 audio.c
--- dlls/winmm/winealsa/audio.c 11 May 2004 04:28:13 -0000 1.43
+++ dlls/winmm/winealsa/audio.c 1 Jun 2004 00:53:43 -0000
@@ -1831,7 +1831,7 @@
*/
static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
- int time;
+ double time;
DWORD val;
WINE_WAVEOUT* wwo;
@@ -1864,14 +1864,14 @@
TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
- time = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
- lpTime->u.smpte.hour = time / (60 * 60 * 1000);
- time -= lpTime->u.smpte.hour * (60 * 60 * 1000);
- lpTime->u.smpte.min = time / (60 * 1000);
- time -= lpTime->u.smpte.min * (60 * 1000);
- lpTime->u.smpte.sec = time / 1000;
- time -= lpTime->u.smpte.sec * 1000;
- lpTime->u.smpte.frame = time * 30 / 1000;
+ time = (double)val / (double)wwo->format.wf.nAvgBytesPerSec;
+ lpTime->u.smpte.hour = time / (60 * 60);
+ time -= lpTime->u.smpte.hour * (60 * 60);
+ lpTime->u.smpte.min = time / 60;
+ time -= lpTime->u.smpte.min * 60;
+ lpTime->u.smpte.sec = time;
+ time -= lpTime->u.smpte.sec;
+ lpTime->u.smpte.frame = ceil(time * 30);
lpTime->u.smpte.fps = 30;
TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
@@ -1881,7 +1881,7 @@
FIXME("Format %d not supported ! use TIME_MS !\n", lpTime->wType);
lpTime->wType = TIME_MS;
case TIME_MS:
- lpTime->u.ms = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
+ lpTime->u.ms = val * 1000.0 / wwo->format.wf.nAvgBytesPerSec;
TRACE("TIME_MS=%lu\n", lpTime->u.ms);
break;
}
@@ -3334,7 +3334,7 @@
*/
static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
- int time;
+ double time;
WINE_WAVEIN* wwi;
FIXME("(%u, %p, %lu);\n", wDevID, lpTime, uSize);
@@ -3365,15 +3365,15 @@
TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
- time = wwi->dwTotalRecorded /
- (wwi->format.wf.nAvgBytesPerSec / 1000);
- lpTime->u.smpte.hour = time / (60 * 60 * 1000);
- time -= lpTime->u.smpte.hour * (60 * 60 * 1000);
- lpTime->u.smpte.min = time / (60 * 1000);
- time -= lpTime->u.smpte.min * (60 * 1000);
- lpTime->u.smpte.sec = time / 1000;
- time -= lpTime->u.smpte.sec * 1000;
- lpTime->u.smpte.frame = time * 30 / 1000;
+ time = (double)wwi->dwTotalRecorded /
+ (double)wwi->format.wf.nAvgBytesPerSec;
+ lpTime->u.smpte.hour = time / (60 * 60);
+ time -= lpTime->u.smpte.hour * (60 * 60);
+ lpTime->u.smpte.min = time / 60;
+ time -= lpTime->u.smpte.min * 60;
+ lpTime->u.smpte.sec = time;
+ time -= lpTime->u.smpte.sec;
+ lpTime->u.smpte.frame = ceil(time * 30);
lpTime->u.smpte.fps = 30;
TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
@@ -3383,8 +3383,8 @@
FIXME("format not supported (%u) ! use TIME_MS !\n", lpTime->wType);
lpTime->wType = TIME_MS;
case TIME_MS:
- lpTime->u.ms = wwi->dwTotalRecorded /
- (wwi->format.wf.nAvgBytesPerSec / 1000);
+ lpTime->u.ms = wwi->dwTotalRecorded * 1000.0 /
+ wwi->format.wf.nAvgBytesPerSec;
TRACE("TIME_MS=%lu\n", lpTime->u.ms);
break;
}
Index: dlls/winmm/winearts/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winearts/audio.c,v
retrieving revision 1.18
diff -u -r1.18 audio.c
--- dlls/winmm/winearts/audio.c 14 May 2004 00:44:06 -0000 1.18
+++ dlls/winmm/winearts/audio.c 1 Jun 2004 00:53:44 -0000
@@ -1384,7 +1384,7 @@
*/
static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
- int time;
+ double time;
DWORD val;
WINE_WAVEOUT* wwo;
@@ -1419,14 +1419,14 @@
TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
- time = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
- lpTime->u.smpte.hour = time / (60 * 60 * 1000);
- time -= lpTime->u.smpte.hour * (60 * 60 * 1000);
- lpTime->u.smpte.min = time / (60 * 1000);
- time -= lpTime->u.smpte.min * (60 * 1000);
- lpTime->u.smpte.sec = time / 1000;
- time -= lpTime->u.smpte.sec * 1000;
- lpTime->u.smpte.frame = time * 30 / 1000;
+ time = (double)val / (double)wwo->format.wf.nAvgBytesPerSec;
+ lpTime->u.smpte.hour = time / (60 * 60);
+ time -= lpTime->u.smpte.hour * (60 * 60);
+ lpTime->u.smpte.min = time / 60;
+ time -= lpTime->u.smpte.min * 60;
+ lpTime->u.smpte.sec = time;
+ time -= lpTime->u.smpte.sec;
+ lpTime->u.smpte.frame = ceil(time * 30);
lpTime->u.smpte.fps = 30;
TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
@@ -1436,7 +1436,7 @@
FIXME("Format %d not supported ! use TIME_MS !\n", lpTime->wType);
lpTime->wType = TIME_MS;
case TIME_MS:
- lpTime->u.ms = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
+ lpTime->u.ms = val * 1000.0 / wwo->format.wf.nAvgBytesPerSec;
TRACE("TIME_MS=%lu\n", lpTime->u.ms);
break;
}
Index: dlls/winmm/wineaudioio/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/wineaudioio/audio.c,v
retrieving revision 1.11
diff -u -r1.11 audio.c
--- dlls/winmm/wineaudioio/audio.c 26 Apr 2004 20:04:00 -0000 1.11
+++ dlls/winmm/wineaudioio/audio.c 1 Jun 2004 00:53:46 -0000
@@ -1082,7 +1082,7 @@
*/
static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
- int time;
+ double time;
DWORD val;
WINE_WAVEOUT* wwo;
@@ -1114,14 +1114,14 @@
TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
- time = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
- lpTime->u.smpte.hour = time / 108000;
- time -= lpTime->u.smpte.hour * 108000;
- lpTime->u.smpte.min = time / 1800;
- time -= lpTime->u.smpte.min * 1800;
- lpTime->u.smpte.sec = time / 30;
- time -= lpTime->u.smpte.sec * 30;
- lpTime->u.smpte.frame = time;
+ time = (double)val / (double)wwo->format.wf.nAvgBytesPerSec;
+ lpTime->u.smpte.hour = time / (60 * 60);
+ time -= lpTime->u.smpte.hour * (60 * 60);
+ lpTime->u.smpte.min = time / 60;
+ time -= lpTime->u.smpte.min * 60;
+ lpTime->u.smpte.sec = time;
+ time -= lpTime->u.smpte.sec;
+ lpTime->u.smpte.frame = ceil(time * 30);
lpTime->u.smpte.fps = 30;
TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
@@ -1131,7 +1131,7 @@
FIXME("Format %d not supported ! use TIME_MS !\n", lpTime->wType);
lpTime->wType = TIME_MS;
case TIME_MS:
- lpTime->u.ms = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
+ lpTime->u.ms = val * 1000.0 / wwo->format.wf.nAvgBytesPerSec;
TRACE("TIME_MS=%lu\n", lpTime->u.ms);
break;
}
@@ -2205,7 +2205,7 @@
*/
static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
- int time;
+ double time;
WINE_WAVEIN* wwi;
TRACE("(%u, %p, %lu);\n", wDevID, lpTime, uSize);
@@ -2234,23 +2234,23 @@
TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
- time = wwi->dwTotalRecorded /
- (wwi->format.wf.nAvgBytesPerSec / 1000);
- lpTime->u.smpte.hour = time / 108000;
- time -= lpTime->u.smpte.hour * 108000;
- lpTime->u.smpte.min = time / 1800;
- time -= lpTime->u.smpte.min * 1800;
- lpTime->u.smpte.sec = time / 30;
- time -= lpTime->u.smpte.sec * 30;
- lpTime->u.smpte.frame = time;
+ time = (double)wwi->dwTotalRecorded /
+ (double)wwi->format.wf.nAvgBytesPerSec;
+ lpTime->u.smpte.hour = time / (60 * 60);
+ time -= lpTime->u.smpte.hour * (60 * 60);
+ lpTime->u.smpte.min = time / 60;
+ time -= lpTime->u.smpte.min * 60;
+ lpTime->u.smpte.sec = time;
+ time -= lpTime->u.smpte.sec;
+ lpTime->u.smpte.frame = celi(time * 30);
lpTime->u.smpte.fps = 30;
TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
lpTime->u.smpte.sec, lpTime->u.smpte.frame);
break;
case TIME_MS:
- lpTime->u.ms = wwi->dwTotalRecorded /
- (wwi->format.wf.nAvgBytesPerSec / 1000);
+ lpTime->u.ms = wwi->dwTotalRecorded * 1000.0 /
+ wwi->format.wf.nAvgBytesPerSec;
TRACE("TIME_MS=%lu\n", lpTime->u.ms);
break;
default:
Index: dlls/winmm/winejack/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winejack/audio.c,v
retrieving revision 1.11
diff -u -r1.11 audio.c
--- dlls/winmm/winejack/audio.c 11 May 2004 04:28:13 -0000 1.11
+++ dlls/winmm/winejack/audio.c 1 Jun 2004 00:53:48 -0000
@@ -1542,7 +1542,7 @@
*/
static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
- int time;
+ double time;
DWORD val;
WINE_WAVEOUT* wwo;
DWORD elapsedMS;
@@ -1584,14 +1584,14 @@
TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
- time = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
- lpTime->u.smpte.hour = time / 108000;
- time -= lpTime->u.smpte.hour * 108000;
- lpTime->u.smpte.min = time / 1800;
- time -= lpTime->u.smpte.min * 1800;
- lpTime->u.smpte.sec = time / 30;
- time -= lpTime->u.smpte.sec * 30;
- lpTime->u.smpte.frame = time;
+ time = (double)val / (double)wwo->format.wf.nAvgBytesPerSec;
+ lpTime->u.smpte.hour = time / (60 * 60);
+ time -= lpTime->u.smpte.hour * (60 * 60);
+ lpTime->u.smpte.min = time / 60;
+ time -= lpTime->u.smpte.min * 60;
+ lpTime->u.smpte.sec = time;
+ time -= lpTime->u.smpte.sec;
+ lpTime->u.smpte.frame = ceil(time * 30);
lpTime->u.smpte.fps = 30;
TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
@@ -1601,7 +1601,7 @@
FIXME("Format %d not supported ! use TIME_MS !\n", lpTime->wType);
lpTime->wType = TIME_MS;
case TIME_MS:
- lpTime->u.ms = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
+ lpTime->u.ms = val * 1000.0 / wwo->format.wf.nAvgBytesPerSec;
TRACE("TIME_MS=%lu\n", lpTime->u.ms);
break;
}
Index: dlls/winmm/winenas/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winenas/audio.c,v
retrieving revision 1.13
diff -u -r1.13 audio.c
--- dlls/winmm/winenas/audio.c 26 Apr 2004 20:04:00 -0000 1.13
+++ dlls/winmm/winenas/audio.c 1 Jun 2004 00:53:49 -0000
@@ -1122,7 +1122,7 @@
*/
static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
- int time;
+ double time;
DWORD val;
WINE_WAVEOUT* wwo;
@@ -1158,14 +1158,14 @@
TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
- time = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
- lpTime->u.smpte.hour = time / 108000;
- time -= lpTime->u.smpte.hour * 108000;
- lpTime->u.smpte.min = time / 1800;
- time -= lpTime->u.smpte.min * 1800;
- lpTime->u.smpte.sec = time / 30;
- time -= lpTime->u.smpte.sec * 30;
- lpTime->u.smpte.frame = time;
+ time = (double)val / (double)wwo->format.wf.nAvgBytesPerSec;
+ lpTime->u.smpte.hour = time / (60 * 60);
+ time -= lpTime->u.smpte.hour * (60 * 60);
+ lpTime->u.smpte.min = time / 60;
+ time -= lpTime->u.smpte.min * 60;
+ lpTime->u.smpte.sec = time;
+ time -= lpTime->u.smpte.sec;
+ lpTime->u.smpte.frame = ceil(time * 30);
lpTime->u.smpte.fps = 30;
TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
@@ -1175,7 +1175,7 @@
FIXME("Format %d not supported ! use TIME_MS !\n", lpTime->wType);
lpTime->wType = TIME_MS;
case TIME_MS:
- lpTime->u.ms = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
+ lpTime->u.ms = val * 1000.0 / wwo->format.wf.nAvgBytesPerSec;
TRACE("TIME_MS=%lu\n", lpTime->u.ms);
break;
}
Index: dlls/winmm/wineoss/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/wineoss/audio.c,v
retrieving revision 1.129
diff -u -r1.129 audio.c
--- dlls/winmm/wineoss/audio.c 20 May 2004 01:16:10 -0000 1.129
+++ dlls/winmm/wineoss/audio.c 1 Jun 2004 00:53:52 -0000
@@ -2018,7 +2018,7 @@
*/
static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
- int time;
+ double time;
DWORD val;
WINE_WAVEOUT* wwo;
@@ -2057,16 +2057,16 @@
TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
- time = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
- lpTime->u.smpte.hour = time / (60 * 60 * 1000);
- time -= lpTime->u.smpte.hour * (60 * 60 * 1000);
- lpTime->u.smpte.min = time / (60 * 1000);
- time -= lpTime->u.smpte.min * (60 * 1000);
- lpTime->u.smpte.sec = time / 1000;
- time -= lpTime->u.smpte.sec * 1000;
- lpTime->u.smpte.frame = time * 30 / 1000;
+ time = (double)val / (double)wwo->format.wf.nAvgBytesPerSec;
+ lpTime->u.smpte.hour = time / (60 * 60);
+ time -= lpTime->u.smpte.hour * (60 * 60);
+ lpTime->u.smpte.min = time / 60;
+ time -= lpTime->u.smpte.min * 60;
+ lpTime->u.smpte.sec = time;
+ time -= lpTime->u.smpte.sec;
+ lpTime->u.smpte.frame = ceil(time * 30);
lpTime->u.smpte.fps = 30;
- TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
+ ERR("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
lpTime->u.smpte.sec, lpTime->u.smpte.frame);
break;
@@ -2074,7 +2074,7 @@
FIXME("Format %d not supported ! use TIME_MS !\n", lpTime->wType);
lpTime->wType = TIME_MS;
case TIME_MS:
- lpTime->u.ms = val / (wwo->format.wf.nAvgBytesPerSec / 1000);
+ lpTime->u.ms = val * 1000.0 / wwo->format.wf.nAvgBytesPerSec;
TRACE("TIME_MS=%lu\n", lpTime->u.ms);
break;
}
@@ -3807,7 +3807,7 @@
*/
static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
- int time;
+ double time;
WINE_WAVEIN* wwi;
TRACE("(%u, %p, %lu);\n", wDevID, lpTime, uSize);
@@ -3845,15 +3845,15 @@
TRACE("TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
- time = wwi->dwTotalRecorded /
- (wwi->format.wf.nAvgBytesPerSec / 1000);
- lpTime->u.smpte.hour = time / (60 * 60 * 1000);
- time -= lpTime->u.smpte.hour * (60 * 60 * 1000);
- lpTime->u.smpte.min = time / (60 * 1000);
- time -= lpTime->u.smpte.min * (60 * 1000);
- lpTime->u.smpte.sec = time / 1000;
- time -= lpTime->u.smpte.sec * 1000;
- lpTime->u.smpte.frame = time * 30 / 1000;
+ time = (double)wwi->dwTotalRecorded /
+ (double)wwi->format.wf.nAvgBytesPerSec;
+ lpTime->u.smpte.hour = time / (60 * 60);
+ time -= lpTime->u.smpte.hour * (60 * 60);
+ lpTime->u.smpte.min = time / 60;
+ time -= lpTime->u.smpte.min * 60;
+ lpTime->u.smpte.sec = time;
+ time -= lpTime->u.smpte.sec;
+ lpTime->u.smpte.frame = ceil(time * 30);
lpTime->u.smpte.fps = 30;
TRACE("TIME_SMPTE=%02u:%02u:%02u:%02u\n",
lpTime->u.smpte.hour, lpTime->u.smpte.min,
@@ -3863,8 +3863,8 @@
FIXME("format not supported (%u) ! use TIME_MS !\n", lpTime->wType);
lpTime->wType = TIME_MS;
case TIME_MS:
- lpTime->u.ms = wwi->dwTotalRecorded /
- (wwi->format.wf.nAvgBytesPerSec / 1000);
+ lpTime->u.ms = wwi->dwTotalRecorded * 1000.0 /
+ wwi->format.wf.nAvgBytesPerSec;
TRACE("TIME_MS=%lu\n", lpTime->u.ms);
break;
}
More information about the wine-patches
mailing list