summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias P. Braendli (think) <matthias@mpb.li>2013-11-08 14:43:19 +0100
committerMatthias P. Braendli (think) <matthias@mpb.li>2013-11-08 14:43:19 +0100
commitc5306f81a9d3b87df7e16c852f2505ac913193ca (patch)
tree40716835305aa871cae5a5b3c805f0c673f47108 /src
parent573c7b63092618ecae86847d9d0a143801db0780 (diff)
downloaddabmux-c5306f81a9d3b87df7e16c852f2505ac913193ca.tar.gz
dabmux-c5306f81a9d3b87df7e16c852f2505ac913193ca.tar.bz2
dabmux-c5306f81a9d3b87df7e16c852f2505ac913193ca.zip
make dabOutput more object-oriented
Diffstat (limited to 'src')
-rw-r--r--src/DabMux.cpp54
-rw-r--r--src/DabMux.h2
-rw-r--r--src/Makefile.am8
-rw-r--r--src/Makefile.in366
-rw-r--r--src/MuxElements.h16
-rw-r--r--src/ParserCmdline.cpp26
-rw-r--r--src/ParserConfigfile.cpp29
-rw-r--r--src/dabOutput.cpp1112
-rw-r--r--src/dabOutput.h72
-rw-r--r--src/dabOutput/dabOutput.cpp109
-rw-r--r--src/dabOutput/dabOutput.h248
-rw-r--r--src/dabOutput/dabOutputFifo.cpp48
-rw-r--r--src/dabOutput/dabOutputFile.cpp111
-rw-r--r--src/dabOutput/dabOutputRaw.cpp366
-rw-r--r--src/dabOutput/dabOutputSimul.cpp70
-rw-r--r--src/dabOutput/dabOutputTcp.cpp154
-rw-r--r--src/dabOutput/dabOutputUdp.cpp82
-rw-r--r--src/utils.cpp4
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*)&notify;
- 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*)&notify;
+ 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;
}
}