libresample used for all 4 sample rate conversions, but needs clean up into functions.
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 3 Nov 2012 06:32:20 +0000 (06:32 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 3 Nov 2012 06:32:20 +0000 (06:32 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@921 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2/src/fdmdv2_main.cpp
fdmdv2/src/fdmdv2_main.h

index 2fe3bc935407592fa03e4da218c3a5a8baf8c9da..ba461921a6879c6c99888ed194adc292ceb4fc72 100644 (file)
@@ -1071,6 +1071,10 @@ void MainFrame::startRxStream()
             m_rxUserdata->in48k1[i] = (float)0.0;
         }
 
+       m_rxUserdata->insrc1 = src_new(SRC_SINC_FASTEST, 1, &src_error);
+       assert(m_rxUserdata->insrc1 != NULL);
+       m_rxUserdata->outsrc1 = src_new(SRC_SINC_FASTEST, 1, &src_error);
+       assert(m_rxUserdata->outsrc1 != NULL);
        m_rxUserdata->insrc2 = src_new(SRC_SINC_FASTEST, 1, &src_error);
        assert(m_rxUserdata->insrc2 != NULL);
        m_rxUserdata->outsrc2 = src_new(SRC_SINC_FASTEST, 1, &src_error);
@@ -1268,7 +1272,7 @@ int MainFrame::rxCallback(
     // temp buffers re-used by tx and rx processing
 
     short           in8k_short[N8];
-    float           in8k[N8];
+    float           in8k[2*N8];
     float           out8k[2*N8];
     short           out8k_short[2*N8];
     float           out48k[2*N48];
@@ -1333,10 +1337,27 @@ int MainFrame::rxCallback(
         //       than floats would remove all these float to short
         //       conversions
 
+#ifdef OLD
        short_to_float(&in48k1[FDMDV_OS_TAPS], in48k_short, N48);
         fdmdv_48_to_8(out8k, &in48k1[FDMDV_OS_TAPS], N8);
        float_to_short(out8k_short, out8k, N8);
-       fifo_write(cbData->rxinfifo, out8k_short, N8);
+#endif
+
+       src_short_to_float_array(in48k_short, in48k, N48);
+
+       src_data.data_in = in48k;
+       src_data.data_out = out8k;
+       src_data.input_frames = N48;
+       src_data.output_frames = N8;
+       src_data.end_of_input = 0;
+       src_data.src_ratio = (float)FS/g_soundCard1SampleRate;
+
+       src_process(cbData->insrc1, &src_data);
+       assert(src_data.output_frames_gen <= N8);
+
+       src_float_to_short_array(out8k, out8k_short, src_data.output_frames_gen);
+
+       fifo_write(cbData->rxinfifo, out8k_short, src_data.output_frames_gen);
 
         per_frame_rx_processing(cbData->rxoutfifo, g_CodecBits, cbData->rxinfifo, &g_nRxIn, &g_State, g_pCodec2);
 
@@ -1450,11 +1471,27 @@ int MainFrame::rxCallback(
            per_frame_tx_processing(tx_mod_out, tx_speech_in, g_pCodec2);
            
            // output 40ms of modem tone
+#ifdef OLD
 
            short_to_float(&in8k2[MEM8], tx_mod_out, 2*N8);
            fdmdv_8_to_48(out48k, &in8k2[MEM8], 2*N8);
            float_to_short(out48k_short, out48k, 2*N48);            
-           fifo_write(cbData->outfifo1, out48k_short, 2*N48);
+#endif
+           src_short_to_float_array(tx_mod_out, in8k, 2*N8);
+
+           src_data.data_in = in8k;
+           src_data.data_out = out48k;
+           src_data.input_frames = 2*N8;
+           src_data.output_frames = 2*N48;
+           src_data.end_of_input = 0;
+           src_data.src_ratio = (float)g_soundCard1SampleRate/FS;
+
+           src_process(cbData->outsrc1, &src_data);
+           assert(src_data.output_frames_gen <= 2*N48);
+
+           src_float_to_short_array(out48k, out48k_short, src_data.output_frames_gen);
+
+           fifo_write(cbData->outfifo1, out48k_short, src_data.output_frames_gen );
        }
     }
 
index 2abf06f594ba494e3c07c6b1e71c8bc9c72e8760..4c0739b79985c0d552bd8e119a816012e92d6886 100644 (file)
@@ -140,6 +140,8 @@ typedef struct
 
     // libresample states
 
+    SRC_STATE      *insrc1;
+    SRC_STATE      *outsrc1;
     SRC_STATE      *insrc2;
     SRC_STATE      *outsrc2;