[PATCH 1/6] winecoreaudio: Introduce a helper to retrieve the time.

Andrew Eikum aeikum at codeweavers.com
Wed Dec 1 08:45:24 CST 2021


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Tue, Nov 30, 2021 at 07:56:28AM +0000, Huw Davies wrote:
> 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 at codeweavers.com>
> ---
>  dlls/winecoreaudio.drv/coremidi.c | 12 ++++++++++--
>  dlls/winecoreaudio.drv/midi.c     | 13 +++++++++++--
>  2 files changed, 21 insertions(+), 4 deletions(-)
> 
> diff --git a/dlls/winecoreaudio.drv/coremidi.c b/dlls/winecoreaudio.drv/coremidi.c
> index 9dc9f452c29..2e92d9ac2cb 100644
> --- a/dlls/winecoreaudio.drv/coremidi.c
> +++ b/dlls/winecoreaudio.drv/coremidi.c
> @@ -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;
> diff --git a/dlls/winecoreaudio.drv/midi.c b/dlls/winecoreaudio.drv/midi.c
> index dcb9a7e1b69..b3adb09886d 100644
> --- a/dlls/winecoreaudio.drv/midi.c
> +++ b/dlls/winecoreaudio.drv/midi.c
> @@ -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)
>              {
> -- 
> 2.23.0
> 
> 



More information about the wine-devel mailing list