wave tests patch

Francois Gouget fgouget at codeweavers.com
Tue Jul 20 19:39:43 CDT 2004


Francois Gouget wrote:
[...]
> Anyway, assuming that we need to round up I propose to modify the 
> implementation as in the attached patch. The advantage is that it does 
> not rely on ceil(). In fact it doesn't even use floating point 
> arithmetic so we cannot get any rounding error.

The code that performs TIME_SMPTE calculations is the same for all 
drivers. It is even the same for the input and output devices (assuming 
the SMPTE rounding is the same for both) which means it is currently 
duplicated 12 times.

Would it be better to have waveOutGetPosition() in winmm.c simply query 
either the TIME_MS from the underlying driver and then perform the 
conversion? This would be something like:

...
     if (lpTime->wType==TIME_SMPTE)
     {
         LPMMTIME myTime;
         myTime.wType=TIME_MS;
         rc=MMDRV_Message(wmld, WODM_GETPOS, (DWORD_PTR)&myTime,
                          sizeof(myTime), TRUE);
         if (rc!=TIME_SAMPLES)
             return rc;
         {
             ms_to_smpte(myTime.u.ms,lpTime);
             return TIME_SMPTE;
         }
     }
     return MMDRV_Message(wmld, WODM_GETPOS, (DWORD_PTR)lpTime,
                          uSize, TRUE);
}

Then we can move the SMPTE calculation to the ms_to_smpte() helper 
function in winmm.c. The only drawback is performing SMPTE starting from 
the TIME_MS data which may have been rounded down a bit. We could 
eliminate this problem if we had access to the driver's wwo->format 
data. And then we could also move the TIME_MS calculation to winmm.c and 
even the TIME_SAMPLES one. Is there any (potential) driver for which 
this calculation would not work?

     lpTime->u.sample = bytes / (wwo->format.wBitsPerSample / 8 *
                                 wwo->format.wf.nChannels);


-- 
Francois Gouget
fgouget at codeweavers.com




More information about the wine-devel mailing list