From c3b6a7b24c9bd0a4506b6b93f9a6c9780552d338 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 3 Dec 2013 10:22:13 -0800 Subject: [PATCH] setup subclass for threaded assignments --- assignment-client/src/AssignmentClient.cpp | 4 +-- assignment-client/src/AssignmentClient.h | 4 ++- assignment-client/src/ThreadedAssignment.cpp | 32 ++++++++++++++++++ assignment-client/src/ThreadedAssignment.h | 34 ++++++++++++++++++++ assignment-client/src/audio/AudioMixer.cpp | 26 +++------------ assignment-client/src/audio/AudioMixer.h | 16 +++------ assignment-client/src/main.cpp | 1 - libraries/shared/src/Assignment.cpp | 4 --- libraries/shared/src/Assignment.h | 3 -- libraries/shared/src/PacketHeaders.cpp | 2 +- 10 files changed, 81 insertions(+), 45 deletions(-) create mode 100644 assignment-client/src/ThreadedAssignment.cpp create mode 100644 assignment-client/src/ThreadedAssignment.h diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 650b88c47b..f20e0da2a5 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -80,7 +80,7 @@ void AssignmentClient::readPendingDatagrams() { qDebug() << "Dropping received assignment since we are currently running one.\n"; } else { // construct the deployed assignment from the packet data - _currentAssignment = AssignmentFactory::unpackAssignment(packetData, receivedBytes); + _currentAssignment = (ThreadedAssignment*) AssignmentFactory::unpackAssignment(packetData, receivedBytes); qDebug() << "Received an assignment -" << *_currentAssignment << "\n"; @@ -95,7 +95,7 @@ void AssignmentClient::readPendingDatagrams() { // start the deployed assignment QThread* workerThread = new QThread(this); - connect(workerThread, SIGNAL(started()), _currentAssignment, SLOT(setup())); + connect(workerThread, SIGNAL(started()), _currentAssignment, SLOT(run())); connect(_currentAssignment, SIGNAL(finished()), this, SLOT(assignmentCompleted())); connect(_currentAssignment, SIGNAL(finished()), workerThread, SLOT(quit())); diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index b826f40a63..48311b0275 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -11,6 +11,8 @@ #include +#include "ThreadedAssignment.h" + class AssignmentClient : public QCoreApplication { Q_OBJECT public: @@ -24,7 +26,7 @@ private slots: void assignmentCompleted(); private: Assignment _requestAssignment; - Assignment* _currentAssignment; + ThreadedAssignment* _currentAssignment; }; #endif /* defined(__hifi__AssignmentClient__) */ diff --git a/assignment-client/src/ThreadedAssignment.cpp b/assignment-client/src/ThreadedAssignment.cpp new file mode 100644 index 0000000000..095999adca --- /dev/null +++ b/assignment-client/src/ThreadedAssignment.cpp @@ -0,0 +1,32 @@ +// +// ThreadedAssignment.cpp +// hifi +// +// Created by Stephen Birarda on 12/3/2013. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#include "ThreadedAssignment.h" + +ThreadedAssignment::ThreadedAssignment(const unsigned char* dataBuffer, int numBytes) : + Assignment(dataBuffer, numBytes), + _isFinished(false) +{ + +} + +void ThreadedAssignment::setFinished(bool isFinished) { + _isFinished = isFinished; + + if (_isFinished) { + emit finished(); + } +} + +void ThreadedAssignment::checkInWithDomainServerOrExit() { + if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { + setFinished(true); + } else { + NodeList::getInstance()->sendDomainServerCheckIn(); + } +} diff --git a/assignment-client/src/ThreadedAssignment.h b/assignment-client/src/ThreadedAssignment.h new file mode 100644 index 0000000000..15391f9122 --- /dev/null +++ b/assignment-client/src/ThreadedAssignment.h @@ -0,0 +1,34 @@ +// +// ThreadedAssignment.h +// hifi +// +// Created by Stephen Birarda on 12/3/2013. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#ifndef __hifi__ThreadedAssignment__ +#define __hifi__ThreadedAssignment__ + +#include + +class ThreadedAssignment : public Assignment { + Q_OBJECT +public: + ThreadedAssignment(const unsigned char* dataBuffer, int numBytes); + + void setFinished(bool isFinished); +public slots: + /// threaded run of assignment + virtual void run() = 0; + + virtual void processDatagram(const QByteArray& dataByteArray, const HifiSockAddr& senderSockAddr) = 0; +protected: + bool _isFinished; +private slots: + void checkInWithDomainServerOrExit(); +signals: + void finished(); +}; + + +#endif /* defined(__hifi__ThreadedAssignment__) */ diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 106a19f353..92b36d054e 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -68,8 +68,7 @@ void attachNewBufferToNode(Node *newNode) { } AudioMixer::AudioMixer(const unsigned char* dataBuffer, int numBytes) : - Assignment(dataBuffer, numBytes), - _isFinished(false) + ThreadedAssignment(dataBuffer, numBytes) { } @@ -251,21 +250,13 @@ void AudioMixer::processDatagram(const QByteArray& dataByteArray, const HifiSock } } -void AudioMixer::checkInWithDomainServerOrExit() { - if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { - _isFinished = true; - emit finished(); - } else { - NodeList::getInstance()->sendDomainServerCheckIn(); - } -} - - -void AudioMixer::setup() { +void AudioMixer::run() { + + NodeList* nodeList = NodeList::getInstance(); + // change the logging target name while this is running Logging::setTargetName(AUDIO_MIXER_LOGGING_TARGET_NAME); - NodeList *nodeList = NodeList::getInstance(); nodeList->setOwnerType(NODE_TYPE_AUDIO_MIXER); const char AUDIO_MIXER_NODE_TYPES_OF_INTEREST[2] = { NODE_TYPE_AGENT, NODE_TYPE_AUDIO_INJECTOR }; @@ -281,13 +272,6 @@ void AudioMixer::setup() { connect(silentNodeTimer, SIGNAL(timeout()), nodeList, SLOT(removeSilentNodes())); silentNodeTimer->start(NODE_SILENCE_THRESHOLD_USECS / 1000); - run(); -} - -void AudioMixer::run() { - - NodeList* nodeList = NodeList::getInstance(); - int nextFrame = 0; timeval startTime; diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index b38d553564..a219919a1c 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -9,28 +9,23 @@ #ifndef __hifi__AudioMixer__ #define __hifi__AudioMixer__ - -#include #include +#include "../ThreadedAssignment.h" + class PositionalAudioRingBuffer; class AvatarAudioRingBuffer; /// Handles assignments of type AudioMixer - mixing streams of audio and re-distributing to various clients. -class AudioMixer : public Assignment { +class AudioMixer : public ThreadedAssignment { Q_OBJECT public: AudioMixer(const unsigned char* dataBuffer, int numBytes); public slots: - /// performs setup for the audio mixer - void setup(); - - /// performs run of audio mixer + /// threaded run of assignment void run(); void processDatagram(const QByteArray& dataByteArray, const HifiSockAddr& senderSockAddr); -signals: - void finished(); private: /// adds one buffer to the mix for a listening node void addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuffer* bufferToAdd, @@ -41,9 +36,6 @@ private: int16_t _clientSamples[BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2]; - bool _isFinished; -private slots: - void checkInWithDomainServerOrExit(); }; #endif /* defined(__hifi__AudioMixer__) */ diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index ae4f569f83..28516b37b8 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -21,7 +21,6 @@ #include "Agent.h" #include "Assignment.h" #include "AssignmentClient.h" -#include "AssignmentFactory.h" #include "audio/AudioMixer.h" #include "avatars/AvatarMixer.h" diff --git a/libraries/shared/src/Assignment.cpp b/libraries/shared/src/Assignment.cpp index 07e96e4963..59b0bb60d1 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -211,10 +211,6 @@ int Assignment::packToBuffer(unsigned char* buffer) { return numPackedBytes; } -void Assignment::run() { - // run method ovveridden by subclasses -} - QDebug operator<<(QDebug debug, const Assignment &assignment) { debug.nospace() << "UUID: " << assignment.getUUID().toString().toStdString().c_str() << ", Type: " << assignment.getType(); diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index 68e23e761d..d862fda859 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -90,9 +90,6 @@ public: // implement parseData to return 0 so we can be a subclass of NodeData int parseData(unsigned char* sourceBuffer, int numBytes) { return 0; } - /// threaded run of assignment - virtual void run(); - friend QDebug operator<<(QDebug debug, const Assignment& assignment); friend QDataStream& operator<<(QDataStream &out, const Assignment& assignment); friend QDataStream& operator>>(QDataStream &in, Assignment& assignment); diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index b03daeec05..d320a066ee 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -34,7 +34,7 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE type) { case PACKET_TYPE_DOMAIN: case PACKET_TYPE_DOMAIN_LIST_REQUEST: case PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY: - return 1; + return 2; case PACKET_TYPE_VOXEL_QUERY: return 1;