winecoreaudio: Introduce a helper to retrieve the time.

The motivation is that this will need to be called from a
non-Win32 thread and so shouldn't use the Win32 API.  An
added benefit is that it will eliminate the 16ms jitter
associated with GetTickCount().

The instance of the helper on the user-side is temporary.

Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Huw Davies 2021-11-30 07:56:28 +00:00 committed by Alexandre Julliard
parent 4c04fb00f0
commit 3b043e72b5
2 changed files with 21 additions and 4 deletions

View File

@ -143,6 +143,14 @@ static void set_in_notify(struct notify_context *notify, struct midi_src *src, W
* CoreMIDI IO threaded callback,
* we can't call Wine debug channels, critical section or anything using NtCurrentTeb here.
*/
static uint64_t get_time_ms(void)
{
static mach_timebase_info_data_t timebase;
if (!timebase.denom) mach_timebase_info(&timebase);
return mach_absolute_time() / 1000000 * timebase.numer / timebase.denom;
}
static void midi_in_read_proc(const MIDIPacketList *pktlist, void *refCon, void *connRefCon)
{
CFMessagePortRef msg_port = CFMessagePortCreateRemote(kCFAllocatorDefault, midi_in_thread_port_name);
@ -917,7 +925,7 @@ static DWORD midi_in_start(WORD dev_id)
return MMSYSERR_BADDEVICEID;
}
srcs[dev_id].state = 1;
srcs[dev_id].startTime = NtGetTickCount();
srcs[dev_id].startTime = get_time_ms();
return MMSYSERR_NOERROR;
}
@ -936,7 +944,7 @@ static DWORD midi_in_stop(WORD dev_id)
static DWORD midi_in_reset(WORD dev_id, struct notify_context *notify)
{
DWORD cur_time = NtGetTickCount();
DWORD cur_time = get_time_ms();
DWORD err = MMSYSERR_NOERROR;
struct midi_src *src;
MIDIHDR *hdr;

View File

@ -45,6 +45,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(midi);
#include <mach/mach_time.h>
#include <CoreAudio/CoreAudio.h>
#define WINE_DEFINITIONS
@ -61,6 +62,14 @@ static MIDIPortRef MIDIInPort = NULL;
MIDISource *sources;
static uint64_t get_time_ms(void)
{
static mach_timebase_info_data_t timebase;
if (!timebase.denom) mach_timebase_info(&timebase);
return mach_absolute_time() / 1000000 * timebase.numer / timebase.denom;
}
static void notify_client(struct notify_context *notify)
{
TRACE("dev_id=%d msg=%d param1=%04lX param2=%04lX\n", notify->dev_id, notify->msg, notify->param_1, notify->param_2);
@ -183,7 +192,7 @@ static CFDataRef MIDIIn_MessageHandler(CFMessagePortRef local, SInt32 msgid, CFD
}
midi_lock( TRUE );
currentTime = GetTickCount() - src->startTime;
currentTime = get_time_ms() - src->startTime;
while (len) {
LPMIDIHDR lpMidiHdr = src->lpQueueHdr;
@ -218,7 +227,7 @@ static CFDataRef MIDIIn_MessageHandler(CFMessagePortRef local, SInt32 msgid, CFD
}
midi_lock( TRUE );
currentTime = GetTickCount() - src->startTime;
currentTime = get_time_ms() - src->startTime;
while (pos < msg->length)
{