]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
changed audio_write interface. worked on FreeDV for new protocol
authorJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Sat, 16 Jul 2016 11:12:23 +0000 (11:12 +0000)
committerJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Sat, 16 Jul 2016 11:12:23 +0000 (11:12 +0000)
audio.c
audio.h
new_protocol.c
old_protocol.c

diff --git a/audio.c b/audio.c
index 07249a4e6e389a18fc19330c8a5efc13bfa94f07..1bca582ee19153fab2f59393ce919ae53cf71464 100644 (file)
--- 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 f8aff4a397787253e398c203363a957466b85c11..cedea093821ac75ecbd20957e74b77234417b121 100644 (file)
--- 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);
+*/
index 3f695a5194fe251473681022ab44e49dbc97d712..b8fd5da5b36285dad027895697dc02d133401123 100644 (file)
@@ -40,6 +40,7 @@
 #include <math.h>
 
 #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<outputsamples;j++) {
-                        leftaudiosample=(short)(audiooutputbuffer[j*2]*32767.0*volume);
-                        rightaudiosample=(short)(audiooutputbuffer[(j*2)+1]*32767.0*volume);
-
-                        audiobuffer[audioindex++]=leftaudiosample>>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<outputsamples;j++) {
+      leftaudiosample=(short)(audiooutputbuffer[j*2]*32767.0*volume);
+      rightaudiosample=(short)(audiooutputbuffer[(j*2)+1]*32767.0*volume);
+      demod_samples=demod_sample_freedv(leftaudiosample);
+      if(demod_samples!=0) {
+        int s;
+        int t;
+        for(s=0;s<demod_samples;s++) {
+          for(t=0;t<6;t++) { // 8k to 48k
+            if(freedv_sync) {
+              leftaudiosample=rightaudiosample=(short)((double)speech_out[s]*volume);
+            } else {
+              leftaudiosample=rightaudiosample=0;
+            }
+            if(local_audio) {
+              audio_write(leftaudiosample,rightaudiosample);
+            }
+            audiobuffer[audioindex++]=leftaudiosample>>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<outputsamples;j++) {
+      leftaudiosample=(short)(audiooutputbuffer[j*2]*32767.0*volume);
+      rightaudiosample=(short)(audiooutputbuffer[(j*2)+1]*32767.0*volume);
+  
+      if(local_audio) {
+        audio_write(leftaudiosample,rightaudiosample);
+      }
+
+      audiobuffer[audioindex++]=leftaudiosample>>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<micoutputsamples;j++) {
-    isample=(int)(micoutputbuffer[j*2]*gain*2); // 24 bit
-    qsample=(int)(micoutputbuffer[(j*2)+1]*gain*2); // 24 bit
+    isample=(long)(micoutputbuffer[j*2]*gain);
+    qsample=(long)(micoutputbuffer[(j*2)+1]*gain);
 
     iqbuffer[iqindex++]=isample>>16;
     iqbuffer[iqindex++]=isample>>8;
index 5bfe753bd37fc18d5a5ac972629dd31c9209a8f2..56a75339b4476d3b6310d60ff2809c54ae250dc5 100644 (file)
@@ -37,6 +37,7 @@
 #include <math.h>
 #include <wdsp.h>
 
+#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<demod_samples;s++) {
             for(t=0;t<6;t++) { // 8k to 48k
               if(freedv_sync) {
@@ -565,6 +563,9 @@ static void full_rx_buffer() {
               } else {
                 left_rx_sample=right_rx_sample=0;
               }
+              if(local_audio) {
+                audio_write(left_rx_sample,right_rx_sample);
+              }
               output_buffer[output_buffer_index++]=left_rx_sample>>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<output_buffer_size;j++) {
       left_rx_sample=(short)(audiooutputbuffer[j*2]*32767.0*volume);
       right_rx_sample=(short)(audiooutputbuffer[(j*2)+1]*32767.0*volume);
+      if(local_audio) {
+        audio_write(left_rx_sample,right_rx_sample);
+      }
       left_tx_sample=0;
       right_tx_sample=0;
       output_buffer[output_buffer_index++]=left_rx_sample>>8;