From 7c0ba33167476500b0593598814b95304a3d4ded Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Tue, 11 Feb 2014 13:34:25 +0100 Subject: create base class for ZMQ inputs, put AAC+ ZMQ into child class --- src/ParserConfigfile.cpp | 6 +++--- src/dabInputZmq.cpp | 38 +++++++++++++++++++++----------------- src/dabInputZmq.h | 34 +++++++++++++++++++++------------- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/src/ParserConfigfile.cpp b/src/ParserConfigfile.cpp index 9468a32..883f5fc 100644 --- a/src/ParserConfigfile.cpp +++ b/src/ParserConfigfile.cpp @@ -538,7 +538,7 @@ void setup_subchannel_from_ptree(dabSubchannel* subchan, } else if (strcmp(subchan->inputProto, "tcp") == 0) { input_is_old_style = false; - DabInputZmq* inzmq = new DabInputZmq(subchanuid); + DabInputZmqAAC* inzmq = new DabInputZmqAAC(subchanuid); inzmq->enrol_at(*rc); subchan->input = inzmq; subchan->inputName = full_inputName; @@ -546,7 +546,7 @@ void setup_subchannel_from_ptree(dabSubchannel* subchan, else if (strcmp(subchan->inputProto, "epmg") == 0) { etiLog.level(warn) << "Using untested epmg:// zeromq input"; input_is_old_style = false; - DabInputZmq* inzmq = new DabInputZmq(subchanuid); + DabInputZmqAAC* inzmq = new DabInputZmqAAC(subchanuid); inzmq->enrol_at(*rc); subchan->input = inzmq; subchan->inputName = full_inputName; @@ -554,7 +554,7 @@ void setup_subchannel_from_ptree(dabSubchannel* subchan, else if (strcmp(subchan->inputProto, "ipc") == 0) { etiLog.level(warn) << "Using untested ipc:// zeromq input"; input_is_old_style = false; - DabInputZmq* inzmq = new DabInputZmq(subchanuid); + DabInputZmqAAC* inzmq = new DabInputZmqAAC(subchanuid); inzmq->enrol_at(*rc); subchan->input = inzmq; subchan->inputName = full_inputName; diff --git a/src/dabInputZmq.cpp b/src/dabInputZmq.cpp index b54cddc..8bd351a 100644 --- a/src/dabInputZmq.cpp +++ b/src/dabInputZmq.cpp @@ -57,7 +57,9 @@ extern StatsServer* global_stats; -int DabInputZmq::open(const std::string inputUri) +/***** Common functions (MPEG and AAC) ******/ + +int DabInputZmqBase::open(const std::string inputUri) { // Prepare the ZMQ socket to accept connections try { @@ -84,8 +86,22 @@ int DabInputZmq::open(const std::string inputUri) return 0; } +int DabInputZmqBase::close() +{ + m_zmq_sock.close(); + return 0; +} + +int DabInputZmqBase::setBitrate(int bitrate) +{ + m_bitrate = bitrate; + return bitrate; // TODO do a nice check here +} + +/******** AAC+ input ******/ + // size corresponds to a frame size. It is constant for a given bitrate -int DabInputZmq::readFrame(void* buffer, int size) +int DabInputZmqAAC::readFrame(void* buffer, int size) { int rc; @@ -171,7 +187,7 @@ int DabInputZmq::readFrame(void* buffer, int size) } // Read a superframe from the socket, cut it into five frames, and push to list -int DabInputZmq::readFromSocket(int framesize) +int DabInputZmqAAC::readFromSocket(int framesize) { int rc; bool messageReceived; @@ -226,21 +242,9 @@ int DabInputZmq::readFromSocket(int framesize) return msg.size(); } -int DabInputZmq::close() -{ - m_zmq_sock.close(); - return 0; -} - -int DabInputZmq::setBitrate(int bitrate) -{ - m_bitrate = bitrate; - return bitrate; // TODO do a nice check here -} - /********* REMOTE CONTROL ***********/ -void DabInputZmq::set_parameter(string parameter, string value) +void DabInputZmqBase::set_parameter(string parameter, string value) { stringstream ss(value); ss.exceptions ( stringstream::failbit | stringstream::badbit ); @@ -256,7 +260,7 @@ void DabInputZmq::set_parameter(string parameter, string value) } } -string DabInputZmq::get_parameter(string parameter) +string DabInputZmqBase::get_parameter(string parameter) { stringstream ss; if (parameter == "buffer") { diff --git a/src/dabInputZmq.h b/src/dabInputZmq.h index 7420c4b..97dd911 100644 --- a/src/dabInputZmq.h +++ b/src/dabInputZmq.h @@ -60,21 +60,16 @@ // Maximum frame_buffer size in number of elements #define INPUT_ZMQ_MAX_BUFFER_SIZE (5*8) // 960ms - -class DabInputZmq : public DabInputBase, public RemoteControllable { +class DabInputZmqBase : public DabInputBase, public RemoteControllable { public: - DabInputZmq(const std::string name) + DabInputZmqBase(const std::string name) : RemoteControllable(name), m_name(name), m_zmq_context(1), m_zmq_sock(m_zmq_context, ZMQ_SUB), - m_prebuffering(INPUT_ZMQ_PREBUFFERING), - m_bitrate(0) { - RC_ADD_PARAMETER(buffer, - "Size of the input buffer [aac superframes]"); - } + m_bitrate(0) { } virtual int open(const std::string inputUri); - virtual int readFrame(void* buffer, int size); + virtual int readFrame(void* buffer, int size) = 0; virtual int setBitrate(int bitrate); virtual int close(); @@ -84,15 +79,28 @@ class DabInputZmq : public DabInputBase, public RemoteControllable { /* Getting a parameter always returns a string. */ virtual string get_parameter(string parameter); - private: - int readFromSocket(int framesize); - + protected: std::string m_name; zmq::context_t m_zmq_context; zmq::socket_t m_zmq_sock; // handle for the zmq socket + int m_bitrate; +}; + +class DabInputZmqAAC : public DabInputZmqBase { + public: + DabInputZmqAAC(const std::string name) + : DabInputZmqBase(name), + m_prebuffering(INPUT_ZMQ_PREBUFFERING) { + RC_ADD_PARAMETER(buffer, + "Size of the input buffer [aac superframes]"); + } + + virtual int readFrame(void* buffer, int size); + private: + int readFromSocket(int framesize); + int m_prebuffering; std::list m_frame_buffer; //stores elements of type char[] - int m_bitrate; }; #endif // HAVE_INPUT_ZMQ -- cgit v1.2.3