diff --git a/client/controller.cpp b/client/controller.cpp index 86bd0ff9..92a0c8d8 100644 --- a/client/controller.cpp +++ b/client/controller.cpp @@ -83,14 +83,15 @@ void Controller::worker() while (!(sampleFormat = clientConnection->sendReq(&requestMsg, 1000))); cout << "SampleFormat rate: " << sampleFormat->rate << ", bits: " << sampleFormat->bits << ", channels: " << sampleFormat->channels << "\n"; - decoder = new OggDecoder(); - if (decoder != NULL) - { - requestMsg.request = "headerChunk"; - shared_ptr headerChunk(NULL); - while (!(headerChunk = clientConnection->sendReq(&requestMsg, 1000))); - decoder->setHeader(headerChunk.get()); - } + requestMsg.request = "headerChunk"; + shared_ptr headerChunk(NULL); + while (!(headerChunk = clientConnection->sendReq(&requestMsg, 1000))); + cout << "Codec: " << headerChunk->codec << "\n"; + if (headerChunk->codec == "ogg") + decoder = new OggDecoder(); + else if (headerChunk->codec == "pcm") + decoder = new PcmDecoder(); + decoder->setHeader(headerChunk.get()); RequestMsg timeReq("time"); for (size_t n=0; n<10; ++n) @@ -124,7 +125,7 @@ void Controller::worker() { double latency = (reply->received.sec - reply->sent.sec) + (reply->received.usec - reply->sent.usec) / 1000000.; TimeProvider::getInstance().setDiffToServer((reply->latency - latency) * 1000 / 2); - cout << "Median: " << TimeProvider::getInstance().getDiffToServer() << "\n"; +// cout << "Median: " << TimeProvider::getInstance().getDiffToServer() << "\n"; } } } diff --git a/common/headerMessage.h b/common/headerMessage.h index d0b78e30..c6c2d4d4 100644 --- a/common/headerMessage.h +++ b/common/headerMessage.h @@ -8,7 +8,7 @@ class HeaderMessage : public BaseMessage { public: - HeaderMessage(size_t size = 0) : BaseMessage(message_type::header), payloadSize(size) + HeaderMessage(const std::string& codecName = "", size_t size = 0) : BaseMessage(message_type::header), payloadSize(size), codec(codecName) { payload = (char*)malloc(size); } @@ -20,6 +20,11 @@ public: virtual void read(std::istream& stream) { + int16_t size; + stream.read(reinterpret_cast(&size), sizeof(int16_t)); + codec.resize(size); + stream.read(&codec[0], size); + stream.read(reinterpret_cast(&payloadSize), sizeof(uint32_t)); payload = (char*)realloc(payload, payloadSize); stream.read(payload, payloadSize); @@ -27,15 +32,19 @@ public: virtual uint32_t getSize() { - return sizeof(uint32_t) + payloadSize; + return sizeof(int16_t) + codec.size() + sizeof(uint32_t) + payloadSize; } uint32_t payloadSize; char* payload; + std::string codec; protected: virtual void doserialize(std::ostream& stream) { + int16_t size(codec.size()); + stream.write(reinterpret_cast(&size), sizeof(int16_t)); + stream.write(codec.c_str(), size); stream.write(reinterpret_cast(&payloadSize), sizeof(uint32_t)); stream.write(payload, payloadSize); } diff --git a/server/controlServer.cpp b/server/controlServer.cpp index 2eb497f4..2d437e46 100644 --- a/server/controlServer.cpp +++ b/server/controlServer.cpp @@ -40,7 +40,7 @@ void ControlServer::onMessageReceived(ServerSession* connection, const BaseMessa { RequestMsg requestMsg; requestMsg.deserialize(baseMessage, buffer); - cout << "request: " << requestMsg.request << "\n"; +// cout << "request: " << requestMsg.request << "\n"; if (requestMsg.request == "time") { // timeMsg.latency = (timeMsg.received.sec - timeMsg.sent.sec) * 1000000 + (timeMsg.received.usec - timeMsg.sent.usec); diff --git a/server/encoder.h b/server/encoder.h index 90de75a4..278e135c 100644 --- a/server/encoder.h +++ b/server/encoder.h @@ -8,18 +8,26 @@ class Encoder { public: - Encoder(const SampleFormat& format) : sampleFormat(format) + Encoder(const SampleFormat& format) : sampleFormat(format), headerChunk(NULL) { } + virtual ~Encoder() + { + if (headerChunk != NULL) + delete headerChunk; + } + virtual double encode(PcmChunk* chunk) = 0; + virtual HeaderMessage* getHeader() { - return NULL; + return headerChunk; } protected: SampleFormat sampleFormat; + HeaderMessage* headerChunk; }; diff --git a/server/oggEncoder.cpp b/server/oggEncoder.cpp index 501cab95..9d3a01bf 100644 --- a/server/oggEncoder.cpp +++ b/server/oggEncoder.cpp @@ -5,18 +5,13 @@ using namespace std; -OggEncoder::OggEncoder(const SampleFormat& format) : Encoder(format), headerChunk(NULL) +OggEncoder::OggEncoder(const SampleFormat& format) : Encoder(format) { init(); lastGranulepos = -1; } -HeaderMessage* OggEncoder::getHeader() -{ - return headerChunk; -} - double OggEncoder::encode(PcmChunk* chunk) { @@ -170,7 +165,7 @@ void OggEncoder::init() */ // while(!eos){ size_t pos(0); - headerChunk = new HeaderMessage(); + headerChunk = new HeaderMessage("ogg"); while (true) { int result=ogg_stream_flush(&os,&og); diff --git a/server/oggEncoder.h b/server/oggEncoder.h index 53c8f2c9..957ab38e 100644 --- a/server/oggEncoder.h +++ b/server/oggEncoder.h @@ -9,7 +9,6 @@ class OggEncoder : public Encoder public: OggEncoder(const SampleFormat& format); virtual double encode(PcmChunk* chunk); - virtual HeaderMessage* getHeader(); private: void init(); @@ -31,7 +30,6 @@ private: ogg_packet header_code; ogg_int64_t lastGranulepos; - HeaderMessage* headerChunk; int eos=0,ret; int i, founddata; diff --git a/server/pcmEncoder.cpp b/server/pcmEncoder.cpp index 167eb00f..c955f995 100644 --- a/server/pcmEncoder.cpp +++ b/server/pcmEncoder.cpp @@ -2,6 +2,7 @@ PcmEncoder::PcmEncoder(const SampleFormat& format) : Encoder(format) { + headerChunk = new HeaderMessage("pcm"); } diff --git a/server/serverSession.cpp b/server/serverSession.cpp index 8c0c22d1..84055435 100644 --- a/server/serverSession.cpp +++ b/server/serverSession.cpp @@ -92,10 +92,8 @@ void ServerSession::add(shared_ptr message) bool ServerSession::send(BaseMessage* message) { std::unique_lock mlock(mutex_); -//cout << "send: " << message->type << ", size: " << message->getSize() << "\n"; - if (!connected()) + if (!socket) return false; -//cout << "send: " << message->type << ", size: " << message->getSize() << "\n"; boost::asio::streambuf streambuf; std::ostream stream(&streambuf); tv t; diff --git a/server/serverSession.h b/server/serverSession.h index 1ea1a74a..3d1f5e33 100644 --- a/server/serverSession.h +++ b/server/serverSession.h @@ -34,11 +34,6 @@ public: void stop(); bool send(BaseMessage* message); void add(std::shared_ptr message); - virtual bool connected() - { - return (socket != 0); -// return (connected_ && socket); - } virtual bool active() {