diff options
author | Matthias P. Braendli (think) <matthias@mpb.li> | 2013-11-08 14:43:19 +0100 |
---|---|---|
committer | Matthias P. Braendli (think) <matthias@mpb.li> | 2013-11-08 14:43:19 +0100 |
commit | c5306f81a9d3b87df7e16c852f2505ac913193ca (patch) | |
tree | 40716835305aa871cae5a5b3c805f0c673f47108 /src | |
parent | 573c7b63092618ecae86847d9d0a143801db0780 (diff) | |
download | dabmux-c5306f81a9d3b87df7e16c852f2505ac913193ca.tar.gz dabmux-c5306f81a9d3b87df7e16c852f2505ac913193ca.tar.bz2 dabmux-c5306f81a9d3b87df7e16c852f2505ac913193ca.zip |
make dabOutput more object-oriented
Diffstat (limited to 'src')
-rw-r--r-- | src/DabMux.cpp | 54 | ||||
-rw-r--r-- | src/DabMux.h | 2 | ||||
-rw-r--r-- | src/Makefile.am | 8 | ||||
-rw-r--r-- | src/Makefile.in | 366 | ||||
-rw-r--r-- | src/MuxElements.h | 16 | ||||
-rw-r--r-- | src/ParserCmdline.cpp | 26 | ||||
-rw-r--r-- | src/ParserConfigfile.cpp | 29 | ||||
-rw-r--r-- | src/dabOutput.cpp | 1112 | ||||
-rw-r--r-- | src/dabOutput.h | 72 | ||||
-rw-r--r-- | src/dabOutput/dabOutput.cpp | 109 | ||||
-rw-r--r-- | src/dabOutput/dabOutput.h | 248 | ||||
-rw-r--r-- | src/dabOutput/dabOutputFifo.cpp | 48 | ||||
-rw-r--r-- | src/dabOutput/dabOutputFile.cpp | 111 | ||||
-rw-r--r-- | src/dabOutput/dabOutputRaw.cpp | 366 | ||||
-rw-r--r-- | src/dabOutput/dabOutputSimul.cpp | 70 | ||||
-rw-r--r-- | src/dabOutput/dabOutputTcp.cpp | 154 | ||||
-rw-r--r-- | src/dabOutput/dabOutputUdp.cpp | 82 | ||||
-rw-r--r-- | src/utils.cpp | 4 |
18 files changed, 1520 insertions, 1357 deletions
diff --git a/src/DabMux.cpp b/src/DabMux.cpp index 8a065a0..0e97340 100644 --- a/src/DabMux.cpp +++ b/src/DabMux.cpp @@ -72,6 +72,7 @@ typedef DWORD32 uint32_t; # include <sys/socket.h> # include <sys/ioctl.h> # include <sys/times.h> +# include <sys/resource.h> # include <linux/if_packet.h> # include <linux/netdevice.h> @@ -105,7 +106,7 @@ typedef DWORD32 uint32_t; #include "dabInputDmbUdp.h" -#include "dabOutput.h" +#include "dabOutput/dabOutput.h" #include "crc.h" #include "UdpSocket.h" #include "InetAddress.h" @@ -363,15 +364,10 @@ int main(int argc, char *argv[]) if (outputs.size() == 0) { etiLog.printHeader(TcpLog::WARNING, "no output defined\n"); - outputs.push_back(new dabOutput); + // initialise a new dabOutput + outputs.push_back(new dabOutput("simul", NULL)); output = outputs.end() - 1; - memset(*output, 0, sizeof(dabOutput)); - (*output)->outputProto = "simul"; - (*output)->outputName = NULL; - (*output)->data = NULL; - (*output)->operations = dabOutputDefaultOperations; - printf("Press enter to continue\n"); getchar(); } @@ -473,46 +469,46 @@ int main(int argc, char *argv[]) for (output = outputs.begin(); output != outputs.end() ; ++output) { #if defined(HAVE_OUTPUT_FILE) - if (strcmp((*output)->outputProto, "file") == 0) { - (*output)->operations = dabOutputFileOperations; + if ((*output)->outputProto == "file") { + (*output)->output = new DabOutputFile(); #else // !defined(HAVE_OUTPUT_FILE) if (0) { #endif // defined(HAVE_OUTPUT_FILE) #if defined(HAVE_OUTPUT_FIFO) - } else if (strcmp((*output)->outputProto, "fifo") == 0) { - (*output)->operations = dabOutputFifoOperations; + } else if ((*output)->outputProto == "fifo") { + (*output)->output = new DabOutputFifo(); #endif // !defined(HAVE_OUTPUT_FIFO) #if defined(HAVE_OUTPUT_RAW) - } else if (strcmp((*output)->outputProto, "raw") == 0) { - (*output)->operations = dabOutputRawOperations; + } else if ((*output)->outputProto == "raw") { + (*output)->output = new DabOutputRaw(); #endif // defined(HAVE_OUTPUT_RAW) #if defined(HAVE_OUTPUT_UDP) - } else if (strcmp((*output)->outputProto, "udp") == 0) { - (*output)->operations = dabOutputUdpOperations; + } else if ((*output)->outputProto == "udp") { + (*output)->output = new DabOutputUdp(); #endif // defined(HAVE_OUTPUT_UDP) #if defined(HAVE_OUTPUT_TCP) - } else if (strcmp((*output)->outputProto, "tcp") == 0) { - (*output)->operations = dabOutputTcpOperations; + } else if ((*output)->outputProto == "tcp") { + (*output)->output = new DabOutputTcp(); #endif // defined(HAVE_OUTPUT_TCP) #if defined(HAVE_OUTPUT_SIMUL) - } else if (strcmp((*output)->outputProto, "simul") == 0) { - (*output)->operations = dabOutputSimulOperations; + } else if ((*output)->outputProto == "simul") { + (*output)->output = new DabOutputSimul(); #endif // defined(HAVE_OUTPUT_SIMUL) } else { etiLog.printHeader(TcpLog::ERR, "Output protcol unknown: %s\n", - (*output)->outputProto); + (*output)->outputProto.c_str()); goto EXIT; } - if ((*output)->operations.init(&(*output)->data) == -1) { + if ((*output)->output == NULL) { etiLog.printHeader(TcpLog::ERR, "Unable to init output %s://%s\n", - (*output)->outputProto, (*output)->outputName); + (*output)->outputProto.c_str(), (*output)->outputName.c_str()); return -1; } - if ((*output)->operations.open((*output)->data, (*output)->outputName) + if ((*output)->output->Open((*output)->outputName) == -1) { etiLog.printHeader(TcpLog::ERR, "Unable to open output %s://%s\n", - (*output)->outputProto, (*output)->outputName); + (*output)->outputProto.c_str(), (*output)->outputName.c_str()); return -1; } } @@ -1788,10 +1784,10 @@ int main(int argc, char *argv[]) // Give the data to the outputs for (output = outputs.begin() ; output != outputs.end(); ++output) { - if ((*output)->operations.write((*output)->data, etiFrame, index) + if ((*output)->output->Write(etiFrame, index) == -1) { etiLog.print(TcpLog::ERR, "Can't write to output %s://%s\n", - (*output)->outputProto, (*output)->outputName); + (*output)->outputProto.c_str(), (*output)->outputName.c_str()); } } @@ -1823,8 +1819,8 @@ EXIT: (*subchannel)->operations.clean(&(*subchannel)->data); } for (output = outputs.begin() ; output != outputs.end(); ++output) { - (*output)->operations.close((*output)->data); - (*output)->operations.clean(&(*output)->data); + (*output)->output->Close(); + delete ((*output)->output); } for_each(ensemble->components.begin(), ensemble->components.end(), free); diff --git a/src/DabMux.h b/src/DabMux.h index be5c25a..517e36b 100644 --- a/src/DabMux.h +++ b/src/DabMux.h @@ -32,7 +32,7 @@ #include <functional> #include <algorithm> #include <stdint.h> -#include "dabOutput.h" +#include "dabOutput/dabOutput.h" #include "dabInput.h" #include "Eti.h" #include "MuxElements.h" diff --git a/src/Makefile.am b/src/Makefile.am index 8a63e83..b67a09c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -46,7 +46,13 @@ CRC_DabMux_SOURCES =DabMux.cpp \ dabInputSlip.h dabInputSlip.cpp \ dabInputTest.h dabInputTest.cpp \ dabInputUdp.h dabInputUdp.cpp \ - dabOutput.h dabOutput.cpp \ + dabOutput/dabOutput.h \ + dabOutput/dabOutputFile.cpp \ + dabOutput/dabOutputFifo.cpp \ + dabOutput/dabOutputRaw.cpp \ + dabOutput/dabOutputSimul.cpp \ + dabOutput/dabOutputTcp.cpp \ + dabOutput/dabOutputUdp.cpp \ bridge.h bridge.c \ utils.cpp utils.h \ MuxElements.cpp MuxElements.h \ diff --git a/src/Makefile.in b/src/Makefile.in index 5343fb3..0daffbd 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -37,23 +36,51 @@ # along with CRC-DabMux. If not, see <http://www.gnu.org/licenses/>. VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ esac; \ - test $$am__dry = yes; \ - } + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -75,7 +102,8 @@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = CRC-DabMux$(EXEEXT) CRC-BridgeTest$(EXEEXT) subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build-aux/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_boost_base.m4 \ $(top_srcdir)/configure.ac @@ -93,6 +121,7 @@ CRC_BridgeTest_OBJECTS = $(am_CRC_BridgeTest_OBJECTS) CRC_BridgeTest_LDADD = $(LDADD) CRC_BridgeTest_LINK = $(CCLD) $(CRC_BridgeTest_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__dirstamp = $(am__leading_dot)dirstamp am_CRC_DabMux_OBJECTS = CRC_DabMux-DabMux.$(OBJEXT) \ CRC_DabMux-dabInput.$(OBJEXT) \ CRC_DabMux-dabInputBridgeUdp.$(OBJEXT) \ @@ -113,8 +142,14 @@ am_CRC_DabMux_OBJECTS = CRC_DabMux-DabMux.$(OBJEXT) \ CRC_DabMux-dabInputSlip.$(OBJEXT) \ CRC_DabMux-dabInputTest.$(OBJEXT) \ CRC_DabMux-dabInputUdp.$(OBJEXT) \ - CRC_DabMux-dabOutput.$(OBJEXT) CRC_DabMux-bridge.$(OBJEXT) \ - CRC_DabMux-utils.$(OBJEXT) CRC_DabMux-MuxElements.$(OBJEXT) \ + dabOutput/CRC_DabMux-dabOutputFile.$(OBJEXT) \ + dabOutput/CRC_DabMux-dabOutputFifo.$(OBJEXT) \ + dabOutput/CRC_DabMux-dabOutputRaw.$(OBJEXT) \ + dabOutput/CRC_DabMux-dabOutputSimul.$(OBJEXT) \ + dabOutput/CRC_DabMux-dabOutputTcp.$(OBJEXT) \ + dabOutput/CRC_DabMux-dabOutputUdp.$(OBJEXT) \ + CRC_DabMux-bridge.$(OBJEXT) CRC_DabMux-utils.$(OBJEXT) \ + CRC_DabMux-MuxElements.$(OBJEXT) \ CRC_DabMux-ParserCmdline.$(OBJEXT) \ CRC_DabMux-ParserConfigfile.$(OBJEXT) CRC_DabMux-Eti.$(OBJEXT) \ CRC_DabMux-TcpLog.$(OBJEXT) CRC_DabMux-UdpSocket.$(OBJEXT) \ @@ -126,6 +161,18 @@ am_CRC_DabMux_OBJECTS = CRC_DabMux-DabMux.$(OBJEXT) \ CRC_DabMux_OBJECTS = $(am_CRC_DabMux_OBJECTS) am__DEPENDENCIES_1 = CRC_DabMux_DEPENDENCIES = $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles @@ -133,33 +180,32 @@ am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent +am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = SOURCES = $(CRC_BridgeTest_SOURCES) $(CRC_DabMux_SOURCES) DIST_SOURCES = $(CRC_BridgeTest_SOURCES) $(CRC_DabMux_SOURCES) am__can_run_installinfo = \ @@ -167,6 +213,23 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -304,7 +367,13 @@ CRC_DabMux_SOURCES = DabMux.cpp \ dabInputSlip.h dabInputSlip.cpp \ dabInputTest.h dabInputTest.cpp \ dabInputUdp.h dabInputUdp.cpp \ - dabOutput.h dabOutput.cpp \ + dabOutput/dabOutput.h \ + dabOutput/dabOutputFile.cpp \ + dabOutput/dabOutputFifo.cpp \ + dabOutput/dabOutputRaw.cpp \ + dabOutput/dabOutputSimul.cpp \ + dabOutput/dabOutputTcp.cpp \ + dabOutput/dabOutputUdp.cpp \ bridge.h bridge.c \ utils.cpp utils.h \ MuxElements.cpp MuxElements.h \ @@ -372,10 +441,11 @@ install-binPROGRAMS: $(bin_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -396,22 +466,44 @@ uninstall-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + CRC-BridgeTest$(EXEEXT): $(CRC_BridgeTest_OBJECTS) $(CRC_BridgeTest_DEPENDENCIES) $(EXTRA_CRC_BridgeTest_DEPENDENCIES) @rm -f CRC-BridgeTest$(EXEEXT) $(AM_V_CCLD)$(CRC_BridgeTest_LINK) $(CRC_BridgeTest_OBJECTS) $(CRC_BridgeTest_LDADD) $(LIBS) +dabOutput/$(am__dirstamp): + @$(MKDIR_P) dabOutput + @: > dabOutput/$(am__dirstamp) +dabOutput/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) dabOutput/$(DEPDIR) + @: > dabOutput/$(DEPDIR)/$(am__dirstamp) +dabOutput/CRC_DabMux-dabOutputFile.$(OBJEXT): \ + dabOutput/$(am__dirstamp) dabOutput/$(DEPDIR)/$(am__dirstamp) +dabOutput/CRC_DabMux-dabOutputFifo.$(OBJEXT): \ + dabOutput/$(am__dirstamp) dabOutput/$(DEPDIR)/$(am__dirstamp) +dabOutput/CRC_DabMux-dabOutputRaw.$(OBJEXT): \ + dabOutput/$(am__dirstamp) dabOutput/$(DEPDIR)/$(am__dirstamp) +dabOutput/CRC_DabMux-dabOutputSimul.$(OBJEXT): \ + dabOutput/$(am__dirstamp) dabOutput/$(DEPDIR)/$(am__dirstamp) +dabOutput/CRC_DabMux-dabOutputTcp.$(OBJEXT): \ + dabOutput/$(am__dirstamp) dabOutput/$(DEPDIR)/$(am__dirstamp) +dabOutput/CRC_DabMux-dabOutputUdp.$(OBJEXT): \ + dabOutput/$(am__dirstamp) dabOutput/$(DEPDIR)/$(am__dirstamp) + CRC-DabMux$(EXEEXT): $(CRC_DabMux_OBJECTS) $(CRC_DabMux_DEPENDENCIES) $(EXTRA_CRC_DabMux_DEPENDENCIES) @rm -f CRC-DabMux$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(CRC_DabMux_OBJECTS) $(CRC_DabMux_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f dabOutput/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @@ -452,25 +544,32 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CRC_DabMux-dabInputSlip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CRC_DabMux-dabInputTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CRC_DabMux-dabInputUdp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CRC_DabMux-dabOutput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CRC_DabMux-dabUtils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CRC_DabMux-mpeg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CRC_DabMux-prbs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CRC_DabMux-utils.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFifo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputRaw.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputSimul.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputTcp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputUdp.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` CRC_BridgeTest-bridge.o: bridge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CRC_BridgeTest_CFLAGS) $(CFLAGS) -MT CRC_BridgeTest-bridge.o -MD -MP -MF $(DEPDIR)/CRC_BridgeTest-bridge.Tpo -c -o CRC_BridgeTest-bridge.o `test -f 'bridge.c' || echo '$(srcdir)/'`bridge.c @@ -557,15 +656,17 @@ CRC_DabMux-mpeg.obj: mpeg.c @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o CRC_DabMux-mpeg.obj `if test -f 'mpeg.c'; then $(CYGPATH_W) 'mpeg.c'; else $(CYGPATH_W) '$(srcdir)/mpeg.c'; fi` .cpp.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` @@ -850,19 +951,89 @@ CRC_DabMux-dabInputUdp.obj: dabInputUdp.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CRC_DabMux-dabInputUdp.obj `if test -f 'dabInputUdp.cpp'; then $(CYGPATH_W) 'dabInputUdp.cpp'; else $(CYGPATH_W) '$(srcdir)/dabInputUdp.cpp'; fi` -CRC_DabMux-dabOutput.o: dabOutput.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CRC_DabMux-dabOutput.o -MD -MP -MF $(DEPDIR)/CRC_DabMux-dabOutput.Tpo -c -o CRC_DabMux-dabOutput.o `test -f 'dabOutput.cpp' || echo '$(srcdir)/'`dabOutput.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CRC_DabMux-dabOutput.Tpo $(DEPDIR)/CRC_DabMux-dabOutput.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput.cpp' object='CRC_DabMux-dabOutput.o' libtool=no @AMDEPBACKSLASH@ +dabOutput/CRC_DabMux-dabOutputFile.o: dabOutput/dabOutputFile.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputFile.o -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFile.Tpo -c -o dabOutput/CRC_DabMux-dabOutputFile.o `test -f 'dabOutput/dabOutputFile.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputFile.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFile.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFile.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputFile.cpp' object='dabOutput/CRC_DabMux-dabOutputFile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CRC_DabMux-dabOutput.o `test -f 'dabOutput.cpp' || echo '$(srcdir)/'`dabOutput.cpp +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputFile.o `test -f 'dabOutput/dabOutputFile.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputFile.cpp -CRC_DabMux-dabOutput.obj: dabOutput.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CRC_DabMux-dabOutput.obj -MD -MP -MF $(DEPDIR)/CRC_DabMux-dabOutput.Tpo -c -o CRC_DabMux-dabOutput.obj `if test -f 'dabOutput.cpp'; then $(CYGPATH_W) 'dabOutput.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CRC_DabMux-dabOutput.Tpo $(DEPDIR)/CRC_DabMux-dabOutput.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput.cpp' object='CRC_DabMux-dabOutput.obj' libtool=no @AMDEPBACKSLASH@ +dabOutput/CRC_DabMux-dabOutputFile.obj: dabOutput/dabOutputFile.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputFile.obj -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFile.Tpo -c -o dabOutput/CRC_DabMux-dabOutputFile.obj `if test -f 'dabOutput/dabOutputFile.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputFile.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputFile.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFile.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFile.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputFile.cpp' object='dabOutput/CRC_DabMux-dabOutputFile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CRC_DabMux-dabOutput.obj `if test -f 'dabOutput.cpp'; then $(CYGPATH_W) 'dabOutput.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput.cpp'; fi` +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputFile.obj `if test -f 'dabOutput/dabOutputFile.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputFile.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputFile.cpp'; fi` + +dabOutput/CRC_DabMux-dabOutputFifo.o: dabOutput/dabOutputFifo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputFifo.o -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFifo.Tpo -c -o dabOutput/CRC_DabMux-dabOutputFifo.o `test -f 'dabOutput/dabOutputFifo.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputFifo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFifo.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFifo.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputFifo.cpp' object='dabOutput/CRC_DabMux-dabOutputFifo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputFifo.o `test -f 'dabOutput/dabOutputFifo.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputFifo.cpp + +dabOutput/CRC_DabMux-dabOutputFifo.obj: dabOutput/dabOutputFifo.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputFifo.obj -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFifo.Tpo -c -o dabOutput/CRC_DabMux-dabOutputFifo.obj `if test -f 'dabOutput/dabOutputFifo.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputFifo.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputFifo.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFifo.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputFifo.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputFifo.cpp' object='dabOutput/CRC_DabMux-dabOutputFifo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputFifo.obj `if test -f 'dabOutput/dabOutputFifo.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputFifo.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputFifo.cpp'; fi` + +dabOutput/CRC_DabMux-dabOutputRaw.o: dabOutput/dabOutputRaw.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputRaw.o -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputRaw.Tpo -c -o dabOutput/CRC_DabMux-dabOutputRaw.o `test -f 'dabOutput/dabOutputRaw.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputRaw.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputRaw.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputRaw.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputRaw.cpp' object='dabOutput/CRC_DabMux-dabOutputRaw.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputRaw.o `test -f 'dabOutput/dabOutputRaw.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputRaw.cpp + +dabOutput/CRC_DabMux-dabOutputRaw.obj: dabOutput/dabOutputRaw.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputRaw.obj -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputRaw.Tpo -c -o dabOutput/CRC_DabMux-dabOutputRaw.obj `if test -f 'dabOutput/dabOutputRaw.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputRaw.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputRaw.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputRaw.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputRaw.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputRaw.cpp' object='dabOutput/CRC_DabMux-dabOutputRaw.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputRaw.obj `if test -f 'dabOutput/dabOutputRaw.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputRaw.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputRaw.cpp'; fi` + +dabOutput/CRC_DabMux-dabOutputSimul.o: dabOutput/dabOutputSimul.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputSimul.o -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputSimul.Tpo -c -o dabOutput/CRC_DabMux-dabOutputSimul.o `test -f 'dabOutput/dabOutputSimul.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputSimul.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputSimul.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputSimul.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputSimul.cpp' object='dabOutput/CRC_DabMux-dabOutputSimul.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputSimul.o `test -f 'dabOutput/dabOutputSimul.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputSimul.cpp + +dabOutput/CRC_DabMux-dabOutputSimul.obj: dabOutput/dabOutputSimul.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputSimul.obj -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputSimul.Tpo -c -o dabOutput/CRC_DabMux-dabOutputSimul.obj `if test -f 'dabOutput/dabOutputSimul.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputSimul.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputSimul.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputSimul.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputSimul.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputSimul.cpp' object='dabOutput/CRC_DabMux-dabOutputSimul.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputSimul.obj `if test -f 'dabOutput/dabOutputSimul.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputSimul.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputSimul.cpp'; fi` + +dabOutput/CRC_DabMux-dabOutputTcp.o: dabOutput/dabOutputTcp.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputTcp.o -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputTcp.Tpo -c -o dabOutput/CRC_DabMux-dabOutputTcp.o `test -f 'dabOutput/dabOutputTcp.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputTcp.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputTcp.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputTcp.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputTcp.cpp' object='dabOutput/CRC_DabMux-dabOutputTcp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputTcp.o `test -f 'dabOutput/dabOutputTcp.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputTcp.cpp + +dabOutput/CRC_DabMux-dabOutputTcp.obj: dabOutput/dabOutputTcp.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputTcp.obj -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputTcp.Tpo -c -o dabOutput/CRC_DabMux-dabOutputTcp.obj `if test -f 'dabOutput/dabOutputTcp.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputTcp.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputTcp.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputTcp.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputTcp.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputTcp.cpp' object='dabOutput/CRC_DabMux-dabOutputTcp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputTcp.obj `if test -f 'dabOutput/dabOutputTcp.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputTcp.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputTcp.cpp'; fi` + +dabOutput/CRC_DabMux-dabOutputUdp.o: dabOutput/dabOutputUdp.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputUdp.o -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputUdp.Tpo -c -o dabOutput/CRC_DabMux-dabOutputUdp.o `test -f 'dabOutput/dabOutputUdp.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputUdp.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputUdp.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputUdp.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputUdp.cpp' object='dabOutput/CRC_DabMux-dabOutputUdp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputUdp.o `test -f 'dabOutput/dabOutputUdp.cpp' || echo '$(srcdir)/'`dabOutput/dabOutputUdp.cpp + +dabOutput/CRC_DabMux-dabOutputUdp.obj: dabOutput/dabOutputUdp.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dabOutput/CRC_DabMux-dabOutputUdp.obj -MD -MP -MF dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputUdp.Tpo -c -o dabOutput/CRC_DabMux-dabOutputUdp.obj `if test -f 'dabOutput/dabOutputUdp.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputUdp.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputUdp.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputUdp.Tpo dabOutput/$(DEPDIR)/CRC_DabMux-dabOutputUdp.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dabOutput/dabOutputUdp.cpp' object='dabOutput/CRC_DabMux-dabOutputUdp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dabOutput/CRC_DabMux-dabOutputUdp.obj `if test -f 'dabOutput/dabOutputUdp.cpp'; then $(CYGPATH_W) 'dabOutput/dabOutputUdp.cpp'; else $(CYGPATH_W) '$(srcdir)/dabOutput/dabOutputUdp.cpp'; fi` CRC_DabMux-utils.o: utils.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CRC_DabMux-utils.o -MD -MP -MF $(DEPDIR)/CRC_DabMux-utils.Tpo -c -o CRC_DabMux-utils.o `test -f 'utils.cpp' || echo '$(srcdir)/'`utils.cpp @@ -1060,26 +1231,15 @@ CRC_DabMux-TcpSocket.obj: TcpSocket.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CRC_DabMux_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CRC_DabMux-TcpSocket.obj `if test -f 'TcpSocket.cpp'; then $(CYGPATH_W) 'TcpSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/TcpSocket.cpp'; fi` -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -1091,15 +1251,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -1108,6 +1264,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -1175,6 +1346,8 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f dabOutput/$(DEPDIR)/$(am__dirstamp) + -rm -f dabOutput/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -1184,7 +1357,7 @@ clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -rf ./$(DEPDIR) dabOutput/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1230,7 +1403,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -rf ./$(DEPDIR) dabOutput/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1250,17 +1423,18 @@ uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-local ctags distclean distclean-compile \ - distclean-generic distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic clean-local cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS diff --git a/src/MuxElements.h b/src/MuxElements.h index a27f805..539d955 100644 --- a/src/MuxElements.h +++ b/src/MuxElements.h @@ -32,17 +32,23 @@ #include <functional> #include <algorithm> #include <stdint.h> -#include "dabOutput.h" +#include "dabOutput/dabOutput.h" #include "dabInput.h" #include "Eti.h" using namespace std; struct dabOutput { - const char* outputProto; - const char* outputName; - void* data; - dabOutputOperations operations; + dabOutput(const char* proto, const char* name) : + outputProto(proto), outputName(name), output(NULL) { } + + // outputs are specified with outputProto://outputName + // during config parsing + std::string outputProto; + std::string outputName; + + // later, the corresponding output is then created + DabOutput* output; }; diff --git a/src/ParserCmdline.cpp b/src/ParserCmdline.cpp index 7fb2632..33896b6 100644 --- a/src/ParserCmdline.cpp +++ b/src/ParserCmdline.cpp @@ -34,7 +34,7 @@ #include <vector> #include <stdint.h> #include <cstring> -#include "dabOutput.h" +#include "dabOutput/dabOutput.h" #include "dabInput.h" #include "utils.h" #include "dabInputFile.h" @@ -124,15 +124,6 @@ bool parse_cmdline(char **argv, } switch (c) { case 'O': - outputs.push_back(new dabOutput); - output = outputs.end() - 1; - - memset(*output, 0, sizeof(dabOutput)); - (*output)->outputProto = NULL; - (*output)->outputName = NULL; - (*output)->data = NULL; - (*output)->operations = dabOutputDefaultOperations; - char* proto; proto = strstr(optarg, "://"); @@ -141,10 +132,11 @@ bool parse_cmdline(char **argv, "No protocol defined for output\n"); goto EXIT; } else { - (*output)->outputProto = optarg; - (*output)->outputName = proto + 3; - *proto = 0; + *proto = 0; // terminate optarg + outputs.push_back(new dabOutput(optarg, proto + 3)); + output = outputs.end() - 1; } + subchannel = ensemble->subchannels.end(); protection = NULL; component = ensemble->components.end(); @@ -803,15 +795,9 @@ bool parse_cmdline(char **argv, case 'r': etiLog.printHeader(TcpLog::INFO, "Enabling throttled output using simul, one frame every 24ms\n"); - outputs.push_back(new dabOutput); + outputs.push_back(new dabOutput("simul", NULL)); output = outputs.end() - 1; - memset(*output, 0, sizeof(dabOutput)); - (*output)->outputProto = "simul"; - (*output)->outputName = ""; - (*output)->data = NULL; - (*output)->operations = dabOutputDefaultOperations; - subchannel = ensemble->subchannels.end(); protection = NULL; component = ensemble->components.end(); diff --git a/src/ParserConfigfile.cpp b/src/ParserConfigfile.cpp index 3746a1e..860b9b1 100644 --- a/src/ParserConfigfile.cpp +++ b/src/ParserConfigfile.cpp @@ -40,7 +40,7 @@ #include <string> #include <map> #include <cstring> -#include "dabOutput.h" +#include "dabOutput/dabOutput.h" #include "dabInput.h" #include "utils.h" #include "dabInputFile.h" @@ -374,32 +374,23 @@ void parse_configfile(string configuration_file, string outputuid = it->first; string uri = pt_outputs.get<string>(outputuid); - dabOutput* output = new dabOutput(); - - outputs.push_back(output); - - memset(output, 0, sizeof(dabOutput)); - output->outputProto = NULL; - output->outputName = NULL; - output->data = NULL; - output->operations = dabOutputDefaultOperations; - int proto_pos = uri.find("://"); if (proto_pos == std::string::npos) { stringstream ss; ss << "Output with uid " << outputuid << " no protocol defined!"; throw runtime_error(ss.str()); - } else { + } - char* uri_c = new char[512]; - memset(uri_c, 0, 512); - uri.copy(uri_c, 511); + char* uri_c = new char[512]; + memset(uri_c, 0, 512); + uri.copy(uri_c, 511); - uri_c[proto_pos] = '\0'; + uri_c[proto_pos] = '\0'; - output->outputProto = uri_c; - output->outputName = output->outputProto + proto_pos + 3; - } + char* outputName = uri_c + proto_pos + 3; + + dabOutput* output = new dabOutput(uri_c, outputName); + outputs.push_back(output); // keep outputs in map, and check for uniqueness of the uid if (alloutputs.count(outputuid) == 0) { diff --git a/src/dabOutput.cpp b/src/dabOutput.cpp deleted file mode 100644 index 5351501..0000000 --- a/src/dabOutput.cpp +++ /dev/null @@ -1,1112 +0,0 @@ -/* - Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Her Majesty the Queen in - Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of CRC-DabMux. - - CRC-DabMux 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. - - CRC-DabMux 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 CRC-DabMux. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "dabOutput.h" -#include "UdpSocket.h" - -#include <string.h> -#include <stdio.h> -#include <fcntl.h> -#include <limits.h> - -#ifdef _WIN32 -# include <io.h> -# ifdef __MINGW32__ -# define FS_DECLARE_CFG_ARRAYS -# include <winioctl.h> -# endif -# include <sdci.h> -#else -# include <farsync.h> -# include <unistd.h> -# include <sys/time.h> -# ifndef O_BINARY -# define O_BINARY 0 -# endif // O_BINARY -#endif - - -int dabOutputDefaultInit(void** args) { - return -1; -} - - -int dabOutputDefaultOpen(void* args, const char* filename) -{ - return -1; -} - - -int dabOutputDefaultWrite(void* args, void* buffer, int size) -{ - return -1; -} - - -int dabOutputDefaultClose(void* args) -{ - return -1; -} - - -int dabOutputDefaultClean(void** args) -{ - return -1; -} - - -struct dabOutputOperations dabOutputDefaultOperations = { - dabOutputDefaultInit, - dabOutputDefaultOpen, - dabOutputDefaultWrite, - dabOutputDefaultClose, - dabOutputDefaultClean -}; - - -enum EtiFileType { - ETI_FILE_TYPE_NONE = 0, - ETI_FILE_TYPE_RAW, - ETI_FILE_TYPE_STREAMED, - ETI_FILE_TYPE_FRAMED -}; - - -struct dabOutputFifoData { - int file; - EtiFileType type; - unsigned long nbFrames; -}; - - -int dabOutputFifoInit(void** args) -{ - dabOutputFifoData* data = new dabOutputFifoData; - - *args = data; - data->file = -1; - data->type = ETI_FILE_TYPE_STREAMED; - data->nbFrames = 0; - return 0; -} - - -int dabOutputFifoOpen(void* args, const char* filename) -{ - dabOutputFifoData* data = (dabOutputFifoData*)args; - - char* token = strchr((char*)filename, '?'); - if (token != NULL) { - *(token++) = 0; - char* nextPair; - char* key; - char* value; - do { - nextPair = strchr(token, '&'); - if (nextPair != NULL) { - *nextPair = 0; - } - key = token; - value = strchr(token, '='); - if (value != NULL) { - *(value++) = 0; - if (strcmp(key, "type") == 0) { - if (strcmp(value, "raw") == 0) { - data->type = ETI_FILE_TYPE_RAW; - break; - } else if (strcmp(value, "framed") == 0) { - data->type = ETI_FILE_TYPE_FRAMED; - break; - } else if (strcmp(value, "streamed") == 0) { - data->type = ETI_FILE_TYPE_STREAMED; - break; - } else { - etiLog.printHeader(TcpLog::ERR, - "File type '%s' is not supported.\n", value); - return -1; - } - } - } - } while (nextPair != NULL); - } - - data->file = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); - if (data->file == -1) { - perror(filename); - return -1; - } - return 0; -} - - -int dabOutputFifoWrite(void* args, void* buffer, int size) -{ - dabOutputFifoData* data = (dabOutputFifoData*)args; - uint8_t padding[6144]; - - switch (data->type) { - case ETI_FILE_TYPE_FRAMED: - if (data->nbFrames == 0) { - uint32_t nbFrames = (uint32_t)-1; - // Writting nb frame - if (write(data->file, &nbFrames, 4) == -1) goto FIFO_WRITE_ERROR; - } - case ETI_FILE_TYPE_STREAMED: - // Writting frame length - if (write(data->file, &size, 2) == -1) goto FIFO_WRITE_ERROR; - // Appending data - if (write(data->file, buffer, size) == -1) goto FIFO_WRITE_ERROR; - break; - case ETI_FILE_TYPE_RAW: - // Appending data - if (write(data->file, buffer, size) == -1) goto FIFO_WRITE_ERROR; - // Appending padding - memset(padding, 0x55, 6144 - size); - if (write(data->file, padding, 6144 - size) == -1) goto FIFO_WRITE_ERROR; - break; - default: - etiLog.printHeader(TcpLog::ERR, "File type is not supported.\n"); - return -1; - } - - - return size; - -FIFO_WRITE_ERROR: - perror("Error while writting to file"); - return -1; -} - - -int dabOutputFifoClose(void* args) -{ - dabOutputFifoData* data = (dabOutputFifoData*)args; - - if (close(data->file) == 0) { - data->file = -1; - return 0; - } - perror("Can't close file"); - return -1; -} - - -int dabOutputFifoClean(void** args) -{ - delete (dabOutputFifoData*)(*args); - return 0; -} - - -struct dabOutputOperations dabOutputFifoOperations = { - dabOutputFifoInit, - dabOutputFifoOpen, - dabOutputFifoWrite, - dabOutputFifoClose, - dabOutputFifoClean -}; - - -struct dabOutputFileData { - int file; - EtiFileType type; - unsigned long nbFrames; -}; - - -int dabOutputFileInit(void** args) -{ - dabOutputFileData* data = new dabOutputFileData; - - *args = data; - data->file = -1; - data->type = ETI_FILE_TYPE_FRAMED; - data->nbFrames = 0; - return 0; -} - - -int dabOutputFileWrite(void* args, void* buffer, int size) -{ - dabOutputFileData* data = (dabOutputFileData*)args; - - uint8_t padding[6144]; - ++data->nbFrames; - - switch (data->type) { - case ETI_FILE_TYPE_FRAMED: - // Writting nb of frames at beginning of file - if (lseek(data->file, 0, SEEK_SET) == -1) goto FILE_WRITE_ERROR; - if (write(data->file, &data->nbFrames, 4) == -1) goto FILE_WRITE_ERROR; - - // Writting nb frame length at end of file - if (lseek(data->file, 0, SEEK_END) == -1) goto FILE_WRITE_ERROR; - if (write(data->file, &size, 2) == -1) goto FILE_WRITE_ERROR; - - // Appending data - if (write(data->file, buffer, size) == -1) goto FILE_WRITE_ERROR; - break; - case ETI_FILE_TYPE_STREAMED: - // Writting nb frame length at end of file - if (write(data->file, &size, 2) == -1) goto FILE_WRITE_ERROR; - - // Appending data - if (write(data->file, buffer, size) == -1) goto FILE_WRITE_ERROR; - break; - case ETI_FILE_TYPE_RAW: - // Appending data - if (write(data->file, buffer, size) == -1) goto FILE_WRITE_ERROR; - - // Appending padding - memset(padding, 0x55, 6144 - size); - if (write(data->file, padding, 6144 - size) == -1) goto FILE_WRITE_ERROR; - break; - default: - etiLog.printHeader(TcpLog::ERR, "File type is not supported.\n"); - return -1; - } - - return size; - -FILE_WRITE_ERROR: - perror("Error while writting to file"); - return -1; -} - - -int dabOutputFileClean(void** args) -{ - delete (dabOutputFileData*)(*args); - return 0; -} - - -struct dabOutputOperations dabOutputFileOperations = { - dabOutputFileInit, - dabOutputFifoOpen, - dabOutputFileWrite, - dabOutputFifoClose, - dabOutputFileClean -}; - - -struct dabOutputRawData { -#ifdef _WIN32 - HANDLE socket; -#else - int socket; - bool isCyclades; -#endif - unsigned char* buffer; -}; - - -const unsigned char revTable[] = { - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, - 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, - 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, - 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, - 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, - 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, - 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, - 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, - 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, - 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, - 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, - 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, - 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, - 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, - 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, - 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, - 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, - 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, - 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, - 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, - 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, - 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, - 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, - 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, - 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, - 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, - 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, - 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, - 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, - 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, - 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, - 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff -}; - - -int dabOutputRawInit(void** args) -{ - dabOutputRawData* data = new dabOutputRawData; - - *args = data; -#ifdef _WIN32 - data->socket = INVALID_HANDLE_VALUE; -#else - data->socket = -1; - data->isCyclades = false; -#endif - data->buffer = new unsigned char[6144]; - return 0; -} - - -#ifdef _WIN32 -# include <fscfg.h> -# include <sdci.h> -#else -# include <netinet/in.h> -# include <sys/types.h> -# include <sys/socket.h> -# include <sys/ioctl.h> -# include <linux/if_packet.h> -# include <linux/netdevice.h> -# include <net/if_arp.h> -#endif -int dabOutputRawOpen(void* args, const char* filename) -{ - dabOutputRawData* data = (dabOutputRawData*)args; - - if (filename == NULL) { - etiLog.printHeader(TcpLog::ERR, "Socket name must be provided!\n"); - return -1; - } - -#ifdef _WIN32 - // Opening device - data->socket = CreateFile(filename, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - if (data->socket == INVALID_HANDLE_VALUE) { - etiLog.printHeader(TcpLog::ERR, "Can't open raw device '%s': %i\n", - filename, GetLastError()); - return -1; - } - - // Configuring device - DWORD result; - FS_TE1_CONFIG config; - if (!DeviceIoControl(data->socket, IoctlCodeFarSyncGetTE1Config, NULL, 0, - &config, sizeof(config), &result, NULL)) { - etiLog.printHeader(TcpLog::ERR, - "Can't get raw device '%s' config: %i\n", - filename, GetLastError()); - return -1; - } - config.dataRate = 2048000; - config.clocking = CLOCKING_MASTER; - config.framing = FRAMING_E1; - config.structure = STRUCTURE_UNFRAMED; - config.iface = INTERFACE_BNC; - config.coding = CODING_HDB3; - config.lineBuildOut = LBO_0dB; - config.equalizer = EQUALIZER_SHORT; - config.transparentMode = TRUE; - config.loopMode = LOOP_NONE; - config.range = RANGE_0_40_M; - config.txBufferMode = BUFFER_2_FRAME; - config.rxBufferMode = BUFFER_2_FRAME; - config.startingTimeSlot = 0; - config.losThreshold = 2; - config.enableIdleCode = TRUE; - config.idleCode = 0xff; - if (!DeviceIoControl(data->socket, IoctlCodeFarSyncSetTE1Config, - &config, sizeof(config), NULL, 0, &result, NULL)) { - etiLog.printHeader(TcpLog::ERR, - "Can't set raw device '%s' config: %i\n", - filename, GetLastError()); - return -1; - } - - // Starting device - if (!DeviceIoControl(data->socket, IoctlCodeFarSyncQuickStart, NULL, 0, - NULL, 0, &result, NULL)) { - etiLog.printHeader(TcpLog::ERR, "Can't start raw device '%s': %i\n", - filename, GetLastError()); - return -1; - } -#else - data->socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); - if (data->socket == -1) { - etiLog.printHeader(TcpLog::ERR, "Are you logged as root?\n"); - perror(filename); - return -1; - } - - struct ifreq ifr; - struct sockaddr_ll saddr; - memset(&ifr, 0, sizeof(struct ifreq)); - (void)strncpy(ifr.ifr_name, filename, sizeof(ifr.ifr_name)); - - // Get current Farsync configuration - struct fstioc_info info; - memset(&info, 0, sizeof(info)); - ifr.ifr_data = (char*)&info; - if (ioctl(data->socket, FSTGETCONF, &ifr) == -1) { - etiLog.printHeader(TcpLog::DBG, "Cyclades card identified.\n"); - data->isCyclades = true; - - // Set the interface MTU if needed - if (ioctl(data->socket, SIOCGIFMTU, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't get raw device MTU!\n"); - perror(filename); - return -1; - } else { - if (ifr.ifr_mtu != 6143) { - ifr.ifr_mtu = 6143; - if (ioctl(data->socket, SIOCSIFMTU, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, - "Can't Cyclades device MTU!\n"); - perror(filename); - return -1; - } - } - } - } else { - etiLog.printHeader(TcpLog::DBG, "Farsync card identified.\n"); - data->isCyclades = false; - - info.lineInterface = E1; - info.proto = FST_RAW; - info.internalClock = EXTCLK; - info.lineSpeed = 2048000; - //info.debug = DBG_INIT | DBG_OPEN | DBG_PCI | DBG_IOCTL | DBG_TX; - info.transparentMode = 1; - info.ignoreCarrier = 1; - info.numTxBuffers = 8; - info.numRxBuffers = 8; - info.txBufferSize = 6144; - info.rxBufferSize = 6144; - // E1 specific config - info.clockSource = CLOCKING_SLAVE; - info.structure = STRUCTURE_UNFRAMED; - info.interface = INTERFACE_BNC; //RJ48C; - info.coding = CODING_HDB3; - info.txBufferMode = BUFFER_2_FRAME; - info.idleCode = 0xff; - info.valid = FSTVAL_ALL; - - // Setting configuration - etiLog.printHeader(TcpLog::DBG, "Set configuration.\n"); - ifr.ifr_data = (char*)&info; - if (ioctl(data->socket, FSTSETCONF, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, - "Can't set Farsync configurationi!\n"); - perror(filename); - return -1; - } - - // Disabling notify - etiLog.printHeader(TcpLog::DBG, "Disable notify.\n"); - int notify = 0; - ifr.ifr_data = (char*)¬ify; - if (ioctl(data->socket, FSTSNOTIFY, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't disable Farsync notify!\n"); - perror(filename); - return -1; - } - - // Apply the new configuration - // Set the interface down if needed - etiLog.printHeader(TcpLog::DBG, "Get flags.\n"); - if (ioctl(data->socket, SIOCGIFFLAGS, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't get Farsync flags!\n"); - perror(filename); - return -1; - } else { - if (ifr.ifr_flags & IFF_UP) { - etiLog.printHeader(TcpLog::DBG, "Set flags.\n"); - ifr.ifr_flags &= ~IFF_UP; - if (ioctl(data->socket, SIOCSIFFLAGS, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, - "Can't turn down Farsync device!\n"); - perror(filename); - return -1; - } - } - } - - // Set the interface MTU if needed - etiLog.printHeader(TcpLog::DBG, "Get MTU.\n"); - if (ioctl(data->socket, SIOCGIFMTU, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't get Farsync MTU!\n"); - perror(filename); - return -1; - } else { - if (ifr.ifr_mtu != 6144) { - etiLog.printHeader(TcpLog::DBG, "Set MTU.\n"); - ifr.ifr_mtu = 6144; - if (ioctl(data->socket, SIOCSIFMTU, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't set Farsync MTU!\n"); - perror(filename); - return -1; - } - } - } - } - - // Set the interface up if needed - etiLog.printHeader(TcpLog::DBG, "Get flags.\n"); - if (ioctl(data->socket, SIOCGIFFLAGS, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't get raw device flags!\n"); - perror(filename); - return -1; - } else { - if (!(ifr.ifr_flags & IFF_UP)) { - ifr.ifr_flags |= IFF_UP; - etiLog.printHeader(TcpLog::DBG, "Set flags.\n"); - if (ioctl(data->socket, SIOCSIFFLAGS, &ifr) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't turn up raw device!\n"); - perror(filename); - return -1; - } - } - } - - close(data->socket); - - //////////////////// - // Opening device // - //////////////////// - - if ((data->socket = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CUST))) == -1) { - etiLog.printHeader(TcpLog::ERR, "Are you logged as root?\n"); - perror(filename); - return -1; - } - - // ioctl to read the interface number - etiLog.printHeader(TcpLog::DBG, "Get index.\n"); - memset(&ifr, 0, sizeof(struct ifreq)); - strncpy(ifr.ifr_name, filename, sizeof(ifr.ifr_name)); - if (ioctl(data->socket, SIOCGIFINDEX, (char *) &ifr) == -1) { - perror(filename); - return -1; - } - - // Bind to the interface name - etiLog.printHeader(TcpLog::DBG, "Bind interface.\n"); - memset(&saddr, 0, sizeof(struct sockaddr_ll)); - saddr.sll_family = AF_PACKET; - saddr.sll_protocol = ARPHRD_RAWHDLC; - saddr.sll_ifindex = ifr.ifr_ifindex; - if (bind(data->socket, (struct sockaddr *) &saddr, sizeof(saddr)) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't bind raw device!\n"); - perror(filename); - return -1; - } -#endif - - return 0; -} - - -int dabOutputRawWrite(void* args, void* buffer, int size) -{ - dabOutputRawData* data = (dabOutputRawData*)args; - - // Encoding data - memcpy(data->buffer, buffer, size); - memset(data->buffer + size, 0x55, 6144 - size); - for (int i = 0; i < 6144; ++i) { - data->buffer[i] = revTable[data->buffer[i]]; - } - - // Writting data -#ifdef _WIN32 - DWORD result; - if(!DeviceIoControl(data->socket, IoctlCodeTxFrame, data->buffer, 6144, - NULL, 0, &result, NULL)) { - goto RAW_WRITE_ERROR; - } -#else - /* - if (write(data->socket, data->buffer + 1, 6143) != 6143) { - goto RAW_WRITE_ERROR; - } - */ - if (data->isCyclades) { - if (write(data->socket, data->buffer + 1, 6143) != 6143) { - goto RAW_WRITE_ERROR; - } - } else { - int ret = send(data->socket, data->buffer, 6144, 0); - if (ret != 6144) { - fprintf(stderr, "%i/6144 bytes written\n", ret); - goto RAW_WRITE_ERROR; - } - } -#endif - - return size; - -RAW_WRITE_ERROR: -#ifdef _WIN32 - DWORD err = GetLastError(); - LPSTR errMsg; - if(FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - err, - 0, - (LPTSTR)&errMsg, - 0, - NULL) == 0) { - fprintf(stderr, "Error while writting to raw socket: %i\n", err); - } else { - fprintf(stderr, "Error while writting to raw socket: %s\n", errMsg); - LocalFree(errMsg); - } -#else - perror("Error while writting to raw socket"); -#endif - - return -1; -} - - -int dabOutputRawClose(void* args) -{ - dabOutputRawData* data = (dabOutputRawData*)args; - -#ifdef _WIN32 - CancelIo(data->socket); - CloseHandle(data->socket); - return 0; -#else - if (close(data->socket) == 0) { - data->socket = -1; - return 0; - } - perror("Can't close raw socket"); -#endif - - return -1; -} - - -int dabOutputRawClean(void** args) -{ - dabOutputRawData* data = *((dabOutputRawData**)args); - - delete []data->buffer; - delete data; - return 0; -} - - -struct dabOutputOperations dabOutputRawOperations = { - dabOutputRawInit, - dabOutputRawOpen, - dabOutputRawWrite, - dabOutputRawClose, - dabOutputRawClean -}; - - -struct dabOutputUdpData { - UdpSocket* socket; - UdpPacket* packet; -}; - - -int dabOutputUdpInit(void** args) -{ - dabOutputUdpData* data = new dabOutputUdpData; - - *args = data; - UdpSocket::init(); - data->packet = new UdpPacket(6144); - data->socket = new UdpSocket(); - - return 0; -} - - -int dabOutputUdpOpen(void* args, const char* filename) -{ - dabOutputUdpData* data = (dabOutputUdpData*)args; - filename = strdup(filename); - - char* address; - long port; - address = strchr((char*)filename, ':'); - if (address == NULL) { - etiLog.printHeader(TcpLog::ERR, - "\"%s\" is an invalid format for udp address: " - "should be [address]:port - > aborting\n", - filename); - return -1; - } - *(address++) = 0; - port = strtol(address, (char **)NULL, 10); - if ((port == LONG_MIN) || (port == LONG_MAX)) { - etiLog.printHeader(TcpLog::ERR, - "can't convert port number in udp address %s\n", address); - return -1; - } - if (port == 0) { - etiLog.printHeader(TcpLog::ERR, - "can't use port number 0 in udp address\n"); - return -1; - } - address = (char*)filename; - if (strlen(address) > 0) { - if (data->packet->getAddress().setAddress(address) == -1) { - etiLog.printHeader(TcpLog::ERR, "can't set address %s (%s: %s) " - "-> aborting\n", address, inetErrDesc, inetErrMsg); - return -1; - } - } - data->packet->getAddress().setPort(port); - - if (data->socket->create() == -1) { - etiLog.printHeader(TcpLog::ERR, "can't create Udp socket (%s: %s) " - "-> aborting\n)", inetErrDesc, inetErrMsg); - return -1; - } - - //sprintf(filename, "%s:%i", data->packet->getAddress().getHostAddress(), - // data->packet->getAddress().getPort()); - return 0; -} - - -int dabOutputUdpWrite(void* args, void* buffer, int size) -{ - dabOutputUdpData* data = (dabOutputUdpData*)args; - - data->packet->setLength(0); - data->packet->addData(buffer, size); - return data->socket->send(*data->packet); -} - - -int dabOutputUdpClose(void* args) -{ - //dabOutputUdpData* data = (dabOutputUdpData*)args; - - return 0; -} - - -int dabOutputUdpClean(void** args) -{ - dabOutputUdpData* data = *((dabOutputUdpData**)args); - - delete data->socket; - delete data->packet; - delete data; - - return 0; -} - - -struct dabOutputOperations dabOutputUdpOperations = { - dabOutputUdpInit, - dabOutputUdpOpen, - dabOutputUdpWrite, - dabOutputUdpClose, - dabOutputUdpClean -}; - - -#include "TcpServer.h" -struct dabOutputTcpData { - TcpServer* server; - TcpSocket* client; - pthread_t thread; -}; - - -int dabOutputTcpInit(void** args) -{ - dabOutputTcpData* data = new dabOutputTcpData; - - *args = data; - TcpSocket::init(); - data->server = new TcpServer(); - data->client = NULL; - - return 0; -} - - -void* dabOutputTcpThread(void* args) -{ - dabOutputTcpData* data = (dabOutputTcpData*)args; - TcpSocket* client; - - while ((client = data->server->accept()) != NULL) { - etiLog.print(TcpLog::INFO, "TCP server got a new client.\n"); - if (data->client != NULL) { - delete data->client; - } - data->client = client; - } - etiLog.print(TcpLog::ERR, "TCP thread can't accept new client (%s)\n", - inetErrDesc, inetErrMsg); - - return NULL; -} - - -int dabOutputTcpOpen(void* args, const char* filename) -{ - dabOutputTcpData* data = (dabOutputTcpData*)args; - filename = strdup(filename); - - char* address; - long port; - address = strchr((char*)filename, ':'); - if (address == NULL) { - etiLog.printHeader(TcpLog::ERR, - "\"%s\" is an invalid format for tcp address: " - "should be [address]:port - > aborting\n", - filename); - return -1; - } - *(address++) = 0; - port = strtol(address, (char **)NULL, 10); - if ((port == LONG_MIN) || (port == LONG_MAX)) { - etiLog.printHeader(TcpLog::ERR, - "can't convert port number in tcp address %s\n", address); - return -1; - } - if (port == 0) { - etiLog.printHeader(TcpLog::ERR, - "can't use port number 0 in tcp address\n"); - return -1; - } - address = (char*)filename; - if (strlen(address) > 0) { - if (data->server->create(port, address) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't create Tcp server on %s:%i " - "(%s: %s) -> aborting\n", - address, port, inetErrDesc, inetErrMsg); - return -1; - } - } else { - if (data->server->create(port) == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't create Tcp server on :%i " - "(%s: %s) -> aborting\n", - port, inetErrDesc, inetErrMsg); - return -1; - } - } - - //sprintf(filename, "%s:%i", data->packet->getAddress().getHostAddress(), - // data->packet->getAddress().getPort()); - - if (data->server->listen() == -1) { - etiLog.printHeader(TcpLog::ERR, "Can't listen on Tcp socket (%s: %s)\n", - inetErrDesc, inetErrMsg); - return -1; - } -#ifdef _WIN32 - data->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)dabOutputTcpThread, data, 0, NULL); - if (data->thread == NULL) { - fprintf(stderr, "Can't create TCP child"); - return -1; - } -#else - if (pthread_create(&data->thread, NULL, dabOutputTcpThread, data)) { - perror("Can't create TCP child"); - return -1; - } -#endif - - return 0; -} - - -int dabOutputTcpWrite(void* args, void* buffer, int size) -{ - dabOutputTcpData* data = (dabOutputTcpData*)args; - - if (data->client != NULL) { - if (data->client->write(&size, 2) == 2) { - if (data->client->write(buffer, size) != size) { - return size; - } - } - else { - etiLog.print(TcpLog::INFO, "TCP server client disconnected.\n"); - delete data->client; - data->client = NULL; - } - } - return size; -} - - -#include <signal.h> -int dabOutputTcpClose(void* args) -{ - dabOutputTcpData* data = (dabOutputTcpData*)args; - - data->server->close(); - if( data->client != NULL ) - data->client->close(); -#ifdef WIN32 - DWORD status; - for (int i = 0; i < 5; ++i) { - if (GetExitCodeThread(data->thread, &status)) { - break; - } - Sleep(100); - } - TerminateThread(data->thread, 1); -#else - pthread_kill(data->thread, SIGPIPE); -#endif - - return 0; -} - - -int dabOutputTcpClean(void** args) -{ - dabOutputTcpData* data = *((dabOutputTcpData**)args); - -#ifdef _WIN32 - CloseHandle(data->thread); -#endif - - delete data->server; - delete data->client; - delete data; - - return 0; -} - - -struct dabOutputOperations dabOutputTcpOperations = { - dabOutputTcpInit, - dabOutputTcpOpen, - dabOutputTcpWrite, - dabOutputTcpClose, - dabOutputTcpClean -}; - - -struct dabOutputSimulData { -#ifdef _WIN32 - DWORD startTime; -#else - timeval startTime; -#endif -}; - - -int dabOutputSimulInit(void** args) { - dabOutputSimulData* data = new dabOutputSimulData; - - *args = data; - - return 0; -} - - -int dabOutputSimulOpen(void* args, const char* filename) -{ - dabOutputSimulData* data = (dabOutputSimulData*)args; - -#ifdef _WIN32 - data->startTime = GetTickCount(); -#else - gettimeofday(&data->startTime, NULL); -#endif - - return 0; -} - - -int dabOutputSimulWrite(void* args, void* buffer, int size) -{ - dabOutputSimulData* data = (dabOutputSimulData*)args; - - unsigned long current; - unsigned long start; - unsigned long waiting; - -#ifdef _WIN32 - current = GetTickCount(); - start = data->startTime; - if (current < start) { - waiting = start - current + 24; - Sleep(waiting); - } else { - waiting = 24 - (current - start); - if ((current - start) < 24) { - Sleep(waiting); - } - } - data->startTime += 24; -#else - timeval curTime; - gettimeofday(&curTime, NULL); - current = (1000000ul * curTime.tv_sec) + curTime.tv_usec; - start = (1000000ul * data->startTime.tv_sec) + data->startTime.tv_usec; - waiting = 24000ul - (current - start); - if ((current - start) < 24000ul) { - usleep(waiting); - } - - data->startTime.tv_usec += 24000; - if (data->startTime.tv_usec >= 1000000) { - data->startTime.tv_usec -= 1000000; - ++data->startTime.tv_sec; - } -#endif - - return size; -} - - -int dabOutputSimulClose(void* args) -{ - //dabOutputSimulData* data = (dabOutputSimulData*)args); - - return 0; -} - - -int dabOutputSimulClean(void** args) -{ - dabOutputSimulData* data = *((dabOutputSimulData**)args); - - delete data; - - return 0; -} - - -struct dabOutputOperations dabOutputSimulOperations = { - dabOutputSimulInit, - dabOutputSimulOpen, - dabOutputSimulWrite, - dabOutputSimulClose, - dabOutputSimulClean -}; - - diff --git a/src/dabOutput.h b/src/dabOutput.h deleted file mode 100644 index 26c154a..0000000 --- a/src/dabOutput.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Her Majesty the Queen in - Right of Canada (Communications Research Center Canada) - */ -/* - This file is part of CRC-DabMux. - - CRC-DabMux 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. - - CRC-DabMux 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 CRC-DabMux. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef _DABOUTPUT -#define _DABOUTPUT - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - - -struct dabOutputOperations { - int (*init)(void** args); - int (*open)(void* args, const char* name); - int (*write)(void* args, void* buffer, int size); - int (*close)(void* args); - int (*clean)(void** args); -}; - -extern struct dabOutputOperations dabOutputDefaultOperations; - -#if defined(HAVE_OUTPUT_FILE) -extern struct dabOutputOperations dabOutputFileOperations; -#endif // defined(HAVE_OUTPUT_FILE) - -#if defined(HAVE_OUTPUT_FIFO) -extern struct dabOutputOperations dabOutputFifoOperations; -#endif // defined(HAVE_OUTPUT_FIFO) - -#if defined(HAVE_OUTPUT_UDP) -extern struct dabOutputOperations dabOutputUdpOperations; -#endif // defined(HAVE_OUTPUT_UDP) - -#if defined(HAVE_OUTPUT_TCP) -extern struct dabOutputOperations dabOutputTcpOperations; -#endif // defined(HAVE_OUTPUT_TCP) - -#if defined(HAVE_OUTPUT_RAW) -extern struct dabOutputOperations dabOutputRawOperations; -#endif // defined(HAVE_OUTPUT_RAW) - -#if defined(HAVE_OUTPUT_SIMUL) -extern struct dabOutputOperations dabOutputSimulOperations; -#endif // defined(HAVE_OUTPUT_SIMUL) - - -extern const unsigned char revTable[]; - - -#include "TcpLog.h" -extern TcpLog etiLog; - - -#endif // _DABOUTPUT diff --git a/src/dabOutput/dabOutput.cpp b/src/dabOutput/dabOutput.cpp new file mode 100644 index 0000000..18da57e --- /dev/null +++ b/src/dabOutput/dabOutput.cpp @@ -0,0 +1,109 @@ +#include <cstdio> +#include <cstring> +#include <fcntl.h> +#include <limits.h> +#include "dabOutput.h" + + + +DabOutputFifo::open(const char* name) +{ + char* token = strchr((char*)filename, '?'); + if (token != NULL) { + *(token++) = 0; + char* nextPair; + char* key; + char* value; + // Go through all the &stuff=foo pairs + // Only the key "type" is supported + do { + nextPair = strchr(token, '&'); + if (nextPair != NULL) { + *nextPair = 0; + } + key = token; + value = strchr(token, '='); + if (value != NULL) { + *(value++) = 0; + if (strcmp(key, "type") == 0) { + if (strcmp(value, "raw") == 0) { + this->type_ = ETI_FILE_TYPE_RAW; + break; + } else if (strcmp(value, "framed") == 0) { + this->type = ETI_FILE_TYPE_FRAMED; + break; + } else if (strcmp(value, "streamed") == 0) { + this->type = ETI_FILE_TYPE_STREAMED; + break; + } else { + etiLog.printHeader(TcpLog::ERR, + "File type '%s' is not supported.\n", value); + return -1; + } + } + else { + etiLog.printHeader(TcpLog::WARNING, "Parameter '%s' unknown\n", key); + } + } + } while (nextPair != NULL); + } + + this->file_ = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); + if (this->file_ == -1) { + perror(filename); + return -1; + } + return 0; +} + +int DabOutputFifo::write(void* buffer, int size) +{ + uint8_t padding[6144]; + + switch (this->type_) { + case ETI_FILE_TYPE_FRAMED: + if (this->nbFrames_ == 0) { + uint32_t nbFrames = (uint32_t)-1; + // Writing nb frames + if (write(this->file_, &nbFrames, 4) == -1) + goto FIFO_WRITE_ERROR; + } + case ETI_FILE_TYPE_STREAMED: + // Writting frame length + if (write(this->file_, &size, 2) == -1) + goto FIFO_WRITE_ERROR; + // Appending data + if (write(this->file_, buffer, size) == -1) + goto FIFO_WRITE_ERROR; + break; + case ETI_FILE_TYPE_RAW: + // Appending data + if (write(this->file_, buffer, size) == -1) + goto FIFO_WRITE_ERROR; + // Appending padding + memset(padding, 0x55, 6144 - size); + if (write(this->file_, padding, 6144 - size) == -1) + goto FIFO_WRITE_ERROR; + break; + default: + etiLog.printHeader(TcpLog::ERR, "File type is not supported.\n"); + return -1; + } + + return size; + +FIFO_WRITE_ERROR: + perror("Error while writting to file"); + return -1; +} + +int DabOutputFifo::close() +{ + if (close(this->file_) == 0) { + this->file_ = -1; + return 0; + } + perror("Can't close file"); + return -1; +} + diff --git a/src/dabOutput/dabOutput.h b/src/dabOutput/dabOutput.h new file mode 100644 index 0000000..7f295b4 --- /dev/null +++ b/src/dabOutput/dabOutput.h @@ -0,0 +1,248 @@ +/* + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Her Majesty the Queen in + Right of Canada (Communications Research Center Canada) + + Copyright (C) 2013 Matthias P. Braendli + http://mpb.li + + An object-oriented version of the output channels. + */ +/* + This file is part of CRC-DabMux. + + CRC-DabMux 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. + + CRC-DabMux 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 CRC-DabMux. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __DAB_OUTPUT_H +#define __DAB_OUTPUT_H + +#include "UdpSocket.h" +#include "TcpServer.h" +#include "TcpLog.h" +#include <signal.h> +#ifdef _WIN32 +# include <io.h> +# ifdef __MINGW32__ +# define FS_DECLARE_CFG_ARRAYS +# include <winioctl.h> +# endif +# include <sdci.h> +#else +# include <unistd.h> +# include <sys/time.h> +# ifndef O_BINARY +# define O_BINARY 0 +# endif // O_BINARY +#endif + +extern TcpLog etiLog; + +// Abstract base class for all outputs +class DabOutput +{ + public: + virtual int Open(const char* name) = 0; + int Open(std::string name) + { + return Open(name.c_str()); + } + virtual int Write(void* buffer, int size) = 0; + virtual int Close() = 0; + + virtual ~DabOutput() {}; +}; + +// ----- used in File and Fifo outputs +enum EtiFileType { + ETI_FILE_TYPE_NONE = 0, + ETI_FILE_TYPE_RAW, + ETI_FILE_TYPE_STREAMED, + ETI_FILE_TYPE_FRAMED +}; + +// ---------- File output ------------ +class DabOutputFile : public DabOutput +{ + public: + DabOutputFile() { + nbFrames_ = 0; + file_ = -1; + type_ = ETI_FILE_TYPE_FRAMED; + } + + DabOutputFile(const DabOutputFile& other) + { + file_ = other.file_; + nbFrames_ = other.nbFrames_; + type_ = other.type_; + } + + ~DabOutputFile() {} + + int Open(const char* filename); + int Write(void* buffer, int size); + int Close(); + + protected: + int file_; + EtiFileType type_; + unsigned long nbFrames_; +}; + +// ---------- FIFO output ------------ +// only write is different for the FIFO output +class DabOutputFifo : public DabOutputFile +{ + public: + DabOutputFifo() : DabOutputFile() {} + ~DabOutputFifo() {} + + int Write(void* buffer, int size); +}; + +// -------------- RAW socket ----------- +class DabOutputRaw : public DabOutput +{ + public: + DabOutputRaw() + { +#ifdef _WIN32 + socket_ = INVALID_HANDLE_VALUE; +#else + socket_ = -1; + isCyclades_ = false; +#endif + buffer_ = new unsigned char[6144]; + } + + DabOutputRaw(const DabOutputRaw& other) + { + socket_ = other.socket_; +#ifndef _WIN32 + isCyclades_ = other.isCyclades_; +#endif + buffer_ = other.buffer_; + } + + ~DabOutputRaw() { + delete[] buffer_; + } + + int Open(const char* name); + int Write(void* buffer, int size); + int Close(); + private: +#ifdef _WIN32 + HANDLE socket_; +#else + int socket_; + bool isCyclades_; +#endif + unsigned char* buffer_; +}; + +// -------------- UDP ------------------ +class DabOutputUdp : public DabOutput +{ + public: + DabOutputUdp() { + UdpSocket::init(); + packet_ = new UdpPacket(6144); + socket_ = new UdpSocket(); + } + + DabOutputUdp(const DabOutputUdp& other) + { + packet_ = other.packet_; + socket_ = other.socket_; + } + + ~DabOutputUdp() { + delete socket_; + delete packet_; + } + + int Open(const char* name); + int Write(void* buffer, int size); + int Close() { return 0; } + + private: + UdpSocket* socket_; + UdpPacket* packet_; +}; + +// -------------- TCP ------------------ +class DabOutputTcp : public DabOutput +{ + public: + DabOutputTcp() + { + TcpSocket::init(); + server = new TcpServer(); + client = NULL; + } + + DabOutputTcp(const DabOutputTcp& other) + { + server = other.server; + client = other.client; + thread_ = other.thread_; + } + + ~DabOutputTcp() { + +#ifdef _WIN32 + CloseHandle(this->thread_); +#endif + + delete this->server; + delete this->client; + } + + int Open(const char* name); + int Write(void* buffer, int size); + int Close(); + + TcpServer* server; + TcpSocket* client; + private: + pthread_t thread_; +}; + +// -------------- Simul ------------------ +class DabOutputSimul : public DabOutput +{ + public: + DabOutputSimul() {} + + DabOutputSimul(const DabOutputSimul& other) + { + startTime_ = other.startTime_; + } + + ~DabOutputSimul() { } + + int Open(const char* name); + int Write(void* buffer, int size); + int Close() { return 0; } + private: +#ifdef _WIN32 + DWORD startTime_; +#else + timeval startTime_; +#endif +}; + +#endif + diff --git a/src/dabOutput/dabOutputFifo.cpp b/src/dabOutput/dabOutputFifo.cpp new file mode 100644 index 0000000..49fc331 --- /dev/null +++ b/src/dabOutput/dabOutputFifo.cpp @@ -0,0 +1,48 @@ +#include <cstdio> +#include <cstring> +#include <fcntl.h> +#include <limits.h> +#include "dabOutput.h" + + +int DabOutputFifo::Write(void* buffer, int size) +{ + uint8_t padding[6144]; + + switch (this->type_) { + case ETI_FILE_TYPE_FRAMED: + if (this->nbFrames_ == 0) { + uint32_t nbFrames = (uint32_t)-1; + // Writing nb frames + if (write(this->file_, &nbFrames, 4) == -1) + goto FIFO_WRITE_ERROR; + } + case ETI_FILE_TYPE_STREAMED: + // Writting frame length + if (write(this->file_, &size, 2) == -1) + goto FIFO_WRITE_ERROR; + // Appending data + if (write(this->file_, buffer, size) == -1) + goto FIFO_WRITE_ERROR; + break; + case ETI_FILE_TYPE_RAW: + // Appending data + if (write(this->file_, buffer, size) == -1) + goto FIFO_WRITE_ERROR; + // Appending padding + memset(padding, 0x55, 6144 - size); + if (write(this->file_, padding, 6144 - size) == -1) + goto FIFO_WRITE_ERROR; + break; + default: + etiLog.printHeader(TcpLog::ERR, "File type is not supported.\n"); + return -1; + } + + return size; + +FIFO_WRITE_ERROR: + perror("Error while writting to file"); + return -1; +} + diff --git a/src/dabOutput/dabOutputFile.cpp b/src/dabOutput/dabOutputFile.cpp new file mode 100644 index 0000000..349a308 --- /dev/null +++ b/src/dabOutput/dabOutputFile.cpp @@ -0,0 +1,111 @@ +#include <cstdio> +#include <cstring> +#include <fcntl.h> +#include <limits.h> +#include "dabOutput.h" + +int DabOutputFile::Open(const char* filename) +{ + char* token = strchr((char*)filename, '?'); + if (token != NULL) { + *(token++) = 0; + char* nextPair; + char* key; + char* value; + // Go through all the &stuff=foo pairs + // Only the key "type" is supported + do { + nextPair = strchr(token, '&'); + if (nextPair != NULL) { + *nextPair = 0; + } + key = token; + value = strchr(token, '='); + if (value != NULL) { + *(value++) = 0; + if (strcmp(key, "type") == 0) { + if (strcmp(value, "raw") == 0) { + this->type_ = ETI_FILE_TYPE_RAW; + break; + } else if (strcmp(value, "framed") == 0) { + this->type_ = ETI_FILE_TYPE_FRAMED; + break; + } else if (strcmp(value, "streamed") == 0) { + this->type_ = ETI_FILE_TYPE_STREAMED; + break; + } else { + etiLog.printHeader(TcpLog::ERR, + "File type '%s' is not supported.\n", value); + return -1; + } + } + else { + etiLog.printHeader(TcpLog::WARNING, "Parameter '%s' unknown\n", key); + } + } + } while (nextPair != NULL); + } + + this->file_ = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); + if (this->file_ == -1) { + perror(filename); + return -1; + } + return 0; +} + +int DabOutputFile::Write(void* buffer, int size) +{ + uint8_t padding[6144]; + ++nbFrames_; + + switch (this->type_) { + case ETI_FILE_TYPE_FRAMED: + // Writting nb of frames at beginning of file + if (lseek(this->file_, 0, SEEK_SET) == -1) goto FILE_WRITE_ERROR; + if (write(this->file_, &this->nbFrames_, 4) == -1) goto FILE_WRITE_ERROR; + + // Writting nb frame length at end of file + if (lseek(this->file_, 0, SEEK_END) == -1) goto FILE_WRITE_ERROR; + if (write(this->file_, &size, 2) == -1) goto FILE_WRITE_ERROR; + + // Appending data + if (write(this->file_, buffer, size) == -1) goto FILE_WRITE_ERROR; + break; + case ETI_FILE_TYPE_STREAMED: + // Writting nb frame length at end of file + if (write(this->file_, &size, 2) == -1) goto FILE_WRITE_ERROR; + + // Appending data + if (write(this->file_, buffer, size) == -1) goto FILE_WRITE_ERROR; + break; + case ETI_FILE_TYPE_RAW: + // Appending data + if (write(this->file_, buffer, size) == -1) goto FILE_WRITE_ERROR; + + // Appending padding + memset(padding, 0x55, 6144 - size); + if (write(this->file_, padding, 6144 - size) == -1) goto FILE_WRITE_ERROR; + break; + default: + etiLog.printHeader(TcpLog::ERR, "File type is not supported.\n"); + return -1; + } + + return size; + +FILE_WRITE_ERROR: + perror("Error while writting to file"); + return -1; +} + +int DabOutputFile::Close() +{ + if (close(this->file_) == 0) { + this->file_ = -1; + return 0; + } + perror("Can't close file"); + return -1; +} + diff --git a/src/dabOutput/dabOutputRaw.cpp b/src/dabOutput/dabOutputRaw.cpp new file mode 100644 index 0000000..1a78b63 --- /dev/null +++ b/src/dabOutput/dabOutputRaw.cpp @@ -0,0 +1,366 @@ +#include <cstdio> +#include <cstring> +#include "dabOutput.h" +#ifdef _WIN32 +# include <fscfg.h> +# include <sdci.h> +#else +# include <farsync.h> +# include <netinet/in.h> +# include <sys/types.h> +# include <sys/socket.h> +# include <sys/ioctl.h> +# include <linux/if_packet.h> +# include <linux/netdevice.h> +# include <net/if_arp.h> +#endif + +const unsigned char revTable[] = { + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, + 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, + 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, + 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, + 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, + 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, + 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, + 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff +}; + +int DabOutputRaw::Open(const char* filename) +{ + if (filename == NULL) { + etiLog.printHeader(TcpLog::ERR, "Socket name must be provided!\n"); + return -1; + } + +#ifdef _WIN32 + // Opening device + this->socket_ = CreateFile(filename, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + if (this->socket_ == INVALID_HANDLE_VALUE) { + etiLog.printHeader(TcpLog::ERR, "Can't open raw device '%s': %i\n", + filename, GetLastError()); + return -1; + } + + // Configuring device + DWORD result; + FS_TE1_CONFIG config; + if (!DeviceIoControl(this->socket_, IoctlCodeFarSyncGetTE1Config, NULL, 0, + &config, sizeof(config), &result, NULL)) { + etiLog.printHeader(TcpLog::ERR, + "Can't get raw device '%s' config: %i\n", + filename, GetLastError()); + return -1; + } + config.dataRate = 2048000; + config.clocking = CLOCKING_MASTER; + config.framing = FRAMING_E1; + config.structure = STRUCTURE_UNFRAMED; + config.iface = INTERFACE_BNC; + config.coding = CODING_HDB3; + config.lineBuildOut = LBO_0dB; + config.equalizer = EQUALIZER_SHORT; + config.transparentMode = TRUE; + config.loopMode = LOOP_NONE; + config.range = RANGE_0_40_M; + config.txBufferMode = BUFFER_2_FRAME; + config.rxBufferMode = BUFFER_2_FRAME; + config.startingTimeSlot = 0; + config.losThreshold = 2; + config.enableIdleCode = TRUE; + config.idleCode = 0xff; + if (!DeviceIoControl(this->socket_, IoctlCodeFarSyncSetTE1Config, + &config, sizeof(config), NULL, 0, &result, NULL)) { + etiLog.printHeader(TcpLog::ERR, + "Can't set raw device '%s' config: %i\n", + filename, GetLastError()); + return -1; + } + + // Starting device + if (!DeviceIoControl(this->socket_, IoctlCodeFarSyncQuickStart, NULL, 0, + NULL, 0, &result, NULL)) { + etiLog.printHeader(TcpLog::ERR, "Can't start raw device '%s': %i\n", + filename, GetLastError()); + return -1; + } +#else + this->socket_ = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); + if (this->socket_ == -1) { + etiLog.printHeader(TcpLog::ERR, "Are you logged as root?\n"); + perror(filename); + return -1; + } + + struct ifreq ifr; + struct sockaddr_ll saddr; + memset(&ifr, 0, sizeof(struct ifreq)); + (void)strncpy(ifr.ifr_name, filename, sizeof(ifr.ifr_name)); + + // Get current Farsync configuration + struct fstioc_info info; + memset(&info, 0, sizeof(info)); + ifr.ifr_data = (char*)&info; + if (ioctl(this->socket_, FSTGETCONF, &ifr) == -1) { + etiLog.printHeader(TcpLog::DBG, "Cyclades card identified.\n"); + this->isCyclades_ = true; + + // Set the interface MTU if needed + if (ioctl(this->socket_, SIOCGIFMTU, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't get raw device MTU!\n"); + perror(filename); + return -1; + } else { + if (ifr.ifr_mtu != 6143) { + ifr.ifr_mtu = 6143; + if (ioctl(this->socket_, SIOCSIFMTU, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, + "Can't Cyclades device MTU!\n"); + perror(filename); + return -1; + } + } + } + } else { + etiLog.printHeader(TcpLog::DBG, "Farsync card identified.\n"); + this->isCyclades_ = false; + + info.lineInterface = E1; + info.proto = FST_RAW; + info.internalClock = EXTCLK; + info.lineSpeed = 2048000; + //info.debug = DBG_INIT | DBG_OPEN | DBG_PCI | DBG_IOCTL | DBG_TX; + info.transparentMode = 1; + info.ignoreCarrier = 1; + info.numTxBuffers = 8; + info.numRxBuffers = 8; + info.txBufferSize = 6144; + info.rxBufferSize = 6144; + // E1 specific config + info.clockSource = CLOCKING_SLAVE; + info.structure = STRUCTURE_UNFRAMED; + info.interface = INTERFACE_BNC; //RJ48C; + info.coding = CODING_HDB3; + info.txBufferMode = BUFFER_2_FRAME; + info.idleCode = 0xff; + info.valid = FSTVAL_ALL; + + // Setting configuration + etiLog.printHeader(TcpLog::DBG, "Set configuration.\n"); + ifr.ifr_data = (char*)&info; + if (ioctl(this->socket_, FSTSETCONF, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, + "Can't set Farsync configurationi!\n"); + perror(filename); + return -1; + } + + // Disabling notify + etiLog.printHeader(TcpLog::DBG, "Disable notify.\n"); + int notify = 0; + ifr.ifr_data = (char*)¬ify; + if (ioctl(this->socket_, FSTSNOTIFY, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't disable Farsync notify!\n"); + perror(filename); + return -1; + } + + // Apply the new configuration + // Set the interface down if needed + etiLog.printHeader(TcpLog::DBG, "Get flags.\n"); + if (ioctl(this->socket_, SIOCGIFFLAGS, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't get Farsync flags!\n"); + perror(filename); + return -1; + } else { + if (ifr.ifr_flags & IFF_UP) { + etiLog.printHeader(TcpLog::DBG, "Set flags.\n"); + ifr.ifr_flags &= ~IFF_UP; + if (ioctl(this->socket_, SIOCSIFFLAGS, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, + "Can't turn down Farsync device!\n"); + perror(filename); + return -1; + } + } + } + + // Set the interface MTU if needed + etiLog.printHeader(TcpLog::DBG, "Get MTU.\n"); + if (ioctl(this->socket_, SIOCGIFMTU, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't get Farsync MTU!\n"); + perror(filename); + return -1; + } else { + if (ifr.ifr_mtu != 6144) { + etiLog.printHeader(TcpLog::DBG, "Set MTU.\n"); + ifr.ifr_mtu = 6144; + if (ioctl(this->socket_, SIOCSIFMTU, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't set Farsync MTU!\n"); + perror(filename); + return -1; + } + } + } + } + + // Set the interface up if needed + etiLog.printHeader(TcpLog::DBG, "Get flags.\n"); + if (ioctl(this->socket_, SIOCGIFFLAGS, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't get raw device flags!\n"); + perror(filename); + return -1; + } else { + if (!(ifr.ifr_flags & IFF_UP)) { + ifr.ifr_flags |= IFF_UP; + etiLog.printHeader(TcpLog::DBG, "Set flags.\n"); + if (ioctl(this->socket_, SIOCSIFFLAGS, &ifr) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't turn up raw device!\n"); + perror(filename); + return -1; + } + } + } + + close(this->socket_); + + //////////////////// + // Opening device // + //////////////////// + + if ((this->socket_ = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CUST))) == -1) { + etiLog.printHeader(TcpLog::ERR, "Are you logged as root?\n"); + perror(filename); + return -1; + } + + // ioctl to read the interface number + etiLog.printHeader(TcpLog::DBG, "Get index.\n"); + memset(&ifr, 0, sizeof(struct ifreq)); + strncpy(ifr.ifr_name, filename, sizeof(ifr.ifr_name)); + if (ioctl(this->socket_, SIOCGIFINDEX, (char *) &ifr) == -1) { + perror(filename); + return -1; + } + + // Bind to the interface name + etiLog.printHeader(TcpLog::DBG, "Bind interface.\n"); + memset(&saddr, 0, sizeof(struct sockaddr_ll)); + saddr.sll_family = AF_PACKET; + saddr.sll_protocol = ARPHRD_RAWHDLC; + saddr.sll_ifindex = ifr.ifr_ifindex; + if (bind(this->socket_, (struct sockaddr *) &saddr, sizeof(saddr)) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't bind raw device!\n"); + perror(filename); + return -1; + } +#endif + + return 0; +} + + +int DabOutputRaw::Write(void* buffer, int size) +{ + // Encoding data + memcpy(this->buffer_, buffer, size); + memset(this->buffer_ + size, 0x55, 6144 - size); + for (int i = 0; i < 6144; ++i) { + this->buffer_[i] = revTable[this->buffer_[i]]; + } + + // Writting data +#ifdef _WIN32 + DWORD result; + if(!DeviceIoControl(this->socket_, IoctlCodeTxFrame, this->buffer_, 6144, + NULL, 0, &result, NULL)) { + goto RAW_WRITE_ERROR; + } +#else + /* + if (write(this->socket_, this->buffer_ + 1, 6143) != 6143) { + goto RAW_WRITE_ERROR; + } + */ + if (this->isCyclades_) { + if (write(this->socket_, this->buffer_ + 1, 6143) != 6143) { + goto RAW_WRITE_ERROR; + } + } else { + int ret = send(this->socket_, this->buffer_, 6144, 0); + if (ret != 6144) { + fprintf(stderr, "%i/6144 bytes written\n", ret); + goto RAW_WRITE_ERROR; + } + } +#endif + + return size; + +RAW_WRITE_ERROR: +#ifdef _WIN32 + DWORD err = GetLastError(); + LPSTR errMsg; + if(FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + err, + 0, + (LPTSTR)&errMsg, + 0, + NULL) == 0) { + fprintf(stderr, "Error while writting to raw socket: %i\n", err); + } else { + fprintf(stderr, "Error while writting to raw socket: %s\n", errMsg); + LocalFree(errMsg); + } +#else + perror("Error while writting to raw socket"); +#endif + + return -1; +} + + +int DabOutputRaw::Close() +{ +#ifdef _WIN32 + CancelIo(this->socket_); + CloseHandle(this->socket_); + return 0; +#else + if (close(this->socket_) == 0) { + this->socket_ = -1; + return 0; + } + perror("Can't close raw socket"); +#endif + + return -1; +} + diff --git a/src/dabOutput/dabOutputSimul.cpp b/src/dabOutput/dabOutputSimul.cpp new file mode 100644 index 0000000..e53b4ba --- /dev/null +++ b/src/dabOutput/dabOutputSimul.cpp @@ -0,0 +1,70 @@ +#include "dabOutput.h" +#include <cstring> +#include <cstdio> +#include <fcntl.h> +#include <limits.h> +#ifdef _WIN32 +# include <io.h> +# ifdef __MINGW32__ +# define FS_DECLARE_CFG_ARRAYS +# include <winioctl.h> +# endif +# include <sdci.h> +#else +# include <unistd.h> +# include <sys/time.h> +# ifndef O_BINARY +# define O_BINARY 0 +# endif // O_BINARY +#endif + + +int DabOutputSimul::Open(const char* name) +{ +#ifdef _WIN32 + startTime_ = GetTickCount(); +#else + gettimeofday(&startTime_, NULL); +#endif + + return 0; +} + +int DabOutputSimul::Write(void* buffer, int size) +{ + unsigned long current; + unsigned long start; + unsigned long waiting; + +#ifdef _WIN32 + current = GetTickCount(); + start = this->startTime_; + if (current < start) { + waiting = start - current + 24; + Sleep(waiting); + } else { + waiting = 24 - (current - start); + if ((current - start) < 24) { + Sleep(waiting); + } + } + this->startTime_ += 24; +#else + timeval curTime; + gettimeofday(&curTime, NULL); + current = (1000000ul * curTime.tv_sec) + curTime.tv_usec; + start = (1000000ul * this->startTime_.tv_sec) + this->startTime_.tv_usec; + waiting = 24000ul - (current - start); + if ((current - start) < 24000ul) { + usleep(waiting); + } + + this->startTime_.tv_usec += 24000; + if (this->startTime_.tv_usec >= 1000000) { + this->startTime_.tv_usec -= 1000000; + ++this->startTime_.tv_sec; + } +#endif + + return size; +} diff --git a/src/dabOutput/dabOutputTcp.cpp b/src/dabOutput/dabOutputTcp.cpp new file mode 100644 index 0000000..a3d7a5a --- /dev/null +++ b/src/dabOutput/dabOutputTcp.cpp @@ -0,0 +1,154 @@ +#include <cstring> +#include <cstdio> +#include <signal.h> +#include <limits.h> +#include "dabOutput.h" +#include "TcpServer.h" + +#ifdef _WIN32 +# include <io.h> +# ifdef __MINGW32__ +# define FS_DECLARE_CFG_ARRAYS +# include <winioctl.h> +# endif +# include <sdci.h> +#else +# include <unistd.h> +# include <sys/time.h> +# ifndef O_BINARY +# define O_BINARY 0 +# endif // O_BINARY +#endif + +void* tcpThread(void* param) +{ + TcpSocket* client; + + DabOutputTcp* tcp = (DabOutputTcp*)param; + + while ((client = tcp->server->accept()) != NULL) { + etiLog.print(TcpLog::INFO, "TCP server got a new client.\n"); + if (tcp->client != NULL) { + delete tcp->client; + } + tcp->client = client; + } + etiLog.print(TcpLog::ERR, "TCP thread can't accept new client (%s)\n", + inetErrDesc, inetErrMsg); + + return NULL; +} + +int DabOutputTcp::Open(const char* name) +{ + char* hostport = strdup(name); // the name is actually an tuple host:port + + char* address; + long port; + address = strchr((char*)hostport, ':'); + if (address == NULL) { + etiLog.printHeader(TcpLog::ERR, + "\"%s\" is an invalid format for tcp address: " + "should be [address]:port - > aborting\n", + hostport); + goto tcp_open_fail; + } + + // terminate string hostport after the host, and advance address to the port number + *(address++) = 0; + + port = strtol(address, (char **)NULL, 10); + if ((port == LONG_MIN) || (port == LONG_MAX)) { + etiLog.printHeader(TcpLog::ERR, + "can't convert port number in tcp address %s\n", address); + goto tcp_open_fail; + } + if (port == 0) { + etiLog.printHeader(TcpLog::ERR, + "can't use port number 0 in tcp address\n"); + goto tcp_open_fail; + } + address = hostport; + if (strlen(address) > 0) { + if (this->server->create(port, address) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't create Tcp server on %s:%i " + "(%s: %s) -> aborting\n", + address, port, inetErrDesc, inetErrMsg); + goto tcp_open_fail; + } + } else { + if (this->server->create(port) == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't create Tcp server on :%i " + "(%s: %s) -> aborting\n", + port, inetErrDesc, inetErrMsg); + goto tcp_open_fail; + } + } + + //sprintf(name, "%s:%i", this->packet_->getAddress().getHostAddress(), + // this->packet_->getAddress().getPort()); + + if (this->server->listen() == -1) { + etiLog.printHeader(TcpLog::ERR, "Can't listen on Tcp socket (%s: %s)\n", + inetErrDesc, inetErrMsg); + goto tcp_open_fail; + } +#ifdef _WIN32 + this->thread_ = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)tcpThread, this, 0, NULL); + if (this->thread_ == NULL) { + fprintf(stderr, "Can't create TCP child"); + goto tcp_open_fail; + } +#else + if (pthread_create(&this->thread_, NULL, tcpThread, this)) { + perror("Can't create TCP child"); + goto tcp_open_fail; + } +#endif + + return 0; + +tcp_open_fail: + free(hostport); + return -1; +} + + +int DabOutputTcp::Write(void* buffer, int size) +{ + + if (this->client != NULL) { + if (this->client->write(&size, 2) == 2) { + if (this->client->write(buffer, size) != size) { + return size; + } + } + else { + etiLog.print(TcpLog::INFO, "TCP server client disconnected.\n"); + delete this->client; + this->client = NULL; + } + } + return size; +} + + +int DabOutputTcp::Close() +{ + this->server->close(); + if( this->client != NULL ) + this->client->close(); +#ifdef WIN32 + DWORD status; + for (int i = 0; i < 5; ++i) { + if (GetExitCodeThread(this->thread_, &status)) { + break; + } + Sleep(100); + } + TerminateThread(this->thread_, 1); +#else + pthread_kill(this->thread_, SIGPIPE); +#endif + return 0; +} diff --git a/src/dabOutput/dabOutputUdp.cpp b/src/dabOutput/dabOutputUdp.cpp new file mode 100644 index 0000000..1410071 --- /dev/null +++ b/src/dabOutput/dabOutputUdp.cpp @@ -0,0 +1,82 @@ +#include <cstring> +#include <cstdio> +#include <limits.h> +#include "dabOutput.h" +#include "UdpSocket.h" + +#ifdef _WIN32 +# include <fscfg.h> +# include <sdci.h> +#else +# include <netinet/in.h> +# include <sys/types.h> +# include <sys/socket.h> +# include <sys/ioctl.h> +# include <linux/if_packet.h> +# include <linux/netdevice.h> +# include <net/if_arp.h> +#endif + +int DabOutputUdp::Open(const char* name) +{ + // we are going to modify it + char* hostport = strdup(name); // the name is actually an tuple host:port + + char* address; + long port; + address = strchr(hostport, ':'); + if (address == NULL) { + etiLog.printHeader(TcpLog::ERR, + "\"%s\" is an invalid format for UDP address: " + "should be [address]:port - > aborting\n", + hostport); + goto udp_open_fail; + } + + // terminate string hostport after the host, and advance address to the port number + *(address++) = 0; + + port = strtol(address, (char **)NULL, 10); + if ((port == LONG_MIN) || (port == LONG_MAX)) { + etiLog.printHeader(TcpLog::ERR, + "can't convert port number in UDP address %s\n", address); + goto udp_open_fail; + } + if (port == 0) { + etiLog.printHeader(TcpLog::ERR, + "can't use port number 0 in UDP address\n"); + goto udp_open_fail; + } + address = hostport; + if (strlen(address) > 0) { + if (this->packet_->getAddress().setAddress(address) == -1) { + etiLog.printHeader(TcpLog::ERR, "can't set address %s (%s: %s) " + "-> aborting\n", address, inetErrDesc, inetErrMsg); + goto udp_open_fail; + } + } + this->packet_->getAddress().setPort(port); + + if (this->socket_->create() == -1) { + etiLog.printHeader(TcpLog::ERR, "can't create UDP socket (%s: %s) " + "-> aborting\n)", inetErrDesc, inetErrMsg); + goto udp_open_fail; + } + + //sprintf(hostport, "%s:%i", this->packet_->getAddress().getHostAddress(), + // this->packet_->getAddress().getPort()); + return 0; + +udp_open_fail: + // strdup forces us to free + free(hostport); + return -1; +} + + +int DabOutputUdp::Write(void* buffer, int size) +{ + this->packet_->setLength(0); + this->packet_->addData(buffer, size); + return this->socket_->send(*this->packet_); +} diff --git a/src/utils.cpp b/src/utils.cpp index 270e7f5..9e87337 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -285,9 +285,9 @@ void printOutputs(vector<dabOutput*>& outputs) for (output = outputs.begin(); output != outputs.end(); ++output) { etiLog.printHeader(TcpLog::INFO, "Output %i\n", index); etiLog.printHeader(TcpLog::INFO, " protocol: %s\n", - (*output)->outputProto); + (*output)->outputProto.c_str()); etiLog.printHeader(TcpLog::INFO, " name: %s\n", - (*output)->outputName); + (*output)->outputName.c_str()); ++index; } } |