From ca7ed5fdab4cb8677b89a06907628b95a43fcf52 Mon Sep 17 00:00:00 2001 From: John Melton G0ORX Date: Thu, 21 Nov 2019 16:12:45 +0000 Subject: [PATCH] Fixed local audio problem --- audio.c | 169 ++++++++++++++++++++----------------------------- audio.h | 4 +- ext.c | 1 + ext.h | 1 + old_protocol.c | 26 +++++++- radio.c | 9 ++- radio.h | 2 + radio_menu.c | 45 ++++++++++++- receiver.c | 64 ++++++++++++------- receiver.h | 11 ++-- transmitter.c | 3 - transmitter.h | 2 - 12 files changed, 195 insertions(+), 142 deletions(-) diff --git a/audio.c b/audio.c index d6840e8..6ae9846 100644 --- a/audio.c +++ b/audio.c @@ -48,24 +48,11 @@ #endif int audio = 0; -long audio_buffer_size = 256; // samples (both left and right) int mic_buffer_size = 720; // samples (both left and right) //static snd_pcm_t *playback_handle=NULL; static snd_pcm_t *record_handle=NULL; -// each buffer contains 63 samples of left and right audio at 16 bits -#define AUDIO_SAMPLES 63 -#define AUDIO_SAMPLE_SIZE 2 -#define AUDIO_CHANNELS 2 -#define AUDIO_BUFFERS 10 -#define OUTPUT_BUFFER_SIZE (AUDIO_SAMPLE_SIZE*AUDIO_CHANNELS*audio_buffer_size) - -#define MIC_BUFFER_SIZE (AUDIO_SAMPLE_SIZE*AUDIO_CHANNELS*mic_buffer_size) - -//static unsigned char *audio_buffer=NULL; -//static int audio_offset=0; - static float *mic_buffer=NULL; static GThread *mic_read_thread_id; @@ -83,15 +70,17 @@ AUDIO_DEVICE output_devices[MAX_AUDIO_DEVICES]; int audio_open_output(RECEIVER *rx) { int err; snd_pcm_hw_params_t *hw_params; - int rate=48000; - int dir=0; + unsigned int rate=48000; + unsigned int channels=2; + int soft_resample=0; + unsigned int latency=50000; if(rx->audio_name==NULL) { rx->local_audio=0; return -1; } -fprintf(stderr,"audio_open_output: rx=%d %s\n",rx->id,rx->audio_name); +fprintf(stderr,"audio_open_output: rx=%d %s buffer_size=%d\n",rx->id,rx->audio_name,rx->local_audio_buffer_size); int i; char hw[128]; @@ -106,81 +95,46 @@ fprintf(stderr,"audio_open_output: rx=%d %s\n",rx->id,rx->audio_name); fprintf(stderr,"audio_open_output: hw=%s\n",hw); + g_mutex_lock(&rx->local_audio_mutex); + if ((err = snd_pcm_open (&rx->playback_handle, hw, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { fprintf (stderr, "audio_open_output: cannot open audio device %s (%s)\n", hw, snd_strerror (err)); + g_mutex_unlock(&rx->local_audio_mutex); return -1; } fprintf(stderr,"audio_open_output: handle=%p\n",rx->playback_handle); - if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) { - fprintf (stderr, "audio_open_output: cannot allocate hardware parameter structure (%s)\n", - snd_strerror (err)); - audio_close_output(rx); - return -1; - } - - if ((err = snd_pcm_hw_params_any (rx->playback_handle, hw_params)) < 0) { - fprintf (stderr, "audio_open_output: cannot initialize hardware parameter structure (%s)\n", - snd_strerror (err)); - audio_close_output(rx); - return -1; - } - - if ((err = snd_pcm_hw_params_set_access (rx->playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { - fprintf (stderr, "audio_open_output: cannot set access type (%s)\n", - snd_strerror (err)); - audio_close_output(rx); - return -1; -} - - if ((err = snd_pcm_hw_params_set_format (rx->playback_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) { - fprintf (stderr, "audio_open_output: cannot set sample format (%s)\n", - snd_strerror (err)); - audio_close_output(rx); - return -1; - } - - - if ((err = snd_pcm_hw_params_set_rate_near (rx->playback_handle, hw_params, &rate, &dir)) < 0) { - fprintf (stderr, "audio_open_output: cannot set sample rate (%s)\n", - snd_strerror (err)); - audio_close_output(rx); - return -1; - } - - if ((err = snd_pcm_hw_params_set_channels (rx->playback_handle, hw_params, 2)) < 0) { - fprintf (stderr, "audio_open_output: cannot set channel count (%s)\n", - snd_strerror (err)); - audio_close_output(rx); - return -1; - } - - if ((err = snd_pcm_hw_params (rx->playback_handle, hw_params)) < 0) { - fprintf (stderr, "audio_open_output: cannot set parameters (%s)\n", - snd_strerror (err)); + if ((err = snd_pcm_set_params (rx->playback_handle,SND_PCM_FORMAT_FLOAT_LE,SND_PCM_ACCESS_RW_INTERLEAVED,channels,rate,soft_resample,latency)) < 0) { + g_print("audio_open_output: snd_pcm_set_params failed: %s\n",snd_strerror(err)); + g_mutex_unlock(&rx->local_audio_mutex); audio_close_output(rx); return -1; } - - snd_pcm_hw_params_free (hw_params); - rx->playback_offset=0; - rx->playback_buffer=(unsigned char *)malloc(OUTPUT_BUFFER_SIZE); + rx->local_audio_buffer_offset=0; + rx->local_audio_buffer=g_new0(float,2*rx->local_audio_buffer_size); - fprintf(stderr,"audio_open_output: rx=%d audio_device=%d handle=%p buffer=%p\n",rx->id,rx->audio_device,rx->playback_handle,rx->playback_buffer); + fprintf(stderr,"audio_open_output: rx=%d audio_device=%d handle=%p buffer=%p size=%d\n",rx->id,rx->audio_device,rx->playback_handle,rx->local_audio_buffer,rx->local_audio_buffer_size); + + g_mutex_unlock(&rx->local_audio_mutex); return 0; } int audio_open_input() { int err; snd_pcm_hw_params_t *hw_params; - int rate=48000; + unsigned int rate=48000; + unsigned int channels=1; + int soft_resample=0; + unsigned int latency=50000; + int dir=0; if(transmitter->microphone_name==NULL) { + transmitter->local_microphone=0; return -1; } fprintf(stderr,"audio_open_input: %s\n",transmitter->microphone_name); @@ -222,6 +176,13 @@ fprintf(stderr,"audio_open_input: %s\n",transmitter->microphone_name); return -1; } + if ((err = snd_pcm_set_params (record_handle,SND_PCM_FORMAT_FLOAT_LE,SND_PCM_ACCESS_RW_INTERLEAVED,channels,rate,soft_resample,latency)) < 0) { + g_print("audio_open_input: snd_pcm_set_params failed: %s\n",snd_strerror(err)); + audio_close_input(); + return -1; + } + +/* if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) { fprintf (stderr, "audio_open_input: cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)); @@ -272,6 +233,7 @@ fprintf(stderr,"audio_open_input: %s\n",transmitter->microphone_name); } snd_pcm_hw_params_free (hw_params); +*/ mic_buffer=g_new0(float,mic_buffer_size); @@ -288,15 +250,17 @@ fprintf(stderr,"audio_open_input: %s\n",transmitter->microphone_name); } void audio_close_output(RECEIVER *rx) { -fprintf(stderr,"audio_close_output: rx=%d handle=%p buffer=%p\n",rx->id,rx->playback_handle,rx->playback_buffer); +fprintf(stderr,"audio_close_output: rx=%d handle=%p buffer=%p\n",rx->id,rx->playback_handle,rx->local_audio_buffer); + g_mutex_lock(&rx->local_audio_mutex); if(rx->playback_handle!=NULL) { snd_pcm_close (rx->playback_handle); rx->playback_handle=NULL; } - if(rx->playback_buffer!=NULL) { - free(rx->playback_buffer); - rx->playback_buffer=NULL; + if(rx->local_audio_buffer!=NULL) { + g_free(rx->local_audio_buffer); + rx->local_audio_buffer=NULL; } + g_mutex_unlock(&rx->local_audio_mutex); } void audio_close_input() { @@ -325,30 +289,29 @@ int cw_audio_write(double sample){ RECEIVER *rx = active_receiver; - if(rx->playback_handle!=NULL && rx->playback_buffer!=NULL) { - shortsample = (short) (sample * 32767.0); - rx->playback_buffer[rx->playback_offset++]=shortsample; - rx->playback_buffer[rx->playback_offset++]=shortsample>>8; - rx->playback_buffer[rx->playback_offset++]=shortsample; - rx->playback_buffer[rx->playback_offset++]=shortsample>>8; + if(rx->playback_handle!=NULL && rx->local_audio_buffer!=NULL) { + rx->local_audio_buffer[(rx->local_audio_buffer_offset*2)]=shortsample; + rx->local_audio_buffer[(rx->local_audio_buffer_offset*2)+1]=shortsample; + rx->local_audio_buffer_offset++; - if(rx->playback_offset==OUTPUT_BUFFER_SIZE) { + if(rx->local_audio_buffer_offset>=rx->local_audio_buffer_size) { trim=0; +/* if(snd_pcm_delay(rx->playback_handle,&delay)==0) { if(delay>2048) { trim=delay-2048; fprintf(stderr,"audio delay=%ld trim=%ld\n",delay,trim); } } - - if(trimplayback_handle, rx->playback_buffer, audio_buffer_size-trim)) != audio_buffer_size-trim) { +*/ + if(trimlocal_audio_buffer_size) { + if ((rc = snd_pcm_writei (rx->playback_handle, rx->local_audio_buffer, rx->local_audio_buffer_size-trim)) != rx->local_audio_buffer_size-trim) { if(rc<0) { if(rc==-EPIPE) { if ((rc = snd_pcm_prepare (rx->playback_handle)) < 0) { - fprintf (stderr, "audio_write: cannot prepare audio interface for use %d (%s)\n", rc, snd_strerror (rc)); + fprintf (stderr, "audio_write: cannot prepare audio interface for use %ld (%s)\n", rc, snd_strerror (rc)); return -1; } else { // ignore short write @@ -357,7 +320,7 @@ fprintf(stderr,"audio delay=%ld trim=%ld\n",delay,trim); } } } - rx->playback_offset=0; + rx->local_audio_buffer_offset=0; } } return 0; @@ -367,16 +330,19 @@ fprintf(stderr,"audio delay=%ld trim=%ld\n",delay,trim); // if rx == active_receiver and while transmitting, DO NOTHING // since cw_audio_write may be active // -static int buffers=0; -int audio_write(RECEIVER *rx,short left_sample,short right_sample) { +int audio_write(RECEIVER *rx,float left_sample,float right_sample) { snd_pcm_sframes_t delay; long rc; long trim; int mode=modeUSB; + + g_mutex_lock(&rx->local_audio_mutex); + if(can_transmit) { mode=transmitter->mode; } + // // We have to stop the stream here if a CW side tone may occur. // This might cause underflows, but we cannot use audio_write @@ -387,37 +353,35 @@ int audio_write(RECEIVER *rx,short left_sample,short right_sample) { // if (rx == active_receiver && isTransmitting() && (mode==modeCWU || mode==modeCWL)) { + g_mutex_unlock(&rx->local_audio_mutex); return 0; } - if(rx->playback_handle!=NULL && rx->playback_buffer!=NULL) { - rx->playback_buffer[rx->playback_offset++]=right_sample; - rx->playback_buffer[rx->playback_offset++]=right_sample>>8; - rx->playback_buffer[rx->playback_offset++]=left_sample; - rx->playback_buffer[rx->playback_offset++]=left_sample>>8; - - if(rx->playback_offset==OUTPUT_BUFFER_SIZE) { + if(rx->playback_handle!=NULL && rx->local_audio_buffer!=NULL) { + rx->local_audio_buffer[rx->local_audio_buffer_offset*2]=left_sample; + rx->local_audio_buffer[(rx->local_audio_buffer_offset*2)+1]=right_sample; + rx->local_audio_buffer_offset++; - buffers++; + if(rx->local_audio_buffer_offset>=rx->local_audio_buffer_size) { trim=0; - int max_delay=audio_buffer_size*4; + int max_delay=rx->local_audio_buffer_size*4; if(snd_pcm_delay(rx->playback_handle,&delay)==0) { if(delay>max_delay) { trim=delay-max_delay; -//fprintf(stderr,"audio buffers=%d delay=%ld trim=%ld audio_buffer_size=%d\n",buffers,delay,trim,audio_buffer_size); +fprintf(stderr,"audio delay=%ld trim=%ld audio_buffer_size=%d\n",delay,trim,rx->local_audio_buffer_size); } } - - if(trimplayback_handle, rx->playback_buffer, audio_buffer_size-trim)) != audio_buffer_size-trim) { + if(trimlocal_audio_buffer_size) { + if ((rc = snd_pcm_writei (rx->playback_handle, rx->local_audio_buffer, rx->local_audio_buffer_size-trim)) != rx->local_audio_buffer_size-trim) { if(rc<0) { if(rc==-EPIPE) { if ((rc = snd_pcm_prepare (rx->playback_handle)) < 0) { - fprintf (stderr, "audio_write: cannot prepare audio interface for use %d (%s)\n", rc, snd_strerror (rc)); - rx->playback_offset=0; + fprintf (stderr, "audio_write: cannot prepare audio interface for use %ld (%s)\n", rc, snd_strerror (rc)); + rx->local_audio_buffer_offset=0; + g_mutex_unlock(&rx->local_audio_mutex); return -1; } } else { @@ -426,9 +390,10 @@ int audio_write(RECEIVER *rx,short left_sample,short right_sample) { } } } - rx->playback_offset=0; + rx->local_audio_buffer_offset=0; } } + g_mutex_unlock(&rx->local_audio_mutex); return 0; } diff --git a/audio.h b/audio.h index 7db45ee..00deea1 100644 --- a/audio.h +++ b/audio.h @@ -24,6 +24,8 @@ #define MAX_AUDIO_DEVICES 64 +#define AUDIO_BUFFER_SIZE 480 + typedef struct _audio_devices { char *name; int index; @@ -39,6 +41,6 @@ extern int audio_open_input(); extern void audio_close_input(); extern int audio_open_output(RECEIVER *rx); extern void audio_close_output(RECEIVER *rx); -extern int audio_write(RECEIVER *rx,short left_sample,short right_sample); +extern int audio_write(RECEIVER *rx,float left_sample,float right_sample); extern void audio_get_cards(); #endif diff --git a/ext.c b/ext.c index 12a2cd4..6feb74d 100644 --- a/ext.c +++ b/ext.c @@ -612,3 +612,4 @@ int ext_set_rf_gain(void *data) { set_rf_gain(active_receiver->id,value); return 0; } + diff --git a/ext.h b/ext.h index 6c44e2b..8e69e95 100644 --- a/ext.h +++ b/ext.h @@ -106,3 +106,4 @@ int ext_start_tx(void *data); int ext_diversity_update(void *data); int ext_sat_update(void *data); int ext_set_rf_gain(void *data); + diff --git a/old_protocol.c b/old_protocol.c index 75bf3f7..4f12a0a 100644 --- a/old_protocol.c +++ b/old_protocol.c @@ -189,6 +189,27 @@ static int output_buffer_index=8; static int command=1; +enum { + SYNC_0=0, + SYNC_1, + SYNC_2, + CONTROL_0, + CONTROL_1, + CONTROL_2, + CONTROL_3, + CONTROL_4, + LEFT_SAMPLE_HI, + LEFT_SAMPLE_MID, + LEFT_SAMPLE_LOW, + RIGHT_SAMPLE_HI, + RIGHT_SAMPLE_MID, + RIGHT_SAMPLE_LOW, + MIC_SAMPLE_HI, + MIC_SAMPLE_LOW, + SKIP +}; +static int state=SYNC_0; + static GThread *receive_thread_id; static gpointer receive_thread(gpointer arg); static void process_ozy_input_buffer(unsigned char *buffer); @@ -206,6 +227,7 @@ static void metis_restart(); static void open_tcp_socket(void); static void open_udp_socket(void); +static int how_many_receivers(); #define COMMON_MERCURY_FREQUENCY 0x80 #define PENELOPE_MIC 0x80 @@ -244,8 +266,8 @@ void old_protocol_set_mic_sample_rate(int rate) { void old_protocol_init(int rx,int pixels,int rate) { int i; - - fprintf(stderr,"old_protocol_init\n"); + int num_hpsdr_receivers=how_many_receivers(); + fprintf(stderr,"old_protocol_init: num_hpsdr_receivers=%d\n",how_many_receivers()); old_protocol_set_mic_sample_rate(rate); diff --git a/radio.c b/radio.c index b4417de..3bfbd56 100644 --- a/radio.c +++ b/radio.c @@ -144,7 +144,7 @@ RECEIVER *receiver[MAX_RECEIVERS]; RECEIVER *active_receiver; TRANSMITTER *transmitter; -int buffer_size=2048; // 64, 128, 256, 512, 1024, 2048 +int buffer_size=1024; // 64, 128, 256, 512, 1024, 2048 int fft_size=2048; // 1024, 2048, 4096, 8192, 16384 int atlas_penelope=0; @@ -253,8 +253,9 @@ unsigned int IO1; unsigned int IO2; unsigned int IO3; int supply_volts; -int mox; -int tune; +int ptt=0; +int mox=0; +int tune=0; int memory_tune=0; int full_tune=0; @@ -1037,6 +1038,7 @@ void radio_change_sample_rate(int rate) { // The radio menu calls this function even if the sample rate // has not changed. Do nothing in this case. if (receiver[0]->sample_rate != rate) { + radio_sample_rate=rate; old_protocol_stop(); for(i=0;iOCrx=band->OCtx=1; + band=band_get_band(band80); + band->OCrx=band->OCtx=66; + band=band_get_band(band60); + band->OCrx=band->OCtx=68; + band=band_get_band(band40); + band->OCrx=band->OCtx=68; + band=band_get_band(band30); + band->OCrx=band->OCtx=72; + band=band_get_band(band20); + band->OCrx=band->OCtx=72; + band=band_get_band(band17); + band->OCrx=band->OCtx=80; + band=band_get_band(band15); + band->OCrx=band->OCtx=80; + band=band_get_band(band12); + band->OCrx=band->OCtx=96; + band=band_get_band(band10); + band->OCrx=band->OCtx=96; + if(protocol==NEW_PROTOCOL) { + schedule_high_priority(); + } + return; + } + if(protocol==NEW_PROTOCOL) { filter_board_changed(); } @@ -268,6 +297,14 @@ static void charly25_cb(GtkWidget *widget, gpointer data) { } } +static void n2adr_cb(GtkWidget *widget, gpointer data) { + if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { + filter_board = N2ADR; + load_filters(); + } +} + + static void sample_rate_cb(GtkWidget *widget, gpointer data) { radio_change_sample_rate(GPOINTER_TO_INT(data)); } @@ -441,7 +478,7 @@ void radio_menu(GtkWidget *parent) { GtkWidget *sample_rate=gtk_radio_button_new_with_label(NULL,rate); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate), radio->info.soapy.sample_rate); gtk_grid_attach(GTK_GRID(grid),sample_rate,col,row,1,1); - g_signal_connect(sample_rate,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)radio->info.soapy.sample_rate); + g_signal_connect(sample_rate,"pressed",G_CALLBACK(sample_rate_cb),GINT_TO_POINTER(radio->info.soapy.sample_rate)); col++; } @@ -516,10 +553,16 @@ void radio_menu(GtkWidget *parent) { gtk_grid_attach(GTK_GRID(grid), charly25_b, col, row, 1, 1); row++; + GtkWidget *n2adr_b = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(none_b), "N2ADR"); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(n2adr_b), filter_board==N2ADR); + gtk_grid_attach(GTK_GRID(grid), n2adr_b, col, row, 1, 1); + row++; + g_signal_connect(none_b, "toggled", G_CALLBACK(none_cb), NULL); g_signal_connect(alex_b, "toggled", G_CALLBACK(alex_cb), NULL); g_signal_connect(apollo_b, "toggled", G_CALLBACK(apollo_cb), NULL); g_signal_connect(charly25_b, "toggled", G_CALLBACK(charly25_cb), NULL); + g_signal_connect(n2adr_b, "toggled", G_CALLBACK(n2adr_cb), NULL); if(row>temp_row) temp_row=row; col++; diff --git a/receiver.c b/receiver.c index dee5a51..152a2e5 100644 --- a/receiver.c +++ b/receiver.c @@ -283,6 +283,9 @@ void receiver_save_state(RECEIVER *rx) { sprintf(name,"receiver.%d.local_audio",rx->id); sprintf(value,"%d",rx->local_audio); setProperty(name,value); + sprintf(name,"receiver.%d.local_audio_buffer_size",rx->id); + sprintf(value,"%d",rx->local_audio_buffer_size); + setProperty(name,value); if(rx->audio_name!=NULL) { sprintf(name,"receiver.%d.audio_name",rx->id); sprintf(value,"%s",rx->audio_name); @@ -463,6 +466,9 @@ fprintf(stderr,"receiver_restore_state: id=%d\n",rx->id); sprintf(name,"receiver.%d.local_audio",rx->id); value=getProperty(name); if(value) rx->local_audio=atoi(value); + sprintf(name,"receiver.%d.local_audio_buffer_size",rx->id); + value=getProperty(name); + if(value) rx->local_audio_buffer_size=atoi(value); sprintf(name,"receiver.%d.audio_name",rx->id); value=getProperty(name); if(value) { @@ -816,7 +822,7 @@ fprintf(stderr,"create_pure_signal_receiver: id=%d buffer_size=%d\n",id,buffer_s } } // allocate buffers - rx->iq_input_buffer=malloc(sizeof(double)*2*rx->buffer_size); + rx->iq_input_buffer=g_new(double,2*rx->buffer_size); rx->audio_buffer=NULL; rx->audio_sequence=0L; rx->pixel_samples=malloc(sizeof(float)*(rx->pixels)); @@ -861,8 +867,10 @@ fprintf(stderr,"create_pure_signal_receiver: id=%d buffer_size=%d\n",id,buffer_s rx->agc_hang_threshold=0.0; rx->playback_handle=NULL; - rx->playback_buffer=NULL; + rx->local_audio_buffer=NULL; + rx->local_audio_buffer_size=1024; rx->local_audio=0; + g_mutex_init(&rx->local_audio_mutex); rx->audio_name=NULL; rx->mute_when_not_active=0; rx->audio_channel=STEREO; @@ -958,10 +966,10 @@ fprintf(stderr,"create_receiver: id=%d default adc=%d\n",rx->id, rx->adc); rx->height=height; // allocate buffers - rx->iq_input_buffer=malloc(sizeof(double)*2*rx->buffer_size); - rx->audio_buffer=malloc(AUDIO_BUFFER_SIZE); + rx->iq_input_buffer=g_new(double,2*rx->buffer_size); + rx->audio_buffer_size=480; rx->audio_sequence=0L; - rx->pixel_samples=malloc(sizeof(float)*pixels); + rx->pixel_samples=g_new(float,pixels); rx->samples=0; rx->displaying=0; @@ -1005,6 +1013,9 @@ fprintf(stderr,"create_receiver: id=%d default adc=%d\n",rx->id, rx->adc); rx->playback_handle=NULL; rx->local_audio=0; + g_mutex_init(&rx->local_audio_mutex); + rx->local_audio_buffer=NULL; + rx->local_audio_buffer_size=1024; rx->audio_name=NULL; rx->mute_when_not_active=0; rx->audio_channel=STEREO; @@ -1037,10 +1048,11 @@ fprintf(stderr,"create_receiver: id=%d default adc=%d\n",rx->id, rx->adc); rx->resample_step=1; #endif -fprintf(stderr,"create_receiver (after restore): rx=%p id=%d local_audio=%d\n",rx,rx->id,rx->local_audio); +fprintf(stderr,"create_receiver (after restore): rx=%p id=%d audio_buffer_size=%d local_audio=%d\n",rx,rx->id,rx->audio_buffer_size,rx->local_audio); + rx->audio_buffer=g_new(guchar,rx->audio_buffer_size); int scale=rx->sample_rate/48000; rx->output_samples=rx->buffer_size/scale; - rx->audio_output_buffer=malloc(sizeof(double)*2*rx->output_samples); + rx->audio_output_buffer=g_new(gdouble,2*rx->output_samples); fprintf(stderr,"create_receiver: id=%d output_samples=%d\n",rx->id,rx->output_samples); @@ -1053,11 +1065,11 @@ fprintf(stderr,"create_receiver: id=%d after restore adc=%d\n",rx->id, rx->adc); fprintf(stderr,"create_receiver: OpenChannel id=%d buffer_size=%d fft_size=%d sample_rate=%d\n", rx->id, rx->buffer_size, - 2048, // rx->fft_size, + rx->fft_size, rx->sample_rate); OpenChannel(rx->id, rx->buffer_size, - 2048, // rx->fft_size, + rx->fft_size, rx->sample_rate, 48000, // dsp rate 48000, // output rate @@ -1139,9 +1151,7 @@ fprintf(stderr,"RXASetMP %d\n",rx->low_latency); fprintf(stderr,"create_receiver: rx=%p id=%d local_audio=%d\n",rx,rx->id,rx->local_audio); if(rx->local_audio) { - if(audio_open_output(rx)<0) { - rx->local_audio=0; - } + audio_open_output(rx); } return rx; @@ -1160,11 +1170,14 @@ void receiver_change_sample_rate(RECEIVER *rx,int sample_rate) { // that the central part can be displayed in the TX panadapter // + rx->sample_rate=sample_rate; int scale=rx->sample_rate/48000; rx->output_samples=rx->buffer_size/scale; + rx->audio_output_buffer=g_new(gdouble,2*rx->output_samples); rx->hz_per_pixel=(double)rx->sample_rate/(double)rx->width; +g_print("receiver_change_sample_rate: id=%d rate=%d scale=%d buffer_size=%d output_samples=%d\n",rx->id,sample_rate,scale,rx->buffer_size,rx->output_samples); #ifdef PURESIGNAL if (rx->id == PS_RX_FEEDBACK) { float *fp, *ofp; @@ -1192,8 +1205,8 @@ void receiver_change_sample_rate(RECEIVER *rx,int sample_rate) { SetChannelState(rx->id,0,1); free(rx->audio_output_buffer); - rx->audio_output_buffer=malloc(sizeof(double)*2*rx->output_samples); - rx->audio_buffer=malloc(AUDIO_BUFFER_SIZE); + rx->audio_output_buffer=g_new(double,2*rx->output_samples); + rx->audio_buffer=g_new(guchar,rx->audio_buffer_size); SetInputSamplerate(rx->id, sample_rate); SetEXTANBSamplerate (rx->id, sample_rate); SetEXTNOBSamplerate (rx->id, sample_rate); @@ -1347,16 +1360,20 @@ static void process_freedv_rx_buffer(RECEIVER *rx) { #endif static void process_rx_buffer(RECEIVER *rx) { - short left_audio_sample; - short right_audio_sample; + gdouble left_sample,right_sample; + short left_audio_sample,right_audio_sample; int i; for(i=0;ioutput_samples;i++) { if(isTransmitting() && !duplex) { + left_sample=0.0; + right_sample=0.0; left_audio_sample=0; right_audio_sample=0; } else { - left_audio_sample=(short)(rx->audio_output_buffer[i*2]*32767.0); - right_audio_sample=(short)(rx->audio_output_buffer[(i*2)+1]*32767.0); + left_sample=rx->audio_output_buffer[i*2]; + right_sample=rx->audio_output_buffer[(i*2)+1]; + left_audio_sample=(short)(left_sample*32767.0); + right_audio_sample=(short)(right_sample*32767.0); #ifdef PSK if(vfo[rx->id].mode==modePSK) { if(psk_samples==0) { @@ -1372,17 +1389,17 @@ static void process_rx_buffer(RECEIVER *rx) { if(rx->local_audio) { if(rx!=active_receiver && rx->mute_when_not_active) { - audio_write(rx,0,0); + audio_write(rx,0.0F,0.0F); } else { switch(rx->audio_channel) { case STEREO: - audio_write(rx,left_audio_sample,right_audio_sample); + audio_write(rx,(float)left_sample,(float)right_sample); break; case LEFT: - audio_write(rx,left_audio_sample,0); + audio_write(rx,(float)left_sample,0.0F); break; case RIGHT: - audio_write(rx,0,right_audio_sample); + audio_write(rx,0.0F,(float)right_sample); break; } } @@ -1448,7 +1465,7 @@ void full_rx_buffer(RECEIVER *rx) { fexchange0(rx->id, rx->iq_input_buffer, rx->audio_output_buffer, &error); if(error!=0) { - //fprintf(stderr,"full_rx_buffer: id=%d fexchange0: error=%d\n",rx->id,error); + fprintf(stderr,"full_rx_buffer: id=%d fexchange0: error=%d\n",rx->id,error); } if(rx->displaying) { @@ -1461,6 +1478,7 @@ void full_rx_buffer(RECEIVER *rx) { process_freedv_rx_buffer(rx); } else { #endif +//g_print("full_rx_buffer: rx=%d buffer_size=%d samples=%d\n",rx->id,rx->buffer_size,rx->samples); process_rx_buffer(rx); #ifdef FREEDV } diff --git a/receiver.h b/receiver.h index f201bfb..0bc5345 100644 --- a/receiver.h +++ b/receiver.h @@ -26,8 +26,6 @@ #include #endif -#define AUDIO_BUFFER_SIZE 260 - enum _audio_t { STEREO=0, LEFT, @@ -60,6 +58,7 @@ typedef struct _receiver { gint output_samples; gdouble *iq_input_buffer; gdouble *audio_output_buffer; + gint audio_buffer_size; guchar *audio_buffer; gint audio_index; guint32 audio_sequence; @@ -115,12 +114,14 @@ typedef struct _receiver { gchar *audio_name; #ifdef PORTAUDIO PaStream *playback_handle; - gfloat *playback_buffer; #else snd_pcm_t *playback_handle; - guchar *playback_buffer; #endif - gint playback_offset; + gint local_audio_buffer_size; + gint local_audio_buffer_offset; + float *local_audio_buffer; + GMutex local_audio_mutex; + gint low_latency; gint squelch_enable; diff --git a/transmitter.c b/transmitter.c index cc85395..a2b3340 100644 --- a/transmitter.c +++ b/transmitter.c @@ -805,7 +805,6 @@ void tx_set_mode(TRANSMITTER* tx,int mode) { if(tx!=NULL) { int filter_low, filter_high; tx->mode=mode; -g_print("tx_set_mode: %s\n",mode_string[tx->mode]); SetTXAMode(tx->id, tx->mode); if(tx->use_rx_filter) { int m=vfo[active_receiver->id].mode; @@ -839,8 +838,6 @@ void tx_set_filter(TRANSMITTER *tx,int low,int high) { mode=vfo[0].mode; } -fprintf(stderr,"tx_set_filter: tx=%p mode=%s low=%d high=%d\n",tx,mode_string[mode],low,high); - switch(mode) { case modeLSB: case modeCWL: diff --git a/transmitter.h b/transmitter.h index 08505cd..f792ddb 100644 --- a/transmitter.h +++ b/transmitter.h @@ -22,8 +22,6 @@ #include -#define AUDIO_BUFFER_SIZE 260 - typedef struct _transmitter { int id; int dac; -- 2.45.2