From 293ed0bb121020224f308e8bcd03cf5f8673b890 Mon Sep 17 00:00:00 2001 From: John Melton - G0ORX/N6LYT Date: Sat, 16 Jul 2016 11:12:23 +0000 Subject: [PATCH] changed audio_write interface. worked on FreeDV for new protocol --- audio.c | 21 ++++++ audio.h | 3 + new_protocol.c | 178 ++++++++++++++++++++++++++++++++----------------- old_protocol.c | 13 ++-- 4 files changed, 147 insertions(+), 68 deletions(-) diff --git a/audio.c b/audio.c index 07249a4..1bca582 100644 --- a/audio.c +++ b/audio.c @@ -76,6 +76,26 @@ void audio_close() { pa_simple_free(stream); } +void audio_write(short left_sample,short right_sample) { + int result; + int error; + + audio_buffer[audio_offset++]=left_sample>>8; + audio_buffer[audio_offset++]=left_sample; + audio_buffer[audio_offset++]=right_sample>>8; + audio_buffer[audio_offset++]=right_sample; + + if(audio_offset==AUDIO_BUFFER_SIZE) { + result=pa_simple_write(stream, audio_buffer, (size_t)AUDIO_BUFFER_SIZE, &error); + if(result< 0) { + fprintf(stderr, __FILE__": pa_simple_write() failed: %s\n", pa_strerror(error)); + //_exit(1); + } + audio_offset=0; + } +} + +/* void audio_write(double* buffer,int samples) { int i; int result; @@ -101,3 +121,4 @@ void audio_write(double* buffer,int samples) { } } +*/ diff --git a/audio.h b/audio.h index f8aff4a..cedea09 100644 --- a/audio.h +++ b/audio.h @@ -22,4 +22,7 @@ extern int audio_buffer_size; int audio_init(); void audio_close(); +void audio_write(short left_sample,short right_sample); +/* void audio_write(double *buffer,int samples); +*/ diff --git a/new_protocol.c b/new_protocol.c index 3f695a5..b8fd5da 100644 --- a/new_protocol.c +++ b/new_protocol.c @@ -40,6 +40,7 @@ #include #include "alex.h" +#include "audio.h" #include "band.h" #include "new_protocol.h" #include "channel.h" @@ -128,15 +129,25 @@ static sem_t send_general_sem; static int send_general=0; static int samples=0; -static int outputsamples; +static int outputsamples=BUFFER_SIZE; + +static double iqinputbuffer[BUFFER_SIZE*2]; +static double audiooutputbuffer[BUFFER_SIZE*2]; + +static short leftaudiosample; +static short rightaudiosample; +static long audiosequence; +static unsigned char audiobuffer[1444]; +static int audioindex; #ifdef FREEDV static int freedv_samples=0; -static int freedv_divisor=6; +static int freedv_divisor=6; // convert from 48000 to 8000 #endif static void* new_protocol_thread(void* arg); static void* new_protocol_timer_thread(void* arg); +static void full_rx_buffer(); static void full_tx_buffer(); void schedule_high_priority(int source) { @@ -175,6 +186,13 @@ void new_protocol_init(int rx,int pixels) { fprintf(stderr,"new_protocol_init: %d\n",rx); + if(local_audio) { + if(audio_init()!=0) { + fprintf(stderr,"audio_init failed\n"); + local_audio=0; + } + } + rc=sem_init(&response_sem, 0, 0); rc=sem_init(&send_high_priority_sem, 0, 1); rc=sem_init(&send_general_sem, 0, 1); @@ -222,7 +240,7 @@ static void new_protocol_high_priority(int run,int tx,int drive) { unsigned char buffer[1444]; BAND *band=band_get_current_band(); -//fprintf(stderr,"new_protocol_high_priority: run=%d tx=%d drive=%d tx_ant=0x%08x rx_ant=0x%08x\n", run, tx, drive, alex_tx_antenna, alex_rx_antenna); +fprintf(stderr,"new_protocol_high_priority: run=%d tx=%d drive=%d\n", run, tx, drive); memset(buffer, 0, sizeof(buffer)); buffer[0]=high_priority_sequence>>24; @@ -546,7 +564,8 @@ void new_protocol_stop() { } float sineWave(double* buf, int samples, float phase, float freq) { - float phase_step = 2 * PI * freq / 192000.0F; + //float phase_step = 2 * PI * freq / 192000.0F; + float phase_step = 2 * PI * freq / 48000.0F; int i; for (i = 0; i < samples; i++) { buf[i*2] = (double) sin(phase); @@ -563,11 +582,6 @@ double calibrate(int v) { return (v1*v1)/0.095; } -void new_protocol_calc_buffers() { - // always 48000 input - freedv_divisor=6; -} - void* new_protocol_thread(void* arg) { d=&discovered[selected_device]; @@ -593,20 +607,6 @@ void* new_protocol_thread(void* arg) { int previous_dot; int previous_dash; - int samples; - //float leftinputbuffer[BUFFER_SIZE]; - //float rightinputbuffer[BUFFER_SIZE]; - double iqinputbuffer[BUFFER_SIZE*2]; - - //float leftoutputbuffer[BUFFER_SIZE]; - //float rightoutputbuffer[BUFFER_SIZE]; - double audiooutputbuffer[BUFFER_SIZE*2]; - - short leftaudiosample; - short rightaudiosample; - long audiosequence; - unsigned char audiobuffer[1444]; - int audioindex; int micsample; float micsamplefloat; @@ -629,8 +629,6 @@ fprintf(stderr,"new_protocol_thread: receiver=%d\n", receiver); micsamples=0; iqindex=4; - new_protocol_calc_buffers(); - micoutputsamples=BUFFER_SIZE*4; // 48000 in, 192000 out fprintf(stderr,"outputsamples=%d\n", outputsamples); @@ -726,38 +724,7 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples); samples++; if(samples==BUFFER_SIZE) { - int error; - fexchange0(CHANNEL_RX0+receiver, iqinputbuffer, audiooutputbuffer, &error); - if(error!=0) { - fprintf(stderr,"fexchange0 returned error: %d for receiver %d\n", error,receiver); - } - - Spectrum0(1, CHANNEL_RX0+receiver, 0, 0, iqinputbuffer); - - for(j=0;j>8; - audiobuffer[audioindex++]=leftaudiosample; - audiobuffer[audioindex++]=rightaudiosample>>8; - audiobuffer[audioindex++]=rightaudiosample; - - if(audioindex>=sizeof(audiobuffer)) { - // insert the sequence - audiobuffer[0]=audiosequence>>24; - audiobuffer[1]=audiosequence>>16; - audiobuffer[2]=audiosequence>>8; - audiobuffer[3]=audiosequence; - // send the buffer - if(sendto(data_socket,audiobuffer,sizeof(audiobuffer),0,(struct sockaddr*)&audio_addr,audio_addr_length)<0) { - fprintf(stderr,"sendto socket failed for audio\n"); - exit(1); - } - audioindex=4; - audiosequence++; - } - } + full_rx_buffer(); samples=0; } } @@ -884,9 +851,96 @@ if(dash!=previous_dash) { close(data_socket); } +static void full_rx_buffer() { + int j; + int error; + + fexchange0(CHANNEL_RX0+receiver, iqinputbuffer, audiooutputbuffer, &error); + if(error!=0) { + fprintf(stderr,"fexchange0 returned error: %d for receiver %d\n", error,receiver); + } + Spectrum0(1, CHANNEL_RX0+receiver, 0, 0, iqinputbuffer); + +#ifdef FREEDV + if(mode==modeFREEDV) { + int demod_samples; + for(j=0;j>8; + audiobuffer[audioindex++]=leftaudiosample; + audiobuffer[audioindex++]=rightaudiosample>>8; + audiobuffer[audioindex++]=rightaudiosample; + if(audioindex>=sizeof(audiobuffer)) { + // insert the sequence + audiobuffer[0]=audiosequence>>24; + audiobuffer[1]=audiosequence>>16; + audiobuffer[2]=audiosequence>>8; + audiobuffer[3]=audiosequence; + // send the buffer + if(sendto(data_socket,audiobuffer,sizeof(audiobuffer),0,(struct sockaddr*)&audio_addr,audio_addr_length)<0) { + fprintf(stderr,"sendto socket failed for audio\n"); + exit(1); + } + audioindex=4; + audiosequence++; + } + } + } + } + } + } else { +#endif + for(j=0;j>8; + audiobuffer[audioindex++]=leftaudiosample; + audiobuffer[audioindex++]=rightaudiosample>>8; + audiobuffer[audioindex++]=rightaudiosample; + + if(audioindex>=sizeof(audiobuffer)) { + // insert the sequence + audiobuffer[0]=audiosequence>>24; + audiobuffer[1]=audiosequence>>16; + audiobuffer[2]=audiosequence>>8; + audiobuffer[3]=audiosequence; + // send the buffer + if(sendto(data_socket,audiobuffer,sizeof(audiobuffer),0,(struct sockaddr*)&audio_addr,audio_addr_length)<0) { + fprintf(stderr,"sendto socket failed for audio\n"); + exit(1); + } + audioindex=4; + audiosequence++; + } + } +#ifdef FREEDV + } +#endif +} + static void full_tx_buffer() { - int isample; - int qsample; + long isample; + long qsample; double gain; int j; int error; @@ -908,12 +962,12 @@ static void full_tx_buffer() { gain=8388607.0*255.0/(double)drive; } } else { - gain=65535.0; + gain=8388607.0; } for(j=0;j>16; iqbuffer[iqindex++]=isample>>8; diff --git a/old_protocol.c b/old_protocol.c index 5bfe753..56a7533 100644 --- a/old_protocol.c +++ b/old_protocol.c @@ -37,6 +37,7 @@ #include #include +#include "audio.h" #include "band.h" #include "channel.h" #include "discovered.h" @@ -555,9 +556,6 @@ static void full_rx_buffer() { if(demod_samples!=0) { int s; int t; - if(local_audio) { - audio_write(audiooutputbuffer,demod_samples); - } for(s=0;s>8; output_buffer[output_buffer_index++]=left_rx_sample; output_buffer[output_buffer_index++]=right_rx_sample>>8; @@ -595,12 +596,12 @@ static void full_rx_buffer() { fprintf(stderr,"fexchange2 (CHANNEL_RX0) returned error: %d\n", error); } Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer); - if(local_audio) { - audio_write(audiooutputbuffer,output_buffer_size); - } for(j=0;j>8; -- 2.45.2