From 6fbabaae82a87ad1a923f7f7520d6e367df23096 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@d8a302eb-03bc-478d-80e4-98257eca68ef> Date: Sun, 28 Sep 2014 08:42:40 +0000 Subject: [PATCH] requests are enum git-svn-id: svn://elaine/murooma/trunk@304 d8a302eb-03bc-478d-80e4-98257eca68ef --- client/clientConnection.cpp | 2 ++ client/controller.cpp | 11 +++---- client/pcmDevice.h | 3 +- client/snapClient.cpp | 7 ++--- common/utils.h | 58 +++++++++++++++++++++++++++++-------- message/message.h | 3 +- message/requestMsg.h | 17 ++++------- server/controlServer.cpp | 19 +++++++----- server/pcmEncoder.cpp | 4 --- server/snapServer.cpp | 4 +-- 10 files changed, 80 insertions(+), 48 deletions(-) diff --git a/client/clientConnection.cpp b/client/clientConnection.cpp index 4401fe06..e20008d1 100644 --- a/client/clientConnection.cpp +++ b/client/clientConnection.cpp @@ -3,6 +3,7 @@ #include #include "common/log.h" #include "clientConnection.h" +#include "common/utils.h" @@ -54,6 +55,7 @@ void ClientConnection::start() // setsockopt(socket->native(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); // setsockopt(socket->native(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); socket->connect(*iterator); + cout << "MAC: \"" << getMacAddress(socket->native()) << "\"\n"; connected_ = true; cout << "connected\n"; std::clog << kLogNotice << "connected\n";// to " << ip << ":" << port << std::endl; diff --git a/client/controller.cpp b/client/controller.cpp index 54a30a1e..e2c63249 100644 --- a/client/controller.cpp +++ b/client/controller.cpp @@ -11,6 +11,7 @@ #include "message/timeMsg.h" #include "message/requestMsg.h" #include "message/ackMsg.h" +#include "message/commandMsg.h" using namespace std; @@ -73,16 +74,16 @@ void Controller::worker() try { clientConnection->start(); - RequestMsg requestMsg("serverSettings"); + RequestMsg requestMsg(serversettings); shared_ptr serverSettings(NULL); while (!(serverSettings = clientConnection->sendReq(&requestMsg, 1000))); cout << "ServerSettings buffer: " << serverSettings->bufferMs << "\n"; - requestMsg.request = "sampleFormat"; + requestMsg.request = sampleformat; while (!(sampleFormat = clientConnection->sendReq(&requestMsg, 1000))); cout << "SampleFormat rate: " << sampleFormat->rate << ", bits: " << sampleFormat->bits << ", channels: " << sampleFormat->channels << "\n"; - requestMsg.request = "headerChunk"; + requestMsg.request = header; shared_ptr headerChunk(NULL); while (!(headerChunk = clientConnection->sendReq(&requestMsg, 1000))); cout << "Codec: " << headerChunk->codec << "\n"; @@ -92,7 +93,7 @@ void Controller::worker() decoder = new PcmDecoder(); decoder->setHeader(headerChunk.get()); - RequestMsg timeReq("time"); + RequestMsg timeReq(timemsg); for (size_t n=0; n<50; ++n) { shared_ptr reply = clientConnection->sendReq(&timeReq, 2000); @@ -111,7 +112,7 @@ void Controller::worker() Player player(pcmDevice_, stream); player.start(); - RequestMsg startStream("startStream"); + CommandMsg startStream("startStream"); shared_ptr ackMsg(NULL); while (!(ackMsg = clientConnection->sendReq(&startStream, 1000))); diff --git a/client/pcmDevice.h b/client/pcmDevice.h index 9140619c..7158d8b0 100644 --- a/client/pcmDevice.h +++ b/client/pcmDevice.h @@ -4,9 +4,8 @@ #include -class PcmDevice +struct PcmDevice { -public: PcmDevice() : idx(-1){}; int idx; std::string name; diff --git a/client/snapClient.cpp b/client/snapClient.cpp index e3b47d40..a9eaeb3a 100644 --- a/client/snapClient.cpp +++ b/client/snapClient.cpp @@ -52,17 +52,16 @@ int main (int argc, char *argv[]) size_t port; bool runAsDaemon; bool listPcmDevices; -// string sampleFormat; + po::options_description desc("Allowed options"); desc.add_options() ("help,h", "produce help message") - ("port,p", po::value(&port)->default_value(98765), "port where the server listens on") + ("list,l", po::bool_switch(&listPcmDevices)->default_value(false), "list pcm devices") ("ip,i", po::value(&ip)->default_value("192.168.0.2"), "server IP") + ("port,p", po::value(&port)->default_value(98765), "server port") ("soundcard,s", po::value(&soundcard)->default_value("default"), "index or name of the soundcard") -// ("sampleformat,f", po::value(&sampleFormat)->default_value("48000:16:2"), "sample format") // ("buffer,b", po::value(&bufferMs)->default_value(300), "buffer size [ms]") ("daemon,d", po::bool_switch(&runAsDaemon)->default_value(false), "daemonize") - ("list,l", po::bool_switch(&listPcmDevices)->default_value(false), "list pcm devices") ; po::variables_map vm; diff --git a/common/utils.h b/common/utils.h index 3e67c052..d93606a8 100644 --- a/common/utils.h +++ b/common/utils.h @@ -9,8 +9,12 @@ #include #include #include +#include +#include +#include +#include #include - +#include // trim from start static inline std::string <rim(std::string &s) @@ -33,22 +37,52 @@ static inline std::string &trim(std::string &s) } -static std::string getMacAddress() +static std::string getMacAddress(int sock) { - std::ifstream t("/sys/class/net/eth0/address"); + struct ifreq ifr; + struct ifconf ifc; + char buf[1024]; + int success = 0; + + if (sock < 0) + return ""; + + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) + return ""; + + struct ifreq* it = ifc.ifc_req; + const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct ifreq)); + + for (; it != end; ++it) { + strcpy(ifr.ifr_name, it->ifr_name); + if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) { + if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback + if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) { + success = 1; + break; + } + } + } + else { /* handle error */ } + } + + if (!success) + return ""; + + char mac[19]; + sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", + (unsigned char)ifr.ifr_hwaddr.sa_data[0], (unsigned char)ifr.ifr_hwaddr.sa_data[1], (unsigned char)ifr.ifr_hwaddr.sa_data[2], + (unsigned char)ifr.ifr_hwaddr.sa_data[3], (unsigned char)ifr.ifr_hwaddr.sa_data[4], (unsigned char)ifr.ifr_hwaddr.sa_data[5]); + return mac; +} +/* std::ifstream t("/sys/class/net/eth0/address"); std::string str((std::istreambuf_iterator(t)), std::istreambuf_iterator()); return trim(str); } - - -std::vector split(const std::string& str) -{ - std::istringstream iss(str); - std::vector splitStr; - std::copy(std::istream_iterator(iss), std::istream_iterator(), std::back_inserter >(splitStr)); - return splitStr; -} +*/ static void daemonize() diff --git a/message/message.h b/message/message.h index 58571608..5cc72715 100644 --- a/message/message.h +++ b/message/message.h @@ -37,7 +37,8 @@ enum message_type serversettings = 4, timemsg = 5, requestmsg = 6, - ackMsg = 7 + ackMsg = 7, + commandmsg = 8 }; diff --git a/message/requestMsg.h b/message/requestMsg.h index 1b361633..71fa5e62 100644 --- a/message/requestMsg.h +++ b/message/requestMsg.h @@ -8,11 +8,11 @@ class RequestMsg : public BaseMessage { public: - RequestMsg() : BaseMessage(message_type::requestmsg), request("") + RequestMsg() : BaseMessage(message_type::requestmsg), request(base) { } - RequestMsg(const std::string& _request) : BaseMessage(message_type::requestmsg), request(_request) + RequestMsg(message_type _request) : BaseMessage(message_type::requestmsg), request(_request) { } @@ -22,25 +22,20 @@ public: virtual void read(std::istream& stream) { - int16_t size; - stream.read(reinterpret_cast(&size), sizeof(int16_t)); - request.resize(size); - stream.read(&request[0], size); + stream.read(reinterpret_cast(&request), sizeof(int16_t)); } virtual uint32_t getSize() { - return sizeof(int16_t) + request.size(); + return sizeof(int16_t); } - std::string request; + message_type request; protected: virtual void doserialize(std::ostream& stream) { - int16_t size(request.size()); - stream.write(reinterpret_cast(&size), sizeof(int16_t)); - stream.write(request.c_str(), size); + stream.write(reinterpret_cast(&request), sizeof(int16_t)); } }; diff --git a/server/controlServer.cpp b/server/controlServer.cpp index e4daf31f..7eb58747 100644 --- a/server/controlServer.cpp +++ b/server/controlServer.cpp @@ -2,6 +2,7 @@ #include "message/timeMsg.h" #include "message/ackMsg.h" #include "message/requestMsg.h" +#include "message/commandMsg.h" #include @@ -32,7 +33,6 @@ void ControlServer::send(shared_ptr message) } - void ControlServer::onMessageReceived(ServerSession* connection, const BaseMessage& baseMessage, char* buffer) { // cout << "onMessageReceived: " << baseMessage.type << ", size: " << baseMessage.size << ", sent: " << baseMessage.sent.sec << "," << baseMessage.sent.usec << ", recv: " << baseMessage.received.sec << "," << baseMessage.received.usec << "\n"; @@ -41,7 +41,7 @@ void ControlServer::onMessageReceived(ServerSession* connection, const BaseMessa RequestMsg requestMsg; requestMsg.deserialize(baseMessage, buffer); // cout << "request: " << requestMsg.request << "\n"; - if (requestMsg.request == "time") + if (requestMsg.request == timemsg) { // timeMsg.latency = (timeMsg.received.sec - timeMsg.sent.sec) * 1000000 + (timeMsg.received.usec - timeMsg.sent.usec); TimeMsg timeMsg; @@ -51,25 +51,30 @@ void ControlServer::onMessageReceived(ServerSession* connection, const BaseMessa // cout << "Latency: " << diff.sec << "." << diff.usec << "\n"; connection->send(&timeMsg); } - else if (requestMsg.request == "serverSettings") + else if (requestMsg.request == serversettings) { serverSettings->refersTo = requestMsg.id; connection->send(serverSettings); } - else if (requestMsg.request == "sampleFormat") + else if (requestMsg.request == sampleformat) { sampleFormat->refersTo = requestMsg.id; connection->send(sampleFormat); } - else if (requestMsg.request == "headerChunk") + else if (requestMsg.request == header) { headerChunk->refersTo = requestMsg.id; connection->send(headerChunk); } - else if (requestMsg.request == "startStream") + } + else if (baseMessage.type == message_type::commandmsg) + { + CommandMsg commandMsg; + commandMsg.deserialize(baseMessage, buffer); + if (commandMsg.command == "startStream") { AckMsg ackMsg; - ackMsg.refersTo = requestMsg.id; + ackMsg.refersTo = commandMsg.id; connection->send(&ackMsg); connection->setStreamActive(true); } diff --git a/server/pcmEncoder.cpp b/server/pcmEncoder.cpp index 1df6a663..80b59113 100644 --- a/server/pcmEncoder.cpp +++ b/server/pcmEncoder.cpp @@ -8,10 +8,6 @@ PcmEncoder::PcmEncoder(const SampleFormat& format) : Encoder(format) double PcmEncoder::encode(PcmChunk* chunk) { - /* WireChunk* wireChunk = chunk->wireChunk; - for (size_t n=0; nlength; ++n) - wireChunk->payload[n] *= 1; - */ return chunk->duration().count(); } diff --git a/server/snapServer.cpp b/server/snapServer.cpp index e5901c74..b41a681a 100644 --- a/server/snapServer.cpp +++ b/server/snapServer.cpp @@ -34,10 +34,10 @@ int main(int argc, char* argv[]) po::options_description desc("Allowed options"); desc.add_options() ("help,h", "produce help message") - ("port,p", po::value(&port)->default_value(98765), "port to listen on") + ("port,p", po::value(&port)->default_value(98765), "server port") ("sampleformat,s", po::value(&sampleFormat)->default_value("48000:16:2"), "sample format") ("codec,c", po::value(&codec)->default_value("ogg"), "transport codec [ogg|pcm]") - ("fifo,f", po::value(&fifoName)->default_value("/tmp/snapfifo"), "name of fifo file") + ("fifo,f", po::value(&fifoName)->default_value("/tmp/snapfifo"), "name of the input fifo file") ("daemon,d", po::bool_switch(&runAsDaemon)->default_value(false), "daemonize") ("buffer,b", po::value(&bufferMs)->default_value(500), "buffer [ms]") ;