lspsync$(EXEEXT) create_interleaver$(EXEEXT) tlspsens$(EXEEXT) \
vqtrainph$(EXEEXT) genphdata$(EXEEXT) genampdata$(EXEEXT) \
polar2rect$(EXEEXT) vqtrainsp$(EXEEXT) tprede$(EXEEXT) \
- pre$(EXEEXT) de$(EXEEXT)
+ pre$(EXEEXT) de$(EXEEXT) tfifo$(EXEEXT)
subdir = unittest
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
kiss_fft.$(OBJEXT) octave.$(OBJEXT)
tfdmdv_OBJECTS = $(am_tfdmdv_OBJECTS)
tfdmdv_DEPENDENCIES =
+am_tfifo_OBJECTS = tfifo.$(OBJEXT) fifo.$(OBJEXT)
+tfifo_OBJECTS = $(am_tfifo_OBJECTS)
+tfifo_DEPENDENCIES =
am_tinterp_OBJECTS = tinterp.$(OBJEXT) sine.$(OBJEXT) \
kiss_fft.$(OBJEXT) interp.$(OBJEXT) lpc.$(OBJEXT) \
lsp.$(OBJEXT) quantise.$(OBJEXT) $(am__objects_1) \
$(extract_SOURCES) $(genampdata_SOURCES) $(genlsp_SOURCES) \
$(genphdata_SOURCES) $(genres_SOURCES) $(lspsync_SOURCES) \
$(polar2rect_SOURCES) $(pre_SOURCES) $(scalarlsptest_SOURCES) \
- $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tinterp_SOURCES) \
- $(tlspsens_SOURCES) $(tnlp_SOURCES) $(tprede_SOURCES) \
- $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \
- $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \
+ $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tfifo_SOURCES) \
+ $(tinterp_SOURCES) $(tlspsens_SOURCES) $(tnlp_SOURCES) \
+ $(tprede_SOURCES) $(tquant_SOURCES) $(vq_train_jvm_SOURCES) \
+ $(vqtrain_SOURCES) $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \
$(vqtrainsp_SOURCES)
DIST_SOURCES = $(create_interleaver_SOURCES) $(de_SOURCES) \
$(extract_SOURCES) $(genampdata_SOURCES) $(genlsp_SOURCES) \
$(genphdata_SOURCES) $(genres_SOURCES) $(lspsync_SOURCES) \
$(polar2rect_SOURCES) $(pre_SOURCES) $(scalarlsptest_SOURCES) \
- $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tinterp_SOURCES) \
- $(tlspsens_SOURCES) $(tnlp_SOURCES) $(tprede_SOURCES) \
- $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \
- $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \
+ $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tfifo_SOURCES) \
+ $(tinterp_SOURCES) $(tlspsens_SOURCES) $(tnlp_SOURCES) \
+ $(tprede_SOURCES) $(tquant_SOURCES) $(vq_train_jvm_SOURCES) \
+ $(vqtrain_SOURCES) $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \
$(vqtrainsp_SOURCES)
ETAGS = etags
CTAGS = ctags
de_SOURCES = de.c ../src/lpc.c
de_LDADD = $(lib_LTLIBRARIES)
de_LDFLAGS = $(LIBS)
+tfifo_SOURCES = tfifo.c ../src/fifo.c
+tfifo_LDADD = $(lib_LTLIBRARIES) -lpthread
+tfifo_LDFLAGS = $(LIBS)
all: all-am
.SUFFIXES:
tfdmdv$(EXEEXT): $(tfdmdv_OBJECTS) $(tfdmdv_DEPENDENCIES)
@rm -f tfdmdv$(EXEEXT)
$(LINK) $(tfdmdv_LDFLAGS) $(tfdmdv_OBJECTS) $(tfdmdv_LDADD) $(LIBS)
+tfifo$(EXEEXT): $(tfifo_OBJECTS) $(tfifo_DEPENDENCIES)
+ @rm -f tfifo$(EXEEXT)
+ $(LINK) $(tfifo_LDFLAGS) $(tfifo_OBJECTS) $(tfifo_LDADD) $(LIBS)
tinterp$(EXEEXT): $(tinterp_OBJECTS) $(tinterp_DEPENDENCIES)
@rm -f tinterp$(EXEEXT)
$(LINK) $(tinterp_LDFLAGS) $(tinterp_OBJECTS) $(tinterp_LDADD) $(LIBS)
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fifo.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genampdata.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genlsp.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genphdata.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sine.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t48_8.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tfdmdv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tfifo.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinterp.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlspsens.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnlp.Po@am__quote@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o octave.obj `if test -f '../src/octave.c'; then $(CYGPATH_W) '../src/octave.c'; else $(CYGPATH_W) '$(srcdir)/../src/octave.c'; fi`
+fifo.o: ../src/fifo.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fifo.o -MD -MP -MF "$(DEPDIR)/fifo.Tpo" -c -o fifo.o `test -f '../src/fifo.c' || echo '$(srcdir)/'`../src/fifo.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fifo.Tpo" "$(DEPDIR)/fifo.Po"; else rm -f "$(DEPDIR)/fifo.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/fifo.c' object='fifo.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fifo.o `test -f '../src/fifo.c' || echo '$(srcdir)/'`../src/fifo.c
+
+fifo.obj: ../src/fifo.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fifo.obj -MD -MP -MF "$(DEPDIR)/fifo.Tpo" -c -o fifo.obj `if test -f '../src/fifo.c'; then $(CYGPATH_W) '../src/fifo.c'; else $(CYGPATH_W) '$(srcdir)/../src/fifo.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fifo.Tpo" "$(DEPDIR)/fifo.Po"; else rm -f "$(DEPDIR)/fifo.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/fifo.c' object='fifo.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fifo.obj `if test -f '../src/fifo.c'; then $(CYGPATH_W) '../src/fifo.c'; else $(CYGPATH_W) '$(srcdir)/../src/fifo.c'; fi`
+
mostlyclean-libtool:
-rm -f *.lo
pdf pdf-am ps ps-am tags uninstall uninstall-am \
uninstall-info-am
-
-#tsrc_SOURCES = tsrc.c
-#tsrc_LDADD = $(lib_LTLIBRARIES) /usr/lib/libsamplerate.so.0
-#tsrc_LDFLAGS = $(LIBS)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
--- /dev/null
+/*
+ tfifo.c
+ David Rowe
+ Nov 19 2012
+
+ Takes FIFOs, in particular thread safety.
+*/
+
+#include <assert.h>
+#include <stdio.h>
+#include <pthread.h>
+#include "fifo.h"
+
+#define FIFO_SZ 1024
+#define WRITE_SZ 10
+#define READ_SZ 8
+#define N_MAX 100
+#define LOOPS 10000
+
+int run_thread = 1;
+struct FIFO *f;
+
+void writer(void);
+void *writer_thread(void *data);
+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+#define USE_THREADS
+#define USE_MUTEX
+
+int main() {
+ pthread_t awriter_thread;
+ int i,j;
+ short read_buf[READ_SZ];
+ int n_out = 0;
+ int sucess;
+
+ f = fifo_create(FIFO_SZ);
+ #ifdef USE_THREADS
+ pthread_create(&awriter_thread, NULL, writer_thread, NULL);
+ #endif
+
+ for(i=0; i<LOOPS; ) {
+ #ifndef USE_THREADS
+ writer();
+ #endif
+
+ #ifdef USE_MUTEX
+ pthread_mutex_lock(&mutex);
+ #endif
+ sucess = (fifo_read(f, read_buf, READ_SZ) == 0);
+ #ifdef USE_MUTEX
+ pthread_mutex_unlock(&mutex);
+ #endif
+
+ if (sucess) {
+ for(j=0; j<READ_SZ; j++) {
+ if (read_buf[j] != n_out)
+ printf("error: %d %d\n", read_buf[j], n_out);
+ n_out++;
+ if (n_out == N_MAX)
+ n_out = 0;
+ }
+ i++;
+ }
+
+ }
+
+ #ifdef USE_THREADS
+ run_thread = 0;
+ pthread_join(awriter_thread,NULL);
+ #endif
+
+ return 0;
+}
+
+int n_in = 0;
+
+void writer(void) {
+ short write_buf[WRITE_SZ];
+ int i;
+
+ if ((FIFO_SZ - fifo_n(f)) > WRITE_SZ) {
+ for(i=0; i<WRITE_SZ; i++) {
+ write_buf[i] = n_in++;
+ if (n_in == N_MAX)
+ n_in = 0;
+ }
+ #ifdef USE_MUTEX
+ pthread_mutex_lock(&mutex);
+ #endif
+ fifo_write(f, write_buf, WRITE_SZ);
+ pthread_mutex_unlock(&mutex);
+ }
+}
+
+void *writer_thread(void *data) {
+
+ while(run_thread) {
+ writer();
+ }
+
+ return NULL;
+}