diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 2906233d78..d0f36402b5 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -8,8 +8,6 @@ #include -#include - #include #include #include @@ -17,11 +15,13 @@ #include "Agent.h" #include "voxels/VoxelScriptingInterface.h" +Agent* Agent::_staticInstance = NULL; + Agent::Agent(const unsigned char* dataBuffer, int numBytes) : Assignment(dataBuffer, numBytes), _shouldStop(false) { - + setStaticInstance(this); } void Agent::stop() { @@ -40,10 +40,40 @@ static size_t writeScriptDataToString(void *contents, size_t size, size_t nmemb, return realSize; } +void Agent::setStaticInstance(Agent* staticInstance) { + _staticInstance = staticInstance; +} + +QScriptValue Agent::AudioInjectorConstructor(QScriptContext *context, QScriptEngine *engine) { + AudioInjector* injector = new AudioInjector(BUFFER_LENGTH_SAMPLES_PER_CHANNEL); + + // add this injector to the vector of audio injectors so we know we have to tell it to send its audio during loop + _staticInstance->_audioInjectors.push_back(injector); + + return engine->newQObject(injector, QScriptEngine::ScriptOwnership); +} + +QScriptValue vec3toScriptValue(QScriptEngine *engine, const glm::vec3 &vec3) { + QScriptValue obj = engine->newObject(); + obj.setProperty("x", vec3.x); + obj.setProperty("y", vec3.y); + obj.setProperty("z", vec3.z); + return obj; +} + +void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3) { + vec3.x = object.property("x").toVariant().toFloat(); + vec3.y = object.property("y").toVariant().toFloat(); + vec3.z = object.property("z").toVariant().toFloat(); +} + void Agent::run() { NodeList* nodeList = NodeList::getInstance(); nodeList->setOwnerType(NODE_TYPE_AGENT); - nodeList->setNodeTypesOfInterest(&NODE_TYPE_VOXEL_SERVER, 1); + + const char AGENT_NODE_TYPES_OF_INTEREST[2] = { NODE_TYPE_VOXEL_SERVER, NODE_TYPE_AUDIO_MIXER }; + + nodeList->setNodeTypesOfInterest(AGENT_NODE_TYPES_OF_INTEREST, sizeof(AGENT_NODE_TYPES_OF_INTEREST)); nodeList->getNodeSocket()->setBlocking(false); @@ -83,6 +113,9 @@ void Agent::run() { QScriptEngine engine; + // register meta-type for glm::vec3 conversions + qScriptRegisterMetaType(&engine, vec3toScriptValue, vec3FromScriptValue); + QScriptValue agentValue = engine.newQObject(this); engine.globalObject().setProperty("Agent", agentValue); @@ -101,6 +134,11 @@ void Agent::run() { QScriptValue visualSendIntervalValue = engine.newVariant((QVariant(VISUAL_DATA_SEND_INTERVAL_USECS / 1000))); engine.globalObject().setProperty("VISUAL_DATA_SEND_INTERVAL_MS", visualSendIntervalValue); + // hook in a constructor for audio injectorss + QScriptValue audioInjectorConstructor = engine.newFunction(AudioInjectorConstructor); + QScriptValue audioMetaObject = engine.newQMetaObject(&AudioInjector::staticMetaObject, audioInjectorConstructor); + engine.globalObject().setProperty("AudioInjector", audioMetaObject); + qDebug() << "Downloaded script:" << scriptContents << "\n"; QScriptValue result = engine.evaluate(scriptContents); qDebug() << "Evaluated script.\n"; diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 0490238d3f..84e8e11269 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -9,9 +9,13 @@ #ifndef __hifi__Agent__ #define __hifi__Agent__ +#include + +#include #include #include +#include #include class Agent : public Assignment { @@ -25,7 +29,12 @@ public slots: signals: void willSendVisualDataCallback(); private: + static void setStaticInstance(Agent* staticInstance); + static Agent* _staticInstance; + static QScriptValue AudioInjectorConstructor(QScriptContext *context, QScriptEngine *engine); + bool volatile _shouldStop; + std::vector _audioInjectors; }; #endif /* defined(__hifi__Operative__) */ diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index 75c8a00343..03578c4e8a 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -66,11 +66,13 @@ void childClient() { // create a request assignment, accept assignments defined by the overidden type Assignment requestAssignment(Assignment::RequestCommand, ::overiddenAssignmentType); + qDebug() << "Waiting for assignment -" << requestAssignment << "\n"; + while (true) { if (usecTimestampNow() - usecTimestamp(&lastRequest) >= ASSIGNMENT_REQUEST_INTERVAL_USECS) { gettimeofday(&lastRequest, NULL); + // if we're here we have no assignment, so send a request - qDebug() << "Sending an assignment request -" << requestAssignment << "\n"; nodeList->sendAssignment(requestAssignment); } diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index b102d58e19..b8e6cb823d 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -12,6 +12,8 @@ #include #include +#include + #include #include "AudioRingBuffer.h" @@ -22,7 +24,12 @@ const int MAX_INJECTOR_VOLUME = 0xFF; const int INJECT_INTERVAL_USECS = floorf((BUFFER_LENGTH_SAMPLES_PER_CHANNEL / SAMPLE_RATE) * 1000000); -class AudioInjector { +Q_DECLARE_METATYPE(glm::vec3) + +class AudioInjector : public QObject { + Q_OBJECT + + Q_PROPERTY(glm::vec3 position READ getPosition WRITE setPosition) public: AudioInjector(const char* filename); AudioInjector(int maxNumSamples);