From: drowe67 Date: Sun, 8 Jul 2012 00:15:20 +0000 (+0000) Subject: full duplex record and play test program works OK X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=5eb070ee802482254314149413834e62ac5244de;p=freetel-svn-tracking.git full duplex record and play test program works OK git-svn-id: https://svn.code.sf.net/p/freetel/code@585 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/unittest/Makefile.am b/codec2-dev/unittest/Makefile.am index 60333e75..17018176 100644 --- a/codec2-dev/unittest/Makefile.am +++ b/codec2-dev/unittest/Makefile.am @@ -3,7 +3,7 @@ AUTOMAKE_OPTS = gnu NAME = libcodec2 AM_CPPFLAGS = $(AM_CFLAGS) -noinst_PROGRAMS = genres genlsp extract vqtrain vqtrainjnd tnlp tinterp tquant vq_train_jvm scalarlsptest tfdmdv t48_8 lspsync create_interleaver tlspsens pa_rec pa_play +noinst_PROGRAMS = genres genlsp extract vqtrain vqtrainjnd tnlp tinterp tquant vq_train_jvm scalarlsptest tfdmdv t48_8 lspsync create_interleaver tlspsens pa_rec pa_play pa_recplay genres_SOURCES = genres.c ../src/lpc.c genres_LDADD = $(lib_LTLIBRARIES) @@ -76,3 +76,7 @@ pa_play_SOURCES = pa_play.c ../src/fdmdv.c ../src/kiss_fft.c pa_play_LDADD = $(lib_LTLIBRARIES) -lportaudio pa_play_LDFLAGS = $(LIBS) +pa_recplay_SOURCES = pa_recplay.c ../src/fdmdv.c ../src/kiss_fft.c +pa_recplay_LDADD = $(lib_LTLIBRARIES) -lportaudio +pa_recplay_LDFLAGS = $(LIBS) + diff --git a/codec2-dev/unittest/Makefile.in b/codec2-dev/unittest/Makefile.in index 7e83210d..50c54b76 100644 --- a/codec2-dev/unittest/Makefile.in +++ b/codec2-dev/unittest/Makefile.in @@ -41,7 +41,7 @@ noinst_PROGRAMS = genres$(EXEEXT) genlsp$(EXEEXT) extract$(EXEEXT) \ tinterp$(EXEEXT) tquant$(EXEEXT) vq_train_jvm$(EXEEXT) \ scalarlsptest$(EXEEXT) tfdmdv$(EXEEXT) t48_8$(EXEEXT) \ lspsync$(EXEEXT) create_interleaver$(EXEEXT) tlspsens$(EXEEXT) \ - pa_rec$(EXEEXT) pa_play$(EXEEXT) + pa_rec$(EXEEXT) pa_play$(EXEEXT) pa_recplay$(EXEEXT) subdir = unittest DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -82,6 +82,10 @@ am_pa_rec_OBJECTS = pa_rec.$(OBJEXT) fdmdv.$(OBJEXT) \ kiss_fft.$(OBJEXT) pa_rec_OBJECTS = $(am_pa_rec_OBJECTS) pa_rec_DEPENDENCIES = +am_pa_recplay_OBJECTS = pa_recplay.$(OBJEXT) fdmdv.$(OBJEXT) \ + kiss_fft.$(OBJEXT) +pa_recplay_OBJECTS = $(am_pa_recplay_OBJECTS) +pa_recplay_DEPENDENCIES = am_scalarlsptest_OBJECTS = scalarlsptest.$(OBJEXT) quantise.$(OBJEXT) \ lpc.$(OBJEXT) lsp.$(OBJEXT) dump.$(OBJEXT) kiss_fft.$(OBJEXT) \ $(am__objects_1) @@ -138,17 +142,17 @@ LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(create_interleaver_SOURCES) $(extract_SOURCES) \ $(genlsp_SOURCES) $(genres_SOURCES) $(lspsync_SOURCES) \ - $(pa_play_SOURCES) $(pa_rec_SOURCES) $(scalarlsptest_SOURCES) \ - $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tinterp_SOURCES) \ - $(tlspsens_SOURCES) $(tnlp_SOURCES) $(tquant_SOURCES) \ - $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \ + $(pa_play_SOURCES) $(pa_rec_SOURCES) $(pa_recplay_SOURCES) \ + $(scalarlsptest_SOURCES) $(t48_8_SOURCES) $(tfdmdv_SOURCES) \ + $(tinterp_SOURCES) $(tlspsens_SOURCES) $(tnlp_SOURCES) \ + $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \ $(vqtrainjnd_SOURCES) DIST_SOURCES = $(create_interleaver_SOURCES) $(extract_SOURCES) \ $(genlsp_SOURCES) $(genres_SOURCES) $(lspsync_SOURCES) \ - $(pa_play_SOURCES) $(pa_rec_SOURCES) $(scalarlsptest_SOURCES) \ - $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tinterp_SOURCES) \ - $(tlspsens_SOURCES) $(tnlp_SOURCES) $(tquant_SOURCES) \ - $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \ + $(pa_play_SOURCES) $(pa_rec_SOURCES) $(pa_recplay_SOURCES) \ + $(scalarlsptest_SOURCES) $(t48_8_SOURCES) $(tfdmdv_SOURCES) \ + $(tinterp_SOURCES) $(tlspsens_SOURCES) $(tnlp_SOURCES) \ + $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \ $(vqtrainjnd_SOURCES) ETAGS = etags CTAGS = ctags @@ -315,6 +319,9 @@ pa_rec_LDFLAGS = $(LIBS) pa_play_SOURCES = pa_play.c ../src/fdmdv.c ../src/kiss_fft.c pa_play_LDADD = $(lib_LTLIBRARIES) -lportaudio pa_play_LDFLAGS = $(LIBS) +pa_recplay_SOURCES = pa_recplay.c ../src/fdmdv.c ../src/kiss_fft.c +pa_recplay_LDADD = $(lib_LTLIBRARIES) -lportaudio +pa_recplay_LDFLAGS = $(LIBS) all: all-am .SUFFIXES: @@ -376,6 +383,9 @@ pa_play$(EXEEXT): $(pa_play_OBJECTS) $(pa_play_DEPENDENCIES) pa_rec$(EXEEXT): $(pa_rec_OBJECTS) $(pa_rec_DEPENDENCIES) @rm -f pa_rec$(EXEEXT) $(LINK) $(pa_rec_LDFLAGS) $(pa_rec_OBJECTS) $(pa_rec_LDADD) $(LIBS) +pa_recplay$(EXEEXT): $(pa_recplay_OBJECTS) $(pa_recplay_DEPENDENCIES) + @rm -f pa_recplay$(EXEEXT) + $(LINK) $(pa_recplay_LDFLAGS) $(pa_recplay_OBJECTS) $(pa_recplay_LDADD) $(LIBS) scalarlsptest$(EXEEXT): $(scalarlsptest_OBJECTS) $(scalarlsptest_DEPENDENCIES) @rm -f scalarlsptest$(EXEEXT) $(LINK) $(scalarlsptest_LDFLAGS) $(scalarlsptest_OBJECTS) $(scalarlsptest_LDADD) $(LIBS) @@ -436,6 +446,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/octave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pa_play.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pa_rec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pa_recplay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/phase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/postfilter.Po@am__quote@ diff --git a/codec2-dev/unittest/pa_recplay.c b/codec2-dev/unittest/pa_recplay.c new file mode 100644 index 00000000..c62eb905 --- /dev/null +++ b/codec2-dev/unittest/pa_recplay.c @@ -0,0 +1,205 @@ +/* + pa_recplay.c + David Rowe + July 8 2012 + + Echos audio from sound card input to sound card output. Samples at + 48 kHz, converts to 8 kHz, converts back to 48kHz, and plays using + the default sound device. Used as an intermediate step in + Portaudio integration. + + Modified from paex_record.c Portaudio example. Original author + author Phil Burk http://www.softsynth.com +*/ + +/* + * $Id: paex_record.c 1752 2011-09-08 03:21:55Z philburk $ + * + * This program uses the PortAudio Portable Audio Library. + * For more information see: http://www.portaudio.com + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include "portaudio.h" +#include "fdmdv.h" + +#define SAMPLE_RATE 48000 /* 48 kHz sampling rate rec. as we + can trust accuracy of sound + card */ +#define N8 160 /* processing buffer size at 8 kHz */ +#define N48 (N8*FDMDV_OS) /* processing buffer size at 48 kHz */ +#define MEM8 (FDMDV_OS_TAPS/FDMDV_OS) +#define NUM_CHANNELS 2 /* I think most sound cards prefer + stereo, we will convert to mono + as we sample */ + +/* state information passed to call back */ + +typedef struct { + float in48k[FDMDV_OS_TAPS + N48]; + float in8k[MEM8 + N8]; +} paTestData; + + +/* + This routine will be called by the PortAudio engine when audio is + required. It may be called at interrupt level on some machines so + don't do anything that could mess up the system like calling + malloc() or free(). +*/ + +static int callback( const void *inputBuffer, void *outputBuffer, + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ) +{ + paTestData *data = (paTestData*)userData; + int i; + short *rptr = (short*)inputBuffer; + short *wptr = (short*)outputBuffer; + float *in8k = data->in8k; + float *in48k = data->in48k; + float out8k[N8]; + float out48k[N48]; + short out48k_short[N48]; + + (void) outputBuffer; /* Prevent unused variable warnings. */ + (void) timeInfo; + (void) statusFlags; + (void) userData; + + assert(inputBuffer != NULL); + + /* just use left channel */ + + for(i=0; iin48k[i+FDMDV_OS_TAPS] = *rptr; + + /* downsample and update filter memory */ + + fdmdv_48_to_8(out8k, &in48k[FDMDV_OS_TAPS], N8); + for(i=0; idefaultLowInputLatency; + inputParameters.hostApiSpecificStreamInfo = NULL; + + outputParameters.device = Pa_GetDefaultOutputDevice(); /* default input device */ + if (outputParameters.device == paNoDevice) { + fprintf(stderr,"Error: No default output device.\n"); + goto done; + } + outputParameters.channelCount = NUM_CHANNELS; /* stereo input */ + outputParameters.sampleFormat = paInt16; + outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; + outputParameters.hostApiSpecificStreamInfo = NULL; + + /* Play some audio --------------------------------------------- */ + + err = Pa_OpenStream( + &stream, + &inputParameters, + &outputParameters, + SAMPLE_RATE, + N48, + paClipOff, + callback, + &data ); + if( err != paNoError ) goto done; + + err = Pa_StartStream( stream ); + if( err != paNoError ) goto done; + + while( ( err = Pa_IsStreamActive( stream ) ) == 1 ) + { + Pa_Sleep(100); + } + if( err < 0 ) goto done; + + err = Pa_CloseStream( stream ); + if( err != paNoError ) goto done; + + +done: + Pa_Terminate(); + if( err != paNoError ) + { + fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "Error number: %d\n", err ); + fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); + err = 1; /* Always return 0 or 1, but no other return codes. */ + } + return err; +} +