diff options
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;      }  }  | 
