diff --git a/BUILD_WIN.md b/BUILD_WIN.md index 671fed5a97..25e20952ca 100644 --- a/BUILD_WIN.md +++ b/BUILD_WIN.md @@ -98,3 +98,7 @@ If you need to debug Interface, you can run interface from within Visual Studio * In the Solution Explorer, right click interface and click Set as StartUp Project * Set the "Working Directory" for the Interface debugging sessions to the Debug output directory so that your application can load resources. Do this: right click interface and click Properties, choose Debugging from Configuration Properties, set Working Directory to .\Debug * Now you can run and debug interface through Visual Studio + +For better performance when running debug builds, set the environment variable ```_NO_DEBUG_HEAP``` to ```1``` + +http://preshing.com/20110717/the-windows-heap-is-slow-when-launched-from-the-debugger/ diff --git a/examples/libraries/entitySelectionTool.js b/examples/libraries/entitySelectionTool.js index 94ffb48a71..c1675ef044 100644 --- a/examples/libraries/entitySelectionTool.js +++ b/examples/libraries/entitySelectionTool.js @@ -1515,7 +1515,6 @@ SelectionDisplay = (function() { } that.updateRotationHandles(); - that.highlightSelectable(); var rotation, dimensions, position, registrationPoint; diff --git a/libraries/audio/src/AudioEditBuffer.h b/libraries/audio/src/AudioEditBuffer.h deleted file mode 100644 index 66639f20bb..0000000000 --- a/libraries/audio/src/AudioEditBuffer.h +++ /dev/null @@ -1,112 +0,0 @@ -// -// AudioEditBuffer.h -// hifi -// -// Created by Craig Hansen-Sturm on 8/29/14. -// Copyright 2014 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_AudioEditBuffer_h -#define hifi_AudioEditBuffer_h - -template< typename T > -class AudioEditBuffer : public AudioFrameBuffer { - -public: - - AudioEditBuffer(); - AudioEditBuffer(const uint32_t channelCount, const uint32_t frameCount); - ~AudioEditBuffer(); - - bool getZeroCrossing(uint32_t start, bool direction, float32_t epsilon, uint32_t& zero); - - void linearFade(uint32_t start, uint32_t stop, bool increasing); - void exponentialFade(uint32_t start, uint32_t stop, bool increasing); -}; - -template< typename T > -AudioEditBuffer::AudioEditBuffer() : - AudioFrameBuffer() { -} - -template< typename T > -AudioEditBuffer::AudioEditBuffer(const uint32_t channelCount, const uint32_t frameCount) : - AudioFrameBuffer(channelCount, frameCount) { -} - -template< typename T > - AudioEditBuffer::~AudioEditBuffer() { -} - -template< typename T > -inline bool AudioEditBuffer::getZeroCrossing(uint32_t start, bool direction, float32_t epsilon, uint32_t& zero) { - - zero = this->_frameCount; - - if (direction) { // scan from the left - if (start < this->_frameCount) { - for (uint32_t i = start; i < this->_frameCount; ++i) { - for (uint32_t j = 0; j < this->_channelCount; ++j) { - if (this->_frameBuffer[j][i] >= -epsilon && this->_frameBuffer[j][i] <= epsilon) { - zero = i; - return true; - } - } - } - } - } else { // scan from the right - if (start != 0 && start < this->_frameCount) { - for (uint32_t i = start; i != 0; --i) { - for (uint32_t j = 0; j < this->_channelCount; ++j) { - if (this->_frameBuffer[j][i] >= -epsilon && this->_frameBuffer[j][i] <= epsilon) { - zero = i; - return true; - } - } - } - } - } - - return false; -} - -template< typename T > -inline void AudioEditBuffer::linearFade(uint32_t start, uint32_t stop, bool increasing) { - - if (start >= stop || start > this->_frameCount || stop > this->_frameCount ) { - return; - } - - uint32_t count = stop - start; - float32_t delta; - float32_t gain; - - if (increasing) { // 0.0 to 1.0f in delta increments - delta = 1.0f / (float32_t)count; - gain = 0.0f; - } else { // 1.0f to 0.0f in delta increments - delta = -1.0f / (float32_t)count; - gain = 1.0f; - } - - for (uint32_t i = start; i < stop; ++i) { - for (uint32_t j = 0; j < this->_channelCount; ++j) { - this->_frameBuffer[j][i] *= gain; - } - gain += delta; - } -} - -template< typename T > -inline void AudioEditBuffer::exponentialFade(uint32_t start, uint32_t stop, bool increasing) { - // TBD -} - -typedef AudioEditBuffer< float32_t > AudioEditBufferFloat32; -typedef AudioEditBuffer< int32_t > AudioEditBufferSInt32; - -#endif // hifi_AudioEditBuffer_h - diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 217b8b0d53..8eb032f8a8 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -295,7 +295,14 @@ int64_t AudioInjector::injectNextFrame() { if (audioMixer) { // send off this audio packet - nodeList->sendUnreliablePacket(*_currentPacket, *audioMixer); + auto bytesWritten = nodeList->sendUnreliablePacket(*_currentPacket, *audioMixer); + if (bytesWritten < 0) { + auto currentTime = _frameTimer->nsecsElapsed() / 1000; + qDebug() << this << "error sending audio injector packet. NF:" + << _nextFrame << "CT:" << currentTime + << "CF:" << currentTime / AudioConstants::NETWORK_FRAME_USECS; + } + _outgoingSequenceNumber++; } diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index 12f63e0a12..ff80ba08a9 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -26,7 +26,6 @@ #include "AudioRingBuffer.h" #include "AudioFormat.h" #include "AudioBuffer.h" -#include "AudioEditBuffer.h" #include "AudioLogging.h" #include "Sound.h" @@ -69,7 +68,6 @@ void Sound::downloadFinished(const QByteArray& data) { interpretAsWav(rawAudioByteArray, outputAudioByteArray); downSample(outputAudioByteArray); - trimFrames(); } else if (fileName.endsWith(RAW_EXTENSION)) { // check if this was a stereo raw file // since it's raw the only way for us to know that is if the file was called .stereo.raw @@ -80,7 +78,6 @@ void Sound::downloadFinished(const QByteArray& data) { // Process as RAW file downSample(rawAudioByteArray); - trimFrames(); } else { qCDebug(audio) << "Unknown sound file type"; } @@ -98,11 +95,23 @@ void Sound::downSample(const QByteArray& rawAudioByteArray) { int numSourceSamples = rawAudioByteArray.size() / sizeof(AudioConstants::AudioSample); - int numDestinationBytes = rawAudioByteArray.size() / sizeof(AudioConstants::AudioSample); - if (_isStereo && numSourceSamples % 2 != 0) { - numDestinationBytes += sizeof(AudioConstants::AudioSample); + if (_isStereo && numSourceSamples % 2 != 0){ + // in the unlikely case that we have stereo audio but we seem to be missing a sample + // (the sample for one channel is missing in a set of interleaved samples) + // then drop the odd sample + --numSourceSamples; } + int numDestinationSamples = numSourceSamples / 2.0f; + + if (_isStereo && numDestinationSamples % 2 != 0) { + // if this is stereo we need to make sure we produce stereo output + // which means we should have an even number of output samples + numDestinationSamples += 1; + } + + int numDestinationBytes = numDestinationSamples * sizeof(AudioConstants::AudioSample); + _byteArray.resize(numDestinationBytes); int16_t* sourceSamples = (int16_t*) rawAudioByteArray.data(); @@ -129,26 +138,6 @@ void Sound::downSample(const QByteArray& rawAudioByteArray) { } } -void Sound::trimFrames() { - - const uint32_t inputFrameCount = _byteArray.size() / sizeof(int16_t); - const uint32_t trimCount = 1024; // number of leading and trailing frames to trim - - if (inputFrameCount <= (2 * trimCount)) { - return; - } - - int16_t* inputFrameData = (int16_t*)_byteArray.data(); - - AudioEditBufferFloat32 editBuffer(1, inputFrameCount); - editBuffer.copyFrames(1, inputFrameCount, inputFrameData, false /*copy in*/); - - editBuffer.linearFade(0, trimCount, true); - editBuffer.linearFade(inputFrameCount - trimCount, inputFrameCount, false); - - editBuffer.copyFrames(1, inputFrameCount, inputFrameData, true /*copy out*/); -} - // // Format description from https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ // diff --git a/libraries/audio/src/Sound.h b/libraries/audio/src/Sound.h index 91dbef8c6a..6baf691957 100644 --- a/libraries/audio/src/Sound.h +++ b/libraries/audio/src/Sound.h @@ -38,7 +38,6 @@ private: bool _isStereo; bool _isReady; - void trimFrames(); void downSample(const QByteArray& rawAudioByteArray); void interpretAsWav(const QByteArray& inputAudioByteArray, QByteArray& outputAudioByteArray); diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 24314e807d..99dff84407 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -763,7 +763,7 @@ void EntityItem::adjustEditPacketForClockSkew(QByteArray& buffer, int clockSkew) // lastEdited quint64 lastEditedInLocalTime; memcpy(&lastEditedInLocalTime, dataAt, sizeof(lastEditedInLocalTime)); - quint64 lastEditedInServerTime = lastEditedInLocalTime + clockSkew; + quint64 lastEditedInServerTime = lastEditedInLocalTime > 0 ? lastEditedInLocalTime + clockSkew : 0; memcpy(dataAt, &lastEditedInServerTime, sizeof(lastEditedInServerTime)); #ifdef WANT_DEBUG qCDebug(entities, "EntityItem::adjustEditPacketForClockSkew()..."); @@ -812,6 +812,14 @@ void EntityItem::setMass(float mass) { } } +void EntityItem::setHref(QString value) { + auto href = value.toLower(); + if (! (value.toLower().startsWith("hifi://")) ) { + return; + } + _href = value; +} + void EntityItem::simulate(const quint64& now) { if (_lastSimulated == 0) { _lastSimulated = now; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 67af53615d..c8bf62f83e 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -172,7 +172,7 @@ public: // Hyperlink related getters and setters QString getHref() const { return _href; } - void setHref(QString value) { _href = value; } + void setHref(QString value); QString getDescription() const { return _description; } void setDescription(QString value) { _description = value; } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 0ccd6a74bd..0a72789485 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -321,6 +321,11 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool QScriptValue properties = engine->newObject(); EntityItemProperties defaultEntityProperties; + if (_created == UNKNOWN_CREATED_TIME) { + // No entity properties can have been set so return without setting any default, zero property values. + return properties; + } + if (_idSet) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_ALWAYS(id, _id.toString()); }