#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;
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];
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);
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));
}
snd_pcm_hw_params_free (hw_params);
+*/
mic_buffer=g_new0(float,mic_buffer_size);
}
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() {
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(trim<audio_buffer_size) {
- if ((rc = snd_pcm_writei (rx->playback_handle, rx->playback_buffer, audio_buffer_size-trim)) != audio_buffer_size-trim) {
+*/
+ if(trim<rx->local_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
}
}
}
- rx->playback_offset=0;
+ rx->local_audio_buffer_offset=0;
}
}
return 0;
// 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
//
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(trim<audio_buffer_size) {
- if ((rc = snd_pcm_writei (rx->playback_handle, rx->playback_buffer, audio_buffer_size-trim)) != audio_buffer_size-trim) {
+ if(trim<rx->local_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 {
}
}
}
- rx->playback_offset=0;
+ rx->local_audio_buffer_offset=0;
}
}
+ g_mutex_unlock(&rx->local_audio_mutex);
return 0;
}
#define MAX_AUDIO_DEVICES 64
+#define AUDIO_BUFFER_SIZE 480
+
typedef struct _audio_devices {
char *name;
int index;
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
set_rf_gain(active_receiver->id,value);
return 0;
}
+
int ext_diversity_update(void *data);
int ext_sat_update(void *data);
int ext_set_rf_gain(void *data);
+
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);
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
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);
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;
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;
// 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;i<receivers;i++) {
receiver_change_sample_rate(receiver[i],rate);
break;
}
}
+
#define ALEX 1
#define APOLLO 2
#define CHARLY25 3
+#define N2ADR 4
#define REGION_OTHER 0
#define REGION_UK 1
extern int ozy_software_version;
extern int mercury_software_version;
extern int penelope_software_version;
+extern int ptt;
extern int mox;
extern int tune;
extern int memory_tune;
}
static void load_filters(void) {
+ if(filter_board==N2ADR) {
+ // set OC filters
+ BAND *band;
+ band=band_get_band(band160);
+ band->OCrx=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();
}
}
}
+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));
}
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++;
}
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++;
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);
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) {
}
}
// 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));
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;
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;
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;
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);
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
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;
// 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;
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);
#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;i<rx->output_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) {
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;
}
}
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) {
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
}
#include <alsa/asoundlib.h>
#endif
-#define AUDIO_BUFFER_SIZE 260
-
enum _audio_t {
STEREO=0,
LEFT,
gint output_samples;
gdouble *iq_input_buffer;
gdouble *audio_output_buffer;
+ gint audio_buffer_size;
guchar *audio_buffer;
gint audio_index;
guint32 audio_sequence;
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;
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;
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:
#include <gtk/gtk.h>
-#define AUDIO_BUFFER_SIZE 260
-
typedef struct _transmitter {
int id;
int dac;