This commit is contained in:
Andrzej Kapolka 2014-04-23 12:25:43 -07:00
commit d38d3db224
24 changed files with 106 additions and 249 deletions

View file

@ -21,12 +21,10 @@
#include <string.h> #include <string.h>
#ifdef _WIN32 #ifdef _WIN32
#include "Systime.h"
#include <math.h> #include <math.h>
#else #else
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <sys/time.h>
#include <sys/socket.h> #include <sys/socket.h>
#endif //_WIN32 #endif //_WIN32
@ -389,9 +387,8 @@ void AudioMixer::run() {
nodeList->linkedDataCreateCallback = attachNewBufferToNode; nodeList->linkedDataCreateCallback = attachNewBufferToNode;
int nextFrame = 0; int nextFrame = 0;
timeval startTime; QElapsedTimer timer;
timer.start();
gettimeofday(&startTime, NULL);
char* clientMixBuffer = new char[NETWORK_BUFFER_LENGTH_BYTES_STEREO char* clientMixBuffer = new char[NETWORK_BUFFER_LENGTH_BYTES_STEREO
+ numBytesForPacketHeaderGivenPacketType(PacketTypeMixedAudio)]; + numBytesForPacketHeaderGivenPacketType(PacketTypeMixedAudio)];
@ -490,7 +487,7 @@ void AudioMixer::run() {
break; break;
} }
usecToSleep = usecTimestamp(&startTime) + (++nextFrame * BUFFER_SEND_INTERVAL_USECS) - usecTimestampNow(); usecToSleep = (++nextFrame * BUFFER_SEND_INTERVAL_USECS) - timer.nsecsElapsed() / 1000; // ns to us
if (usecToSleep > 0) { if (usecToSleep > 0) {
usleep(usecToSleep); usleep(usecToSleep);

View file

@ -17,6 +17,7 @@
#include "AssignmentClientMonitor.h" #include "AssignmentClientMonitor.h"
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
initialiseUsecTimestampNow();
#ifndef WIN32 #ifndef WIN32
setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stdout, NULL, _IOLBF, 0);

View file

@ -18,10 +18,12 @@
#include <QtCore/QCoreApplication> #include <QtCore/QCoreApplication>
#include <Logging.h> #include <Logging.h>
#include <SharedUtil.h>
#include "DomainServer.h" #include "DomainServer.h"
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
initialiseUsecTimestampNow();
#ifndef WIN32 #ifndef WIN32
setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stdout, NULL, _IOLBF, 0);

View file

@ -9,10 +9,6 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#ifdef WIN32
#include <Systime.h>
#endif
#include <sstream> #include <sstream>
#include <stdlib.h> #include <stdlib.h>
@ -134,7 +130,7 @@ QString& Application::resourcesPath() {
return staticResourcePath; return staticResourcePath;
} }
Application::Application(int& argc, char** argv, timeval &startup_time) : Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) :
QApplication(argc, argv), QApplication(argc, argv),
_window(new QMainWindow(desktop())), _window(new QMainWindow(desktop())),
_glWidget(new GLCanvas()), _glWidget(new GLCanvas()),
@ -507,7 +503,7 @@ void Application::initializeGL() {
_idleLoopStdev.reset(); _idleLoopStdev.reset();
if (_justStarted) { if (_justStarted) {
float startupTime = (usecTimestampNow() - usecTimestamp(&_applicationStartupTime)) / 1000000.0; float startupTime = (float)_applicationStartupTime.elapsed() / 1000.0;
_justStarted = false; _justStarted = false;
qDebug("Startup time: %4.2f seconds.", startupTime); qDebug("Startup time: %4.2f seconds.", startupTime);
const char LOGSTASH_INTERFACE_START_TIME_KEY[] = "interface-start-time"; const char LOGSTASH_INTERFACE_START_TIME_KEY[] = "interface-start-time";
@ -1222,7 +1218,6 @@ void Application::touchEndEvent(QTouchEvent* event) {
if (_controllerScriptingInterface.isTouchCaptured()) { if (_controllerScriptingInterface.isTouchCaptured()) {
return; return;
} }
// put any application specific touch behavior below here.. // put any application specific touch behavior below here..
_touchDragStartedAvgX = _touchAvgX; _touchDragStartedAvgX = _touchAvgX;
_touchDragStartedAvgY = _touchAvgY; _touchDragStartedAvgY = _touchAvgY;
@ -1276,21 +1271,21 @@ void Application::sendPingPackets() {
// Every second, check the frame rates and other stuff // Every second, check the frame rates and other stuff
void Application::timer() { void Application::timer() {
gettimeofday(&_timerEnd, NULL);
if (Menu::getInstance()->isOptionChecked(MenuOption::TestPing)) { if (Menu::getInstance()->isOptionChecked(MenuOption::TestPing)) {
sendPingPackets(); sendPingPackets();
} }
float diffTime = (float)_timerStart.nsecsElapsed() / 1000000000.0f;
_fps = (float)_frameCount / ((float)diffclock(&_timerStart, &_timerEnd) / 1000.f); _fps = (float)_frameCount / diffTime;
_packetsPerSecond = (float) _datagramProcessor.getPacketCount() / ((float)diffclock(&_timerStart, &_timerEnd) / 1000.f); _packetsPerSecond = (float) _datagramProcessor.getPacketCount() / diffTime;
_bytesPerSecond = (float) _datagramProcessor.getByteCount() / ((float)diffclock(&_timerStart, &_timerEnd) / 1000.f); _bytesPerSecond = (float) _datagramProcessor.getByteCount() / diffTime;
_frameCount = 0; _frameCount = 0;
_datagramProcessor.resetCounters(); _datagramProcessor.resetCounters();
gettimeofday(&_timerStart, NULL); _timerStart.start();
// ask the node list to check in with the domain server // ask the node list to check in with the domain server
NodeList::getInstance()->sendDomainServerCheckIn(); NodeList::getInstance()->sendDomainServerCheckIn();
@ -1303,13 +1298,11 @@ void Application::idle() {
bool showWarnings = getLogger()->extraDebugging(); bool showWarnings = getLogger()->extraDebugging();
PerformanceWarning warn(showWarnings, "Application::idle()"); PerformanceWarning warn(showWarnings, "Application::idle()");
timeval check;
gettimeofday(&check, NULL);
// Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time we ran // Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time we ran
double timeSinceLastUpdate = diffclock(&_lastTimeUpdated, &check); double timeSinceLastUpdate = (double)_lastTimeUpdated.nsecsElapsed() / 1000000.0;
if (timeSinceLastUpdate > IDLE_SIMULATE_MSECS) { if (timeSinceLastUpdate > IDLE_SIMULATE_MSECS) {
_lastTimeUpdated.start();
{ {
PerformanceWarning warn(showWarnings, "Application::idle()... update()"); PerformanceWarning warn(showWarnings, "Application::idle()... update()");
const float BIGGEST_DELTA_TIME_SECS = 0.25f; const float BIGGEST_DELTA_TIME_SECS = 0.25f;
@ -1321,7 +1314,6 @@ void Application::idle() {
} }
{ {
PerformanceWarning warn(showWarnings, "Application::idle()... rest of it"); PerformanceWarning warn(showWarnings, "Application::idle()... rest of it");
_lastTimeUpdated = check;
_idleLoopStdev.addValue(timeSinceLastUpdate); _idleLoopStdev.addValue(timeSinceLastUpdate);
// Record standard deviation and reset counter if needed // Record standard deviation and reset counter if needed
@ -1637,8 +1629,8 @@ void Application::init() {
Qt::QueuedConnection); Qt::QueuedConnection);
} }
gettimeofday(&_timerStart, NULL); _timerStart.start();
gettimeofday(&_lastTimeUpdated, NULL); _lastTimeUpdated.start();
Menu::getInstance()->loadSettings(); Menu::getInstance()->loadSettings();
if (Menu::getInstance()->getAudioJitterBufferSamples() != 0) { if (Menu::getInstance()->getAudioJitterBufferSamples() != 0) {

View file

@ -117,7 +117,7 @@ public:
static Application* getInstance() { return static_cast<Application*>(QCoreApplication::instance()); } static Application* getInstance() { return static_cast<Application*>(QCoreApplication::instance()); }
static QString& resourcesPath(); static QString& resourcesPath();
Application(int& argc, char** argv, timeval &startup_time); Application(int& argc, char** argv, QElapsedTimer &startup_time);
~Application(); ~Application();
void restoreSizeAndPosition(); void restoreSizeAndPosition();
@ -392,9 +392,9 @@ private:
int _frameCount; int _frameCount;
float _fps; float _fps;
timeval _applicationStartupTime; QElapsedTimer _applicationStartupTime;
timeval _timerStart, _timerEnd; QElapsedTimer _timerStart;
timeval _lastTimeUpdated; QElapsedTimer _lastTimeUpdated;
bool _justStarted; bool _justStarted;
Stars _stars; Stars _stars;

View file

@ -643,13 +643,12 @@ void Audio::handleAudioInput() {
void Audio::addReceivedAudioToBuffer(const QByteArray& audioByteArray) { void Audio::addReceivedAudioToBuffer(const QByteArray& audioByteArray) {
const int NUM_INITIAL_PACKETS_DISCARD = 3; const int NUM_INITIAL_PACKETS_DISCARD = 3;
const int STANDARD_DEVIATION_SAMPLE_COUNT = 500; const int STANDARD_DEVIATION_SAMPLE_COUNT = 500;
timeval currentReceiveTime; _timeSinceLastRecieved.start();
gettimeofday(&currentReceiveTime, NULL);
_totalPacketsReceived++; _totalPacketsReceived++;
double timeDiff = diffclock(&_lastReceiveTime, &currentReceiveTime); double timeDiff = (double)_timeSinceLastRecieved.nsecsElapsed() / 1000000.0; // ns to ms
// Discard first few received packets for computing jitter (often they pile up on start) // Discard first few received packets for computing jitter (often they pile up on start)
if (_totalPacketsReceived > NUM_INITIAL_PACKETS_DISCARD) { if (_totalPacketsReceived > NUM_INITIAL_PACKETS_DISCARD) {
_stdev.addValue(timeDiff); _stdev.addValue(timeDiff);
@ -673,8 +672,6 @@ void Audio::addReceivedAudioToBuffer(const QByteArray& audioByteArray) {
} }
Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::AUDIO).updateValue(audioByteArray.size()); Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::AUDIO).updateValue(audioByteArray.size());
_lastReceiveTime = currentReceiveTime;
} }
// NOTE: numSamples is the total number of single channel samples, since callers will always call this with stereo // NOTE: numSamples is the total number of single channel samples, since callers will always call this with stereo
@ -1271,13 +1268,13 @@ bool Audio::switchOutputToAudioDevice(const QAudioDeviceInfo& outputDeviceInfo)
// setup a procedural audio output device // setup a procedural audio output device
_proceduralAudioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this); _proceduralAudioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this);
gettimeofday(&_lastReceiveTime, NULL); _timeSinceLastRecieved.start();
// setup spatial audio ringbuffer // setup spatial audio ringbuffer
int numFrameSamples = _outputFormat.sampleRate() * _desiredOutputFormat.channelCount(); int numFrameSamples = _outputFormat.sampleRate() * _desiredOutputFormat.channelCount();
_spatialAudioRingBuffer.resizeForFrameSize(numFrameSamples); _spatialAudioRingBuffer.resizeForFrameSize(numFrameSamples);
_spatialAudioStart = _spatialAudioFinish = 0; _spatialAudioStart = _spatialAudioFinish = 0;
supportedFormat = true; supportedFormat = true;
} }
} }

View file

@ -12,10 +12,6 @@
#ifndef hifi_Audio_h #ifndef hifi_Audio_h
#define hifi_Audio_h #define hifi_Audio_h
#ifdef _WIN32
#include <Systime.h>
#endif
#include <fstream> #include <fstream>
#include <vector> #include <vector>
@ -23,6 +19,7 @@
#include <QAudio> #include <QAudio>
#include <QAudioInput> #include <QAudioInput>
#include <QElapsedTimer>
#include <QGLWidget> #include <QGLWidget>
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QVector> #include <QtCore/QVector>
@ -132,7 +129,7 @@ private:
QString _outputAudioDeviceName; QString _outputAudioDeviceName;
StDev _stdev; StDev _stdev;
timeval _lastReceiveTime; QElapsedTimer _timeSinceLastRecieved;
float _averagedLatency; float _averagedLatency;
float _measuredJitter; float _measuredJitter;
int16_t _jitterBufferSamples; int16_t _jitterBufferSamples;

View file

@ -172,14 +172,6 @@ void renderWorldBox() {
} }
double diffclock(timeval *clock1,timeval *clock2)
{
double diffms = (clock2->tv_sec - clock1->tv_sec) * 1000.0;
diffms += (clock2->tv_usec - clock1->tv_usec) / 1000.0; // us to ms
return diffms;
}
// Return a random vector of average length 1 // Return a random vector of average length 1
const glm::vec3 randVector() { const glm::vec3 randVector() {
return glm::vec3(randFloat() - 0.5f, randFloat() - 0.5f, randFloat() - 0.5f) * 2.f; return glm::vec3(randFloat() - 0.5f, randFloat() - 0.5f, randFloat() - 0.5f) * 2.f;
@ -411,69 +403,63 @@ void runTimingTests() {
int iResults[numTests]; int iResults[numTests];
float fTest = 1.0; float fTest = 1.0;
float fResults[numTests]; float fResults[numTests];
timeval startTime, endTime; QElapsedTimer startTime;
float elapsedMsecs; startTime.start();
gettimeofday(&startTime, NULL); float elapsedUsecs;
for (int i = 1; i < numTests; i++) {
gettimeofday(&endTime, NULL); float NSEC_TO_USEC = 1.0f / 1000.0f;
} elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC;
elapsedMsecs = diffclock(&startTime, &endTime); qDebug("QElapsedTimer::nsecElapsed() usecs: %f", elapsedUsecs / (float) numTests);
qDebug("gettimeofday() usecs: %f", 1000.0f * elapsedMsecs / (float) numTests);
// Random number generation // Random number generation
gettimeofday(&startTime, NULL); startTime.start();
for (int i = 1; i < numTests; i++) { for (int i = 1; i < numTests; i++) {
iResults[i] = rand(); iResults[i] = rand();
} }
gettimeofday(&endTime, NULL); elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC;
elapsedMsecs = diffclock(&startTime, &endTime); qDebug("rand() stored in array usecs: %f, first result:%d", elapsedUsecs / (float) numTests, iResults[0]);
qDebug("rand() stored in array usecs: %f, first result:%d", 1000.0f * elapsedMsecs / (float) numTests, iResults[0]);
// Random number generation using randFloat() // Random number generation using randFloat()
gettimeofday(&startTime, NULL); startTime.start();
for (int i = 1; i < numTests; i++) { for (int i = 1; i < numTests; i++) {
fResults[i] = randFloat(); fResults[i] = randFloat();
} }
gettimeofday(&endTime, NULL); elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC;
elapsedMsecs = diffclock(&startTime, &endTime); qDebug("randFloat() stored in array usecs: %f, first result: %f", elapsedUsecs / (float) numTests, fResults[0]);
qDebug("randFloat() stored in array usecs: %f, first result: %f", 1000.0f * elapsedMsecs / (float) numTests, fResults[0]);
// PowF function // PowF function
fTest = 1145323.2342f; fTest = 1145323.2342f;
gettimeofday(&startTime, NULL); startTime.start();
for (int i = 1; i < numTests; i++) { for (int i = 1; i < numTests; i++) {
fTest = powf(fTest, 0.5f); fTest = powf(fTest, 0.5f);
} }
gettimeofday(&endTime, NULL); elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC;
elapsedMsecs = diffclock(&startTime, &endTime); qDebug("powf(f, 0.5) usecs: %f", elapsedUsecs / (float) numTests);
qDebug("powf(f, 0.5) usecs: %f", 1000.0f * elapsedMsecs / (float) numTests);
// Vector Math // Vector Math
float distance; float distance;
glm::vec3 pointA(randVector()), pointB(randVector()); glm::vec3 pointA(randVector()), pointB(randVector());
gettimeofday(&startTime, NULL); startTime.start();
for (int i = 1; i < numTests; i++) { for (int i = 1; i < numTests; i++) {
//glm::vec3 temp = pointA - pointB; //glm::vec3 temp = pointA - pointB;
//float distanceSquared = glm::dot(temp, temp); //float distanceSquared = glm::dot(temp, temp);
distance = glm::distance(pointA, pointB); distance = glm::distance(pointA, pointB);
} }
gettimeofday(&endTime, NULL); elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC;
elapsedMsecs = diffclock(&startTime, &endTime); qDebug("vector math usecs: %f [%f usecs total for %d tests], last result:%f",
qDebug("vector math usecs: %f [%f msecs total for %d tests], last result:%f", elapsedUsecs / (float) numTests, elapsedUsecs, numTests, distance);
1000.0f * elapsedMsecs / (float) numTests, elapsedMsecs, numTests, distance);
// Vec3 test // Vec3 test
glm::vec3 vecA(randVector()), vecB(randVector()); glm::vec3 vecA(randVector()), vecB(randVector());
float result; float result;
gettimeofday(&startTime, NULL); startTime.start();
for (int i = 1; i < numTests; i++) { for (int i = 1; i < numTests; i++) {
glm::vec3 temp = vecA-vecB; glm::vec3 temp = vecA-vecB;
result = glm::dot(temp,temp); result = glm::dot(temp,temp);
} }
gettimeofday(&endTime, NULL); elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC;
elapsedMsecs = diffclock(&startTime, &endTime); qDebug("vec3 assign and dot() usecs: %f, last result:%f", elapsedUsecs / (float) numTests, result);
qDebug("vec3 assign and dot() usecs: %f, last result:%f", 1000.0f * elapsedMsecs / (float) numTests, result);
} }
float loadSetting(QSettings* settings, const char* name, float defaultValue) { float loadSetting(QSettings* settings, const char* name, float defaultValue) {

View file

@ -12,12 +12,6 @@
#ifndef hifi_Util_h #ifndef hifi_Util_h
#define hifi_Util_h #define hifi_Util_h
#ifdef _WIN32
#include "Systime.h"
#else
#include <sys/time.h>
#endif
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <glm/gtc/quaternion.hpp> #include <glm/gtc/quaternion.hpp>
#include <QSettings> #include <QSettings>
@ -44,8 +38,6 @@ void drawVector(glm::vec3* vector);
void printVector(glm::vec3 vec); void printVector(glm::vec3 vec);
double diffclock(timeval *clock1,timeval *clock2);
void renderCollisionOverlay(int width, int height, float magnitude, float red = 0, float blue = 0, float green = 0); void renderCollisionOverlay(int width, int height, float magnitude, float red = 0, float blue = 0, float green = 0);
void renderOrientationDirections( glm::vec3 position, const glm::quat& orientation, float size ); void renderOrientationDirections( glm::vec3 position, const glm::quat& orientation, float size );

View file

@ -11,10 +11,6 @@
#include "InterfaceConfig.h" #include "InterfaceConfig.h"
#ifdef WIN32
#include <Systime.h>
#endif
#include <QOpenGLFramebufferObject> #include <QOpenGLFramebufferObject>
#include <glm/glm.hpp> #include <glm/glm.hpp>

View file

@ -15,11 +15,6 @@
#include <glm/glm.hpp> #include <glm/glm.hpp>
#ifdef WIN32
#include <Systime.h>
#endif
#include "Application.h" #include "Application.h"
#include "TV3DManager.h" #include "TV3DManager.h"

View file

@ -16,8 +16,9 @@
#include <SharedUtil.h> #include <SharedUtil.h>
int main(int argc, const char * argv[]) { int main(int argc, const char * argv[]) {
timeval startup_time; initialiseUsecTimestampNow();
gettimeofday(&startup_time, NULL); QElapsedTimer startupTime;
startupTime.start();
// Debug option to demonstrate that the client's local time does not // Debug option to demonstrate that the client's local time does not
// need to be in sync with any other network node. This forces clock // need to be in sync with any other network node. This forces clock
@ -33,7 +34,7 @@ int main(int argc, const char * argv[]) {
int exitCode; int exitCode;
{ {
QSettings::setDefaultFormat(QSettings::IniFormat); QSettings::setDefaultFormat(QSettings::IniFormat);
Application app(argc, const_cast<char**>(argv), startup_time); Application app(argc, const_cast<char**>(argv), startupTime);
QTranslator translator; QTranslator translator;
translator.load("interface_en"); translator.load("interface_en");

View file

@ -9,24 +9,23 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#ifdef _WIN32 #include <QElapsedTimer>
#include <Systime.h>
#endif
#include "starfield/Controller.h" #include "starfield/Controller.h"
using namespace starfield; using namespace starfield;
bool Controller::computeStars(unsigned numStars, unsigned seed) { bool Controller::computeStars(unsigned numStars, unsigned seed) {
timeval startTime; QElapsedTimer startTime;
gettimeofday(&startTime, NULL); startTime.start();
Generator::computeStarPositions(_inputSequence, numStars, seed); Generator::computeStarPositions(_inputSequence, numStars, seed);
this->retile(numStars, _tileResolution); this->retile(numStars, _tileResolution);
qDebug() << "Total time to retile and generate stars: " double NSEC_TO_MSEC = 1.0 / 1000000.0;
<< ((usecTimestampNow() - usecTimestamp(&startTime)) / 1000) << "msec"; double timeDiff = (double)startTime.nsecsElapsed() * NSEC_TO_MSEC;
qDebug() << "Total time to retile and generate stars: " << timeDiff << "msec";
return true; return true;
} }

View file

@ -9,9 +9,7 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#ifdef _WIN32 #include <QElapsedTimer>
#include <Systime.h>
#endif
#include "starfield/Generator.h" #include "starfield/Generator.h"
@ -24,8 +22,8 @@ void Generator::computeStarPositions(InputVertices& destination, unsigned limit,
InputVertices* vertices = & destination; InputVertices* vertices = & destination;
//_limit = limit; //_limit = limit;
timeval startTime; QElapsedTimer startTime;
gettimeofday(&startTime, NULL); startTime.start();
srand(seed); srand(seed);
@ -70,7 +68,8 @@ void Generator::computeStarPositions(InputVertices& destination, unsigned limit,
vertices->push_back(InputVertex(azimuth, altitude, computeStarColor(STAR_COLORIZATION))); vertices->push_back(InputVertex(azimuth, altitude, computeStarColor(STAR_COLORIZATION)));
} }
qDebug() << "Total time to generate stars: " << ((usecTimestampNow() - usecTimestamp(&startTime)) / 1000) << " msec"; double timeDiff = (double)startTime.nsecsElapsed() / 1000000.0; // ns to ms
qDebug() << "Total time to generate stars: " << timeDiff << " msec";
} }
// computeStarColor // computeStarColor

View file

@ -62,26 +62,21 @@ BandwidthMeter::~BandwidthMeter() {
free(_channels); free(_channels);
} }
BandwidthMeter::Stream::Stream(float msToAverage) : BandwidthMeter::Stream::Stream(float msToAverage) : _value(0.0f), _msToAverage(msToAverage) {
_value(0.0f), _prevTime.start();
_msToAverage(msToAverage) {
gettimeofday(& _prevTime, NULL);
} }
void BandwidthMeter::Stream::updateValue(double amount) { void BandwidthMeter::Stream::updateValue(double amount) {
// Determine elapsed time // Determine elapsed time
timeval now; double dt = (double)_prevTime.nsecsElapsed() / 1000000.0; // ns to ms
gettimeofday(& now, NULL);
double dt = diffclock(& _prevTime, & now);
// Ignore this value when timer imprecision yields dt = 0 // Ignore this value when timer imprecision yields dt = 0
if (dt == 0.0) { if (dt == 0.0) {
return; return;
} }
memcpy(& _prevTime, & now, sizeof(timeval)); _prevTime.start();
// Compute approximate average // Compute approximate average
_value = glm::mix(_value, amount / dt, _value = glm::mix(_value, amount / dt,

View file

@ -12,9 +12,7 @@
#ifndef hifi_BandwidthMeter_h #ifndef hifi_BandwidthMeter_h
#define hifi_BandwidthMeter_h #define hifi_BandwidthMeter_h
#ifdef _WIN32 #include <QElapsedTimer>
#include <Systime.h>
#endif
#include <glm/glm.hpp> #include <glm/glm.hpp>
@ -59,7 +57,7 @@ public:
private: private:
double _value; // Current value. double _value; // Current value.
double _msToAverage; // Milliseconds to average. double _msToAverage; // Milliseconds to average.
timeval _prevTime; // Time of last feed. QElapsedTimer _prevTime; // Time of last feed.
}; };
// Data model accessors // Data model accessors

View file

@ -71,8 +71,8 @@ void AudioInjector::injectAudio() {
quint8 volume = MAX_INJECTOR_VOLUME * _options.getVolume(); quint8 volume = MAX_INJECTOR_VOLUME * _options.getVolume();
packetStream << volume; packetStream << volume;
timeval startTime = {}; QElapsedTimer timer;
gettimeofday(&startTime, NULL); timer.start();
int nextFrame = 0; int nextFrame = 0;
int currentSendPosition = 0; int currentSendPosition = 0;
@ -104,7 +104,7 @@ void AudioInjector::injectAudio() {
if (currentSendPosition != bytesToCopy && currentSendPosition < soundByteArray.size()) { if (currentSendPosition != bytesToCopy && currentSendPosition < soundByteArray.size()) {
// not the first packet and not done // not the first packet and not done
// sleep for the appropriate time // sleep for the appropriate time
int usecToSleep = usecTimestamp(&startTime) + (++nextFrame * BUFFER_SEND_INTERVAL_USECS) - usecTimestampNow(); int usecToSleep = (++nextFrame * BUFFER_SEND_INTERVAL_USECS) - timer.nsecsElapsed() / 1000;
if (usecToSleep > 0) { if (usecToSleep > 0) {
usleep(usecToSleep); usleep(usecToSleep);

View file

@ -12,12 +12,6 @@
#ifndef hifi_Assignment_h #ifndef hifi_Assignment_h
#define hifi_Assignment_h #define hifi_Assignment_h
#ifdef _WIN32
#include "Systime.h"
#else
#include <sys/time.h>
#endif
#include <QtCore/QUuid> #include <QtCore/QUuid>
#include "NodeList.h" #include "NodeList.h"

View file

@ -286,8 +286,8 @@ void ScriptEngine::run() {
emit errorMessage("Uncaught exception at line" + QString::number(line) + ":" + result.toString()); emit errorMessage("Uncaught exception at line" + QString::number(line) + ":" + result.toString());
} }
timeval startTime; QElapsedTimer startTime;
gettimeofday(&startTime, NULL); startTime.start();
int thisFrame = 0; int thisFrame = 0;
@ -296,7 +296,7 @@ void ScriptEngine::run() {
qint64 lastUpdate = usecTimestampNow(); qint64 lastUpdate = usecTimestampNow();
while (!_isFinished) { while (!_isFinished) {
int usecToSleep = usecTimestamp(&startTime) + (thisFrame++ * SCRIPT_DATA_CALLBACK_USECS) - usecTimestampNow(); int usecToSleep = (thisFrame++ * SCRIPT_DATA_CALLBACK_USECS) - startTime.nsecsElapsed() / 1000; // nsec to usec
if (usecToSleep > 0) { if (usecToSleep > 0) {
usleep(usecToSleep); usleep(usecToSleep);
} }
@ -561,4 +561,4 @@ void ScriptEngine::include(const QString& includeFile) {
qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString(); qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString();
emit errorMessage("Uncaught exception at (" + includeFile + ") line" + QString::number(line) + ":" + result.toString()); emit errorMessage("Uncaught exception at (" + includeFile + ") line" + QString::number(line) + ":" + result.toString());
} }
} }

View file

@ -18,12 +18,6 @@
#include <stdint.h> #include <stdint.h>
#include "SharedUtil.h" #include "SharedUtil.h"
#ifdef _WIN32
#include "Systime.h"
#else
#include <sys/time.h>
#endif
#include <cstring> #include <cstring>
#include <string> #include <string>
#include <map> #include <map>

View file

@ -15,28 +15,44 @@
#include <cctype> #include <cctype>
#include <time.h> #include <time.h>
#ifdef _WIN32
#include <windows.h>
#endif
#ifdef __APPLE__ #ifdef __APPLE__
#include <CoreFoundation/CoreFoundation.h> #include <CoreFoundation/CoreFoundation.h>
#endif #endif
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QDateTime>
#include <QElapsedTimer>
#include "OctalCode.h" #include "OctalCode.h"
#include "SharedUtil.h" #include "SharedUtil.h"
quint64 usecTimestamp(const timeval *time) {
return (time->tv_sec * 1000000 + time->tv_usec); static qint64 TIME_REFERENCE = 0; // in usec
static QElapsedTimer timestampTimer;
static int usecTimestampNowAdjust = 0; // in usec
void initialiseUsecTimestampNow() {
static bool initialised = false;
if (initialised) {
qDebug() << "[WARNING] Double initialisation of usecTimestampNow().";
return;
}
TIME_REFERENCE = QDateTime::currentMSecsSinceEpoch() * 1000; // ms to usec
initialised = true;
} }
int usecTimestampNowAdjust = 0;
void usecTimestampNowForceClockSkew(int clockSkew) { void usecTimestampNowForceClockSkew(int clockSkew) {
::usecTimestampNowAdjust = clockSkew; ::usecTimestampNowAdjust = clockSkew;
} }
quint64 usecTimestampNow() { quint64 usecTimestampNow() {
timeval now; // usec nsec to usec usec
gettimeofday(&now, NULL); return TIME_REFERENCE + timestampTimer.nsecsElapsed() / 1000 + ::usecTimestampNowAdjust;
return (now.tv_sec * 1000000 + now.tv_usec) + ::usecTimestampNowAdjust;
} }
float randFloat() { float randFloat() {

View file

@ -24,12 +24,6 @@
#include <QtCore/QDebug> #include <QtCore/QDebug>
#ifdef _WIN32
#include "Systime.h"
#else
#include <sys/time.h>
#endif
const int BYTES_PER_COLOR = 3; const int BYTES_PER_COLOR = 3;
const int BYTES_PER_FLAGS = 1; const int BYTES_PER_FLAGS = 1;
typedef unsigned char rgbColor[BYTES_PER_COLOR]; typedef unsigned char rgbColor[BYTES_PER_COLOR];
@ -66,7 +60,7 @@ static const quint64 USECS_PER_SECOND = USECS_PER_MSEC * MSECS_PER_SECOND;
const int BITS_IN_BYTE = 8; const int BITS_IN_BYTE = 8;
quint64 usecTimestamp(const timeval *time); void initialiseUsecTimestampNow();
quint64 usecTimestampNow(); quint64 usecTimestampNow();
void usecTimestampNowForceClockSkew(int clockSkew); void usecTimestampNowForceClockSkew(int clockSkew);

View file

@ -1,61 +0,0 @@
//
// Systime.cpp
// libraries/shared/src
//
// Copyright 2013 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#ifdef WIN32
#include "Systime.h"
/**
* gettimeofday
* Implementation according to:
* The Open Group Base Specifications Issue 6
* IEEE Std 1003.1, 2004 Edition
*/
/**
* THIS SOFTWARE IS NOT COPYRIGHTED
*
* This source code is offered for use in the public domain. You may
* use, modify or distribute it freely.
*
* This code is distributed in the hope that it will be useful but
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
* DISCLAIMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Contributed by:
* Danny Smith <dannysmith@users.sourceforge.net>
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
/** Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */
#define _W32_FT_OFFSET (116444736000000000ULL)
int gettimeofday(timeval* p_tv, timezone* p_tz) {
union {
unsigned long long ns100; /**time since 1 Jan 1601 in 100ns units */
FILETIME ft;
} _now;
if (p_tv) {
GetSystemTimeAsFileTime (&_now.ft);
p_tv->tv_usec=(long)((_now.ns100 / 10ULL) % 1000000ULL );
p_tv->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000ULL);
}
/** Always return 0 as per Open Group Base Specifications Issue 6.
Do not set errno on error. */
return 0;
}
#endif

View file

@ -1,27 +0,0 @@
//
// Systime.h
// libraries/shared/src
//
// Copyright 2013 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#ifndef hifi_Systime_h
#define hifi_Systime_h
#ifdef WIN32
#include <winsock2.h>
struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of dst correction */
};
int gettimeofday(struct timeval* p_tv, struct timezone* p_tz);
#endif
#endif // hifi_Systime_h