]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
Fixed local audio problem
authorJohn Melton G0ORX <john.d.melton@googlemail.com>
Thu, 21 Nov 2019 16:12:45 +0000 (16:12 +0000)
committerJohn Melton G0ORX <john.d.melton@googlemail.com>
Thu, 21 Nov 2019 16:12:45 +0000 (16:12 +0000)
12 files changed:
audio.c
audio.h
ext.c
ext.h
old_protocol.c
radio.c
radio.h
radio_menu.c
receiver.c
receiver.h
transmitter.c
transmitter.h

diff --git a/audio.c b/audio.c
index d6840e867ca48dfcb7e09f455f66ed7f37a9caf9..6ae9846859d58e8deb4bc7a8dc5cf17f2411a0c5 100644 (file)
--- a/audio.c
+++ b/audio.c
 #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(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
@@ -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(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 {
@@ -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 7db45ee6282ca7c7e7ca905ef90d3d97a35f2162..00deea1377b793a26ecdb5fb8226893a457e9b45 100644 (file)
--- 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 12a2cd4d249cabd7597e2d17d6d939be8d698026..6feb74db9613845711ff3b99495387bf8795b93b 100644 (file)
--- 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 6c44e2b34f2be4699ed25370ecdb7b58dcd65389..8e69e95e0927dd6301bc959a7bfb56691483442d 100644 (file)
--- 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);
+
index 75bf3f7ccb7a2f197fced2abb857d21c72711db5..4f12a0aa92ab0a229c859cabefcd96f904ed89bd 100644 (file)
@@ -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 b4417de1d3e232c64c9095d81d7beae9a076c12b..3bfbd56e1ee8b7f4fd1ca0b80b9b807f8f23abe7 100644 (file)
--- 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;i<receivers;i++) {
           receiver_change_sample_rate(receiver[i],rate);
@@ -2139,3 +2141,4 @@ void radio_change_region(int r) {
       break;
   }
 }
+
diff --git a/radio.h b/radio.h
index 04381f8884be8879d15d4e325c01578391fe87da..df370f95853e033f8d7b14e2e8353ac554a51fac 100644 (file)
--- a/radio.h
+++ b/radio.h
@@ -57,6 +57,7 @@ extern char property_path[];
 #define ALEX 1
 #define APOLLO 2
 #define CHARLY25 3
+#define N2ADR 4
 
 #define REGION_OTHER 0
 #define REGION_UK 1
@@ -202,6 +203,7 @@ extern int new_pa_board;
 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;
index 59fcaa6a0ce9e36ef912ecfce080e6d8ea411326..f181ba207c5e7be8be7ab96eda6b4151499d6bc8 100644 (file)
@@ -217,6 +217,35 @@ static void sat_cb(GtkWidget *widget, gpointer data) {
 }
 
 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();
   }
@@ -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++;
index dee5a51a7c5ccea9e876df38ebb675b7bb79dec8..152a2e500ec7efca1101703a7e09fc3c5eb42a9e 100644 (file)
@@ -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;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) {
@@ -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
   }
index f201bfbeaefb17c94e83311f7f0fd50392a98b7c..0bc53454409083bc5550af4aee3c192638d586ff 100644 (file)
@@ -26,8 +26,6 @@
 #include <alsa/asoundlib.h>
 #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;
index cc85395628d9ef8bcd207f5b7c40d2d2645de58b..a2b3340b69008ba6e874fa1e288ec80b7f15a2b2 100644 (file)
@@ -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:
index 08505cd3b47a8ac21efcd4ec8b1fb22da88e8528..f792ddb9bd6f5af9b3feabbaeaf71143bd3a7852 100644 (file)
@@ -22,8 +22,6 @@
 
 #include <gtk/gtk.h>
 
-#define AUDIO_BUFFER_SIZE 260
-
 typedef struct _transmitter {
   int id;
   int dac;