From 4b7d4d72901ed1b168595be63739f0a58f459c5c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 13 Feb 2015 10:56:04 +0100 Subject: [PATCH 1/5] Don't use DataStream to write MuteEnv packet --- interface/src/DatagramProcessor.cpp | 4 ++-- libraries/audio-client/src/AudioClient.cpp | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 9c56f8bc8d..02d3c62765 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -129,12 +129,12 @@ void DatagramProcessor::processDatagrams() { if (incomingType == PacketTypeMuteEnvironment) { glm::vec3 position; - float radius, distance; + float radius; int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeMuteEnvironment); memcpy(&position, incomingPacket.constData() + headerSize, sizeof(glm::vec3)); memcpy(&radius, incomingPacket.constData() + headerSize + sizeof(glm::vec3), sizeof(float)); - distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), + float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), position); mute = mute && (distance < radius); diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 9f569c9893..dba24c6703 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -871,13 +871,14 @@ void AudioClient::processReceivedSamples(const QByteArray& inputBuffer, QByteArr void AudioClient::sendMuteEnvironmentPacket() { QByteArray mutePacket = byteArrayWithPopulatedHeader(PacketTypeMuteEnvironment); - QDataStream mutePacketStream(&mutePacket, QIODevice::Append); + int headerSize = mutePacket.size(); const float MUTE_RADIUS = 50; glm::vec3 currentSourcePosition = _positionGetter(); - mutePacketStream.writeBytes(reinterpret_cast(¤tSourcePosition), sizeof(glm::vec3)); - mutePacketStream.writeBytes(reinterpret_cast(&MUTE_RADIUS), sizeof(float)); + mutePacket.resize(mutePacket.size() + sizeof(glm::vec3) + sizeof(float)); + memcpy(mutePacket.data() + headerSize, ¤tSourcePosition, sizeof(glm::vec3)); + memcpy(mutePacket.data() + headerSize + sizeof(glm::vec3), &MUTE_RADIUS, sizeof(float)); // grab our audio mixer from the NodeList, if it exists auto nodelist = DependencyManager::get(); From 1ba85518fceadc0884971385b69d7d57ff633aca Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 13 Feb 2015 11:36:41 -0800 Subject: [PATCH 2/5] fix for playSound called from same thread --- .../src/AudioScriptingInterface.cpp | 39 +++++++++---------- .../src/AudioScriptingInterface.h | 3 -- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/libraries/script-engine/src/AudioScriptingInterface.cpp b/libraries/script-engine/src/AudioScriptingInterface.cpp index 32b9eb23e2..387852fe00 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.cpp +++ b/libraries/script-engine/src/AudioScriptingInterface.cpp @@ -31,44 +31,41 @@ AudioScriptingInterface::AudioScriptingInterface() : } ScriptAudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions& injectorOptions) { - AudioInjector* injector = NULL; - QMetaObject::invokeMethod(this, "invokedPlaySound", Qt::BlockingQueuedConnection, - Q_RETURN_ARG(AudioInjector*, injector), - Q_ARG(Sound*, sound), Q_ARG(const AudioInjectorOptions&, injectorOptions)); - if (injector) { - return new ScriptAudioInjector(injector); - } else { - return NULL; + if (QThread::currentThread() != thread()) { + ScriptAudioInjector* injector = NULL; + + QMetaObject::invokeMethod(this, "playSound", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(ScriptAudioInjector*, injector), + Q_ARG(Sound*, sound), Q_ARG(const AudioInjectorOptions&, injectorOptions)); + return injector; } -} - -AudioInjector* AudioScriptingInterface::invokedPlaySound(Sound* sound, const AudioInjectorOptions& injectorOptions) { + if (sound) { // stereo option isn't set from script, this comes from sound metadata or filename AudioInjectorOptions optionsCopy = injectorOptions; optionsCopy.stereo = sound->isStereo(); - + QThread* injectorThread = new QThread(); injectorThread->setObjectName("Audio Injector Thread"); - + AudioInjector* injector = new AudioInjector(sound, optionsCopy); injector->setLocalAudioInterface(_localAudioInterface); - + injector->moveToThread(injectorThread); - + // start injecting when the injector thread starts connect(injectorThread, &QThread::started, injector, &AudioInjector::injectAudio); - + // connect the right slots and signals for AudioInjector and thread cleanup connect(injector, &AudioInjector::destroyed, injectorThread, &QThread::quit); connect(injectorThread, &QThread::finished, injectorThread, &QThread::deleteLater); - + injectorThread->start(); - - return injector; - + + return new ScriptAudioInjector(injector); + } else { qDebug() << "AudioScriptingInterface::playSound called with null Sound object."; return NULL; } -} +} \ No newline at end of file diff --git a/libraries/script-engine/src/AudioScriptingInterface.h b/libraries/script-engine/src/AudioScriptingInterface.h index ed52d951ad..b74c520670 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.h +++ b/libraries/script-engine/src/AudioScriptingInterface.h @@ -32,9 +32,6 @@ protected: signals: void mutedByMixer(); void environmentMuted(); - -private slots: - AudioInjector* invokedPlaySound(Sound* sound, const AudioInjectorOptions& injectorOptions); private: AudioScriptingInterface(); From 28430d928a7cfa1f44bc8f935292aa11ec38124c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 13 Feb 2015 11:52:51 -0800 Subject: [PATCH 3/5] use direct connection to ensure injector is stopped --- libraries/script-engine/src/ScriptAudioInjector.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptAudioInjector.cpp b/libraries/script-engine/src/ScriptAudioInjector.cpp index beb056468f..7bdf78be63 100644 --- a/libraries/script-engine/src/ScriptAudioInjector.cpp +++ b/libraries/script-engine/src/ScriptAudioInjector.cpp @@ -13,7 +13,9 @@ QScriptValue injectorToScriptValue(QScriptEngine* engine, ScriptAudioInjector* const& in) { // when the script goes down we want to cleanup the injector - QObject::connect(engine, &QScriptEngine::destroyed, in, &ScriptAudioInjector::stopInjectorImmediately); + + QObject::connect(engine, &QScriptEngine::destroyed, in, &ScriptAudioInjector::stopInjectorImmediately, + Qt::DirectConnection); return engine->newQObject(in, QScriptEngine::ScriptOwnership); } @@ -36,5 +38,6 @@ ScriptAudioInjector::~ScriptAudioInjector() { } void ScriptAudioInjector::stopInjectorImmediately() { + qDebug() << "ScriptAudioInjector::stopInjectorImmediately called to stop audio injector immediately."; _injector->stopAndDeleteLater(); } From 573d7971ac393a2aed2512984f1bfd26005c6129 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 13 Feb 2015 20:23:12 -0800 Subject: [PATCH 4/5] fix a couple of bugs in backup settings --- libraries/octree/src/OctreePersistThread.cpp | 92 +++++++++++++------- 1 file changed, 61 insertions(+), 31 deletions(-) diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index b247f88059..2a563dc50a 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -49,14 +49,32 @@ void OctreePersistThread::parseSettings(const QJsonObject& settings) { qDebug() << "BACKUP RULES:"; foreach (const QJsonValue& value, backupRules) { + QJsonObject obj = value.toObject(); + + int interval = 0; + int count = 0; + + QJsonValue intervalVal = obj["backupInterval"]; + if (intervalVal.isString()) { + interval = intervalVal.toString().toInt(); + } else { + interval = intervalVal.toInt(); + } + + QJsonValue countVal = obj["maxBackupVersions"]; + if (countVal.isString()) { + count = countVal.toString().toInt(); + } else { + count = countVal.toInt(); + } + qDebug() << " Name:" << obj["Name"].toString(); qDebug() << " format:" << obj["format"].toString(); - qDebug() << " interval:" << obj["backupInterval"].toInt(); - qDebug() << " count:" << obj["maxBackupVersions"].toInt(); + qDebug() << " interval:" << interval; + qDebug() << " count:" << count; - BackupRule newRule = { obj["Name"].toString(), obj["backupInterval"].toInt(), - obj["format"].toString(), obj["maxBackupVersions"].toInt(), 0}; + BackupRule newRule = { obj["Name"].toString(), interval, obj["format"].toString(), count, 0}; newRule.lastBackup = getMostRecentBackupTimeInUsecs(obj["format"].toString()); @@ -321,29 +339,35 @@ bool OctreePersistThread::getMostRecentBackup(const QString& format, void OctreePersistThread::rollOldBackupVersions(const BackupRule& rule) { if (rule.extensionFormat.contains("%N")) { - qDebug() << "Rolling old backup versions for rule" << rule.name << "..."; - for(int n = rule.maxBackupVersions - 1; n > 0; n--) { - QString backupExtensionN = rule.extensionFormat; - QString backupExtensionNplusOne = rule.extensionFormat; - backupExtensionN.replace(QString("%N"), QString::number(n)); - backupExtensionNplusOne.replace(QString("%N"), QString::number(n+1)); + if (rule.maxBackupVersions > 0) { + qDebug() << "Rolling old backup versions for rule" << rule.name << "..."; + for(int n = rule.maxBackupVersions - 1; n > 0; n--) { + QString backupExtensionN = rule.extensionFormat; + QString backupExtensionNplusOne = rule.extensionFormat; + backupExtensionN.replace(QString("%N"), QString::number(n)); + backupExtensionNplusOne.replace(QString("%N"), QString::number(n+1)); - QString backupFilenameN = _filename + backupExtensionN; - QString backupFilenameNplusOne = _filename + backupExtensionNplusOne; + QString backupFilenameN = _filename + backupExtensionN; + QString backupFilenameNplusOne = _filename + backupExtensionNplusOne; - QFile backupFileN(backupFilenameN); + QFile backupFileN(backupFilenameN); - if (backupFileN.exists()) { - qDebug() << "rolling backup file " << backupFilenameN << "to" << backupFilenameNplusOne << "..."; - int result = rename(qPrintable(backupFilenameN), qPrintable(backupFilenameNplusOne)); - if (result == 0) { - qDebug() << "DONE rolling backup file " << backupFilenameN << "to" << backupFilenameNplusOne << "..."; - } else { - qDebug() << "ERROR in rolling backup file " << backupFilenameN << "to" << backupFilenameNplusOne << "..."; + if (backupFileN.exists()) { + qDebug() << "rolling backup file " << backupFilenameN << "to" << backupFilenameNplusOne << "..."; + int result = rename(qPrintable(backupFilenameN), qPrintable(backupFilenameNplusOne)); + if (result == 0) { + qDebug() << "DONE rolling backup file " << backupFilenameN << "to" << backupFilenameNplusOne << "..."; + } else { + qDebug() << "ERROR in rolling backup file " << backupFilenameN << "to" << backupFilenameNplusOne << "..."; + } } } + qDebug() << "Done rolling old backup versions..."; + } else { + qDebug() << "Rolling backups for rule" << rule.name << "." + << " Max Rolled Backup Versions less than 1 [" << rule.maxBackupVersions << "]." + << " No need to roll backups..."; } - qDebug() << "Done rolling old backup versions..."; } } @@ -384,19 +408,25 @@ void OctreePersistThread::backup() { } - QFile persistFile(_filename); - if (persistFile.exists()) { - qDebug() << "backing up persist file " << _filename << "to" << backupFileName << "..."; - bool result = QFile::copy(_filename, backupFileName); - if (result) { - qDebug() << "DONE backing up persist file..."; - rule.lastBackup = now; // only record successful backup in this case. + if (rule.maxBackupVersions > 0) { + QFile persistFile(_filename); + if (persistFile.exists()) { + qDebug() << "backing up persist file " << _filename << "to" << backupFileName << "..."; + bool result = QFile::copy(_filename, backupFileName); + if (result) { + qDebug() << "DONE backing up persist file..."; + rule.lastBackup = now; // only record successful backup in this case. + } else { + qDebug() << "ERROR in backing up persist file..."; + } } else { - qDebug() << "ERROR in backing up persist file..."; + qDebug() << "persist file " << _filename << " does not exist. " << + "nothing to backup for this rule ["<< rule.name << "]..."; } } else { - qDebug() << "persist file " << _filename << " does not exist. " << - "nothing to backup for this rule ["<< rule.name << "]..."; + qDebug() << "This backup rule" << rule.name + << " has Max Rolled Backup Versions less than 1 [" << rule.maxBackupVersions << "]." + << " There are no backups to be done..."; } } else { qDebug() << "Backup not needed for this rule ["<< rule.name << "]..."; From 20b0dee80c0d5b219c5f009ee1a01fec743f308e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 16 Feb 2015 12:07:22 -0800 Subject: [PATCH 5/5] add a NULL initializer for the linked data create callback --- libraries/networking/src/LimitedNodeList.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 13bb2b1ad8..43f4dda565 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -39,6 +39,7 @@ const char SOLO_NODE_TYPES[2] = { const QUrl DEFAULT_NODE_AUTH_URL = QUrl("https://metaverse.highfidelity.io"); LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short dtlsListenPort) : + linkedDataCreateCallback(NULL), _sessionUUID(), _nodeHash(), _nodeMutex(QReadWriteLock::Recursive),