mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 15:25:01 +01:00
put get_microseconds() into PBD namsepace
This implementation is a blend of the two previously in libs/ardour/globals.cc and libs/pbd/window_timer_utils.cc
This commit is contained in:
parent
a2974b0c0b
commit
9e598548f7
4 changed files with 4 additions and 118 deletions
|
|
@ -36,6 +36,7 @@
|
||||||
#include "pbd/id.h"
|
#include "pbd/id.h"
|
||||||
#include "pbd/enumwriter.h"
|
#include "pbd/enumwriter.h"
|
||||||
#include "pbd/fpu.h"
|
#include "pbd/fpu.h"
|
||||||
|
#include "pbd/microseconds.h"
|
||||||
#include "pbd/xml++.h"
|
#include "pbd/xml++.h"
|
||||||
|
|
||||||
#ifdef PLATFORM_WINDOWS
|
#ifdef PLATFORM_WINDOWS
|
||||||
|
|
@ -80,6 +81,8 @@ PBD::init ()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
microsecond_timer_init ();
|
||||||
|
|
||||||
#ifdef PLATFORM_WINDOWS
|
#ifdef PLATFORM_WINDOWS
|
||||||
// Essential!! Make sure that any files used by Ardour
|
// Essential!! Make sure that any files used by Ardour
|
||||||
// will be created or opened in BINARY mode!
|
// will be created or opened in BINARY mode!
|
||||||
|
|
|
||||||
|
|
@ -59,46 +59,6 @@ bool LIBPBD_API reset_resolution();
|
||||||
|
|
||||||
} // namespace MMTIMERS
|
} // namespace MMTIMERS
|
||||||
|
|
||||||
namespace QPC {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the QPC timer, must be called before QPC::get_microseconds will
|
|
||||||
* return a valid value.
|
|
||||||
* @return true if QPC timer is usable, use check_timer_valid to try to check
|
|
||||||
* if it is monotonic.
|
|
||||||
*/
|
|
||||||
bool LIBPBD_API initialize ();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if QueryPerformanceCounter is usable as a timer source
|
|
||||||
* This should always return true for systems > XP as those versions of windows
|
|
||||||
* have there own tests to check timer validity and will select an appropriate
|
|
||||||
* timer source. This check is not conclusive and there are probably conditions
|
|
||||||
* under which this check will return true but the timer is not monotonic.
|
|
||||||
*/
|
|
||||||
bool LIBPBD_API check_timer_valid ();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the value of the performance counter converted to microseconds
|
|
||||||
*
|
|
||||||
* If initialize returns true then get_microseconds will always return a
|
|
||||||
* positive value. If QPC is not supported(OS < XP) then -1 is returned but the
|
|
||||||
* MS docs say that this won't occur for systems >= XP.
|
|
||||||
*/
|
|
||||||
int64_t LIBPBD_API get_microseconds ();
|
|
||||||
|
|
||||||
} // namespace QPC
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The highest resolution timer source provided by the system. On Vista and
|
|
||||||
* above this is the value returned by QueryPerformanceCounter(QPC). On XP,
|
|
||||||
* this will QPC if supported or otherwise g_get_monotonic_time will be used.
|
|
||||||
*
|
|
||||||
* @return A timer value in microseconds or -1 in the event that the reading
|
|
||||||
* the timer source fails.
|
|
||||||
*/
|
|
||||||
int64_t LIBPBD_API get_microseconds ();
|
|
||||||
|
|
||||||
} // namespace PBD
|
} // namespace PBD
|
||||||
|
|
||||||
#endif // PBD_WINDOWS_TIMER_UTILS_H
|
#endif // PBD_WINDOWS_TIMER_UTILS_H
|
||||||
|
|
|
||||||
|
|
@ -111,81 +111,3 @@ reset_resolution ()
|
||||||
|
|
||||||
} // namespace MMTIMERS
|
} // namespace MMTIMERS
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
static double timer_rate_us = 0.0;
|
|
||||||
|
|
||||||
static
|
|
||||||
bool
|
|
||||||
test_qpc_validity ()
|
|
||||||
{
|
|
||||||
int64_t last_timer_val = PBD::QPC::get_microseconds ();
|
|
||||||
if (last_timer_val < 0) return false;
|
|
||||||
|
|
||||||
for (int i = 0; i < 100000; ++i) {
|
|
||||||
int64_t timer_val = PBD::QPC::get_microseconds ();
|
|
||||||
if (timer_val < 0) return false;
|
|
||||||
// try and test for non-syncronized TSC(AMD K8/etc)
|
|
||||||
if (timer_val < last_timer_val) return false;
|
|
||||||
last_timer_val = timer_val;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // anon namespace
|
|
||||||
|
|
||||||
namespace QPC {
|
|
||||||
|
|
||||||
bool
|
|
||||||
check_timer_valid ()
|
|
||||||
{
|
|
||||||
if (!timer_rate_us) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return test_qpc_validity ();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
initialize ()
|
|
||||||
{
|
|
||||||
LARGE_INTEGER freq;
|
|
||||||
if (!QueryPerformanceFrequency(&freq) || freq.QuadPart < 1) {
|
|
||||||
info << X_("Failed to determine frequency of QPC\n") << endmsg;
|
|
||||||
timer_rate_us = 0;
|
|
||||||
} else {
|
|
||||||
timer_rate_us = 1000000.0 / freq.QuadPart;
|
|
||||||
}
|
|
||||||
info << string_compose(X_("QPC timer microseconds per tick: %1\n"),
|
|
||||||
timer_rate_us) << endmsg;
|
|
||||||
return !timer_rate_us;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t
|
|
||||||
get_microseconds ()
|
|
||||||
{
|
|
||||||
LARGE_INTEGER current_val;
|
|
||||||
|
|
||||||
if (timer_rate_us) {
|
|
||||||
// MS docs say this will always succeed for systems >= XP but it may
|
|
||||||
// not return a monotonic value with non-invariant TSC's etc
|
|
||||||
if (QueryPerformanceCounter(¤t_val) != 0) {
|
|
||||||
return (int64_t)(current_val.QuadPart * timer_rate_us);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DEBUG_TIMING ("Could not get QPC timer\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace QPC
|
|
||||||
|
|
||||||
int64_t
|
|
||||||
get_microseconds ()
|
|
||||||
{
|
|
||||||
if (timer_rate_us) {
|
|
||||||
return QPC::get_microseconds ();
|
|
||||||
}
|
|
||||||
// For XP systems that don't support a high-res performance counter
|
|
||||||
return g_get_monotonic_time ();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace PBD
|
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ libpbd_sources = [
|
||||||
'localtime_r.cc',
|
'localtime_r.cc',
|
||||||
'malign.cc',
|
'malign.cc',
|
||||||
'md5.cc',
|
'md5.cc',
|
||||||
|
'microseconds.cc',
|
||||||
'mountpoint.cc',
|
'mountpoint.cc',
|
||||||
'openuri.cc',
|
'openuri.cc',
|
||||||
'pathexpand.cc',
|
'pathexpand.cc',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue