From fd6d695275f88e83ebba6fa39afc044e329a690f Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Sun, 25 Dec 2016 23:53:51 +0100 Subject: Add first version of EDI input --- src/DabMod.cpp | 15 +++++--- src/InputEdiReader.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/InputReader.h | 29 +++++++++++++-- 3 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 src/InputEdiReader.cpp (limited to 'src') diff --git a/src/DabMod.cpp b/src/DabMod.cpp index fc28218..e44ed20 100644 --- a/src/DabMod.cpp +++ b/src/DabMod.cpp @@ -187,6 +187,7 @@ int launch_modulator(int argc, char* argv[]) auto inputZeroMQReader = make_shared(); #endif + auto inputEdiReader = make_shared(); auto inputTcpReader = make_shared(); struct sigaction sa; @@ -712,6 +713,10 @@ int launch_modulator(int argc, char* argv[]) inputTcpReader->Open(inputName); m.inputReader = inputTcpReader.get(); } + else if (inputTransport == "edi") { + inputEdiReader->Open(inputName); + m.inputReader = inputEdiReader.get(); + } else { fprintf(stderr, "Error, invalid input transport %s selected!\n", inputTransport.c_str()); @@ -770,11 +775,11 @@ int launch_modulator(int argc, char* argv[]) m.flowgraph = &flowgraph; m.data.setLength(6144); - shared_ptr input(new InputMemory(&m.data)); - shared_ptr modulator( - new DabModulator(tist_offset_s, tist_delay_stages, - tiiConfig, outputRate, clockRate, dabMode, gainMode, - digitalgain, normalise, filterTapsFilename)); + auto input = make_shared(&m.data); + auto modulator = make_shared( + tist_offset_s, tist_delay_stages, + tiiConfig, outputRate, clockRate, dabMode, gainMode, + digitalgain, normalise, filterTapsFilename); flowgraph.connect(input, modulator); if (format_converter) { diff --git a/src/InputEdiReader.cpp b/src/InputEdiReader.cpp new file mode 100644 index 0000000..26cd91e --- /dev/null +++ b/src/InputEdiReader.cpp @@ -0,0 +1,99 @@ +/* + Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty + the Queen in Right of Canada (Communications Research Center Canada) + + Copyright (C) 2016 + Matthias P. Braendli, matthias.braendli@mpb.li + + http://opendigitalradio.org + */ +/* + This file is part of ODR-DabMod. + + ODR-DabMod is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + ODR-DabMod is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ODR-DabMod. If not, see . + */ + +#include "InputReader.h" +#include "PcDebug.h" + +#include +#include +#include +#include +#include + +using namespace std; + +InputEdiReader::InputEdiReader() : + m_writer(), + m_decoder(m_writer), + m_sock() +{ +} + +int InputEdiReader::Open(const std::string& uri) +{ + etiLog.level(info) << "Opening EDI :" << uri; + + const std::regex re_udp("udp://:([0-9]+)"); + std::smatch m; + if (std::regex_match(uri, m, re_udp)) { + m_port = std::stoi(m[1].str()); + + etiLog.level(info) << "EDI port :" << m_port; + return m_sock.reinit(m_port, "0.0.0.0"); + } + + return 1; +} + +void InputEdiReader::rx_packet() +{ + const size_t packsize = 8192; + UdpPacket packet(packsize); + + int ret = m_sock.receive(packet); + if (ret == 0) { + const auto &buf = packet.getBuffer(); + if (packet.getSize() == packsize) { + fprintf(stderr, "Warning, possible UDP truncation\n"); + } + + m_decoder.push_packet(buf); + } + else { + fprintf(stderr, "Socket error: %s\n", inetErrMsg); + } +} + +int InputEdiReader::GetNextFrame(void* buffer) +{ + vector eti; + while (eti.empty()) { + rx_packet(); + eti = m_writer.getEtiFrame(); + } + + assert(eti.size() == 6144); + copy(eti.begin(), eti.end(), reinterpret_cast(buffer)); + + return 6144; +} + +void InputEdiReader::PrintInfo() +{ + fprintf(stderr, "EDI Input: \n"); + fprintf(stderr, " Port : %d\n", m_port); +} + diff --git a/src/InputReader.h b/src/InputReader.h index 4d0792b..fddfccf 100644 --- a/src/InputReader.h +++ b/src/InputReader.h @@ -25,8 +25,7 @@ along with ODR-DabMod. If not, see . */ -#ifndef INPUTREADER_H -#define INPUTREADER_H +#pragma once #ifdef HAVE_CONFIG_H # include "config.h" @@ -41,6 +40,8 @@ #endif #include "porting.h" #include "Log.h" +#include "lib/edi/ETIDecoder.hpp" +#include "lib/UdpSocket.h" #include #include #include @@ -244,6 +245,28 @@ class InputZeroMQReader : public InputReader struct InputZeroMQThreadData workerdata_; }; -#endif +class InputEdiReader : public InputReader +{ +public: + InputEdiReader(); + + int Open(const std::string& uri); + + int GetNextFrame(void* buffer); + + void PrintInfo(void); + +private: + void rx_packet(void); + + std::vector getEtiFrame(void); + + EdiDecoder::ETIWriter m_writer; + EdiDecoder::ETIDecoder m_decoder; + + int m_port; + UdpSocket m_sock; +}; + #endif -- cgit v1.2.3