diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/DabMod.cpp | 15 | ||||
| -rw-r--r-- | src/InputEdiReader.cpp | 99 | ||||
| -rw-r--r-- | src/InputReader.h | 29 | 
3 files changed, 135 insertions, 8 deletions
| 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<InputZeroMQReader>();  #endif +    auto inputEdiReader = make_shared<InputEdiReader>();      auto inputTcpReader = make_shared<InputTcpReader>();      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<InputMemory> input(new InputMemory(&m.data)); -        shared_ptr<DabModulator> modulator( -                new DabModulator(tist_offset_s, tist_delay_stages, -                    tiiConfig, outputRate, clockRate, dabMode, gainMode, -                    digitalgain, normalise, filterTapsFilename)); +        auto input = make_shared<InputMemory>(&m.data); +        auto modulator = make_shared<DabModulator>( +                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 <http://www.gnu.org/licenses/>. + */ + +#include "InputReader.h" +#include "PcDebug.h" + +#include <stdexcept> +#include <memory> +#include <regex> +#include <sys/types.h> +#include <string.h> + +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<uint8_t> eti; +    while (eti.empty()) { +        rx_packet(); +        eti = m_writer.getEtiFrame(); +    } + +    assert(eti.size() == 6144); +    copy(eti.begin(), eti.end(), reinterpret_cast<uint8_t*>(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 <http://www.gnu.org/licenses/>.   */ -#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 <sys/socket.h>  #include <netinet/in.h>  #include <unistd.h> @@ -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<uint8_t> getEtiFrame(void); + +    EdiDecoder::ETIWriter m_writer; +    EdiDecoder::ETIDecoder m_decoder; + +    int m_port; +    UdpSocket m_sock; +}; +  #endif | 
