From f52c1c909b7653d635145e276a0524d96897d794 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 22 Aug 2013 11:38:57 -0700 Subject: [PATCH] send assignment from domain server for audio mixer if it isn't present --- assignment-server/src/main.cpp | 6 ++++-- domain-server/src/main.cpp | 10 ++++++++++ libraries/shared/src/Assignment.h | 2 ++ libraries/shared/src/NodeList.cpp | 20 ++++++++++++++------ libraries/shared/src/NodeList.h | 4 +++- libraries/shared/src/PacketHeaders.h | 2 +- libraries/shared/src/UDPSocket.cpp | 9 +++++++-- libraries/shared/src/UDPSocket.h | 2 +- 8 files changed, 42 insertions(+), 13 deletions(-) diff --git a/assignment-server/src/main.cpp b/assignment-server/src/main.cpp index 90d8c1754c..244ffd53ee 100644 --- a/assignment-server/src/main.cpp +++ b/assignment-server/src/main.cpp @@ -45,8 +45,10 @@ int main(int argc, const char* argv[]) { // send the assignment } } else if (senderData[0] == PACKET_TYPE_SEND_ASSIGNMENT && packetVersionMatch(senderData)) { - Assignment newAssignment(*(senderData + numBytesForPacketHeader(senderData)); - + Assignment newAssignment((Assignment::Type) *(senderData + numBytesForPacketHeader(senderData))); + + qDebug() << "Received assignment of type " << newAssignment.getType() << "\n"; + // add this assignment to the queue assignmentQueue.push(newAssignment); } diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 51eea6b838..0fd495fdc1 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -24,6 +24,7 @@ #include #include +#include "Assignment.h" #include "NodeList.h" #include "NodeTypes.h" #include "Logstash.h" @@ -85,6 +86,15 @@ int main(int argc, const char * argv[]) timeval lastStatSendTime = {}; while (true) { + + if (!nodeList->soloNodeOfType(NODE_TYPE_AUDIO_MIXER)) { + // we don't have an audio mixer, and we know we need one + // so tell that to the assignment server + Assignment mixerAssignment(Assignment::AudioMixer); + nodeList->sendAssignment(mixerAssignment); + } + + if (nodeList->getNodeSocket()->receive((sockaddr *)&nodePublicAddress, packetData, &receivedBytes) && (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) && packetVersionMatch(packetData)) { diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index 341f2fed5b..0f7f930bb4 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -18,6 +18,8 @@ public: }; Assignment(Assignment::Type type); + + Assignment::Type getType() const { return _type; } private: Assignment::Type _type; }; diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 8850d34e87..ba3b80efd7 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -366,15 +366,23 @@ int NodeList::processDomainServerList(unsigned char* packetData, size_t dataByte return readNodes; } -void NodeList::sendAssignmentRequest() { - const char ASSIGNMENT_SERVER_HOSTNAME[] = "assignment.highfidelity.io"; - - static sockaddr_in assignmentServerSocket = socketForHostname(ASSIGNMENT_SERVER_HOSTNAME); - assignmentServerSocket.sin_port = htons(ASSIGNMENT_SERVER_PORT); - +const char ASSIGNMENT_SERVER_HOSTNAME[] = "localhost"; +const sockaddr_in assignmentServerSocket = socketForHostnameAndHostOrderPort(ASSIGNMENT_SERVER_HOSTNAME, + ASSIGNMENT_SERVER_PORT); + +void NodeList::requestAssignment() { _nodeSocket.send((sockaddr*) &assignmentServerSocket, &PACKET_TYPE_REQUEST_ASSIGNMENT, 1); } +void NodeList::sendAssignment(Assignment& assignment) { + unsigned char assignmentPacket[MAX_PACKET_SIZE]; + int numHeaderBytes = populateTypeAndVersion(assignmentPacket, PACKET_TYPE_SEND_ASSIGNMENT); + + qDebug() << "The socket IP is " << inet_ntoa(assignmentServerSocket.sin_addr); + + _nodeSocket.send((sockaddr*) &assignmentServerSocket, assignmentPacket, numHeaderBytes); +} + Node* NodeList::addOrUpdateNode(sockaddr* publicSocket, sockaddr* localSocket, char nodeType, uint16_t nodeId) { NodeList::iterator node = end(); diff --git a/libraries/shared/src/NodeList.h b/libraries/shared/src/NodeList.h index 6f0e6827e9..0d83480ffd 100644 --- a/libraries/shared/src/NodeList.h +++ b/libraries/shared/src/NodeList.h @@ -43,6 +43,7 @@ extern const int DEFAULT_DOMAINSERVER_PORT; const int UNKNOWN_NODE_ID = 0; +class Assignment; class NodeListIterator; // Callers who want to hook add/kill callbacks should implement this class @@ -95,7 +96,8 @@ public: void sendDomainServerCheckIn(); int processDomainServerList(unsigned char *packetData, size_t dataBytes); - void sendAssignmentRequest(); + void requestAssignment(); + void sendAssignment(Assignment& assignment); Node* nodeWithAddress(sockaddr *senderAddress); Node* nodeWithID(uint16_t nodeID); diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index 2f4f8d2196..640007375e 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -57,6 +57,6 @@ const int MAX_PACKET_HEADER_BYTES = sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION) #define ADD_SCENE_COMMAND "add scene" #define TEST_COMMAND "a message" -const int ASSIGNMENT_SERVER_PORT = 7007; +const unsigned short ASSIGNMENT_SERVER_PORT = 7007; #endif diff --git a/libraries/shared/src/UDPSocket.cpp b/libraries/shared/src/UDPSocket.cpp index 39c4dc2e62..b32a66ccfb 100644 --- a/libraries/shared/src/UDPSocket.cpp +++ b/libraries/shared/src/UDPSocket.cpp @@ -6,6 +6,7 @@ // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. // +#include #include #include #include @@ -118,14 +119,18 @@ unsigned short loadBufferWithSocketInfo(char* addressBuffer, sockaddr* socket) { } } -sockaddr_in socketForHostname(const char* hostname) { +sockaddr_in socketForHostnameAndHostOrderPort(const char* hostname, unsigned short port) { struct hostent* pHostInfo; - sockaddr_in newSocket; + sockaddr_in newSocket = {}; if ((pHostInfo = gethostbyname(hostname))) { memcpy(&newSocket.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); } + if (port != 0) { + newSocket.sin_port = htons(port); + } + return newSocket; } diff --git a/libraries/shared/src/UDPSocket.h b/libraries/shared/src/UDPSocket.h index 34f8ee0b06..eec6c9bf43 100644 --- a/libraries/shared/src/UDPSocket.h +++ b/libraries/shared/src/UDPSocket.h @@ -42,6 +42,6 @@ int packSocket(unsigned char* packStore, sockaddr* socketToPack); int unpackSocket(unsigned char* packedData, sockaddr* unpackDestSocket); int getLocalAddress(); unsigned short loadBufferWithSocketInfo(char* addressBuffer, sockaddr* socket); -sockaddr_in socketForHostname(const char* hostname); +sockaddr_in socketForHostnameAndHostOrderPort(const char* hostname, unsigned short port = 0); #endif /* defined(__interface__UDPSocket__) */