/* Copyright (C) 2020 Matthias P. Braendli, matthias.braendli@mpb.li http://www.opendigitalradio.org EDI output, UDP and TCP transports and their configuration */ /* This file is part of the ODR-mmbTools. This program 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. This program 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 this program. If not, see . */ #pragma once #include "config.h" #include "EDIConfig.h" #include "AFPacket.h" #include "PFT.h" #include "Socket.h" #include #include #include #include #include #include #include #include #include namespace edi { /** Configuration for EDI output */ class Sender { public: Sender(const configuration_t& conf); Sender(const Sender&) = delete; Sender operator=(const Sender&) = delete; ~Sender(); void write(const TagPacket& tagpacket); private: void run(); bool m_udp_fragmentation_warning_printed = false; configuration_t m_conf; std::ofstream edi_debug_file; // The TagPacket will then be placed into an AFPacket edi::AFPacketiser edi_afPacketiser; // The AF Packet will be protected with reed-solomon and split in fragments edi::PFT edi_pft; std::unordered_map> udp_sockets; std::unordered_map> tcp_dispatchers; std::unordered_map> tcp_senders; // PFT spreading requires sending UDP packets at specific time, independently of // time when write() gets called std::thread m_thread; std::mutex m_mutex; bool m_running = false; std::map m_pending_frames; }; }