Killer bug. Data point array not initialized?
authorwittend99 <wittend99@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 10 Oct 2012 03:31:50 +0000 (03:31 +0000)
committerwittend99 <wittend99@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 10 Oct 2012 03:31:50 +0000 (03:31 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@740 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2/build/fdmdv2.mk
fdmdv2/extern/include/portaudiocpp/CallbackInterface.hxx
fdmdv2/extern/include/portaudiocpp/CallbackStream.hxx
fdmdv2/src/fdmdv2_defines.h
fdmdv2/src/fdmdv2_main.cpp
fdmdv2/src/fdmdv2_main.h
fdmdv2/src/fdmdv2_pa_wrapper.cpp
fdmdv2/src/fdmdv2_pa_wrapper.h
fdmdv2/src/fdmdv2_plot_spectrum.cpp
fdmdv2/src/fdmdv2_plot_waterfall.cpp

index ffac947d7a1a443b87a106b7333c3caff6c73b62..2b96faaaa5c31c23004f04129acee9b985a1951c 100644 (file)
@@ -13,7 +13,7 @@ CurrentFileName        :=
 CurrentFilePath        :=\r
 CurrentFileFullPath    :=\r
 User                   :=OFA-Staff\r
-Date                   :=10/7/2012\r
+Date                   :=10/9/2012\r
 CodeLitePath           :="C:\bin\CodeLite"\r
 LinkerName             :=g++\r
 SharedObjectLinkerName :=g++ -shared -fPIC\r
index c9236cdd91b9aa46a1ed74881b70f09e94a097a0..18d473b2b7748933c71ed4b0f3e35f57ee2068b9 100644 (file)
@@ -2,15 +2,12 @@
 #define INCLUDED_PORTAUDIO_CALLBACKINTERFACE_HXX\r
 \r
 // ---------------------------------------------------------------------------------------\r
-\r
 #include "portaudio.h"\r
 \r
 // ---------------------------------------------------------------------------------------\r
-\r
 namespace portaudio\r
 {\r
     // -----------------------------------------------------------------------------------\r
-\r
     //////\r
     /// @brief Interface for an object that's callable as a PortAudioCpp callback object (ie that implements the\r
     /// paCallbackFun method).\r
@@ -19,27 +16,32 @@ namespace portaudio
     {\r
     public:\r
         virtual ~CallbackInterface() {}\r
-\r
-        virtual int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames,\r
-            const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) = 0;\r
+        virtual int paCallbackFun(\r
+                                    const void *inputBuffer,\r
+                                    void *outputBuffer,\r
+                                    unsigned long numFrames,\r
+                                    const PaStreamCallbackTimeInfo *timeInfo,\r
+                                    PaStreamCallbackFlags statusFlags\r
+                                 ) = 0;\r
     };\r
 \r
     // -----------------------------------------------------------------------------------\r
-\r
     namespace impl\r
     {\r
         extern "C"\r
         {\r
-            int callbackInterfaceToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames,\r
-                const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags,\r
-                void *userData);\r
+            int callbackInterfaceToPaCallbackAdapter(\r
+                                                        const void *inputBuffer,\r
+                                                        void *outputBuffer,\r
+                                                        unsigned long numFrames,\r
+                                                        const PaStreamCallbackTimeInfo *timeInfo,\r
+                                                        PaStreamCallbackFlags statusFlags,\r
+                                                        void *userData\r
+                                                     );\r
         } // extern "C"\r
     }\r
-\r
     // -----------------------------------------------------------------------------------\r
-\r
-} // namespace portaudio\r
-\r
+}   // namespace portaudio\r
 // ---------------------------------------------------------------------------------------\r
 \r
 #endif // INCLUDED_PORTAUDIO_CALLBACKINTERFACE_HXX\r
index 8ee6d4c4c06b38c3efb2974490d45e42963b720b..810b900c1ddb6154a220e27f6d8813d371aaccae 100644 (file)
@@ -2,13 +2,10 @@
 #define INCLUDED_PORTAUDIO_CALLBACKSTREAM_HXX\r
 \r
 // ---------------------------------------------------------------------------------------\r
-\r
 #include "portaudio.h"\r
-\r
 #include "portaudiocpp/Stream.hxx"\r
 \r
 // ---------------------------------------------------------------------------------------\r
-\r
 // Declaration(s):\r
 namespace portaudio\r
 {\r
index f4fd7bc53d87e5f2eba1b6b678d9c3410b891b2b..d336686cec7d9d0d69dabecf644015f5b41f0aa2 100644 (file)
 
 #define MIN_DB              -40.0
 #define MAX_DB              0.0
-#define BETA                0.1  // constant for time averageing spectrum data
+#define BETA                0.1     // constant for time averageing spectrum data
 #define MIN_HZ              0
 #define MAX_HZ              4000
-#define WATERFALL_SECS_Y    5    // number of seconds respresented by y axis of waterfall
-#define DT                  0.02 // time between samples
+#define WATERFALL_SECS_Y    5       // number of seconds respresented by y axis of waterfall
+#define DT                  0.02    // time between samples
 #define FS                  8000    // FDMDV modem sample rate
 
 #define SCATTER_MEM         (FDMDV_NSYM)*50
index 1bbc085fffc6b34d844188b3dd08cfbe4f871385..98d7dcdc3616713b412494555230598715ff3408 100644 (file)
@@ -103,7 +103,6 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)
 \r
     tools->Append(m_menuItemToolsConfigDelete);\r
 \r
-\r
     // Add Waterfall Plot window\r
     m_panelWaterfall = new PlotWaterfall((wxFrame*) m_auiNbookCtrl);\r
     m_auiNbookCtrl->AddPage(m_panelWaterfall, _("Waterfall"), true, wxNullBitmap);\r
@@ -119,8 +118,8 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)
 //    m_auiNbookCtrl->AddPage(m_panelWaterfall, _("Scalar"), true, wxNullBitmap);\r
 \r
     // Add generic plot window\r
-    m_panelDefaultA = new PlotPanel((wxFrame*) m_auiNbookCtrl);\r
-    m_auiNbookCtrl->AddPage(m_panelDefaultA, _("Test A"), true, wxNullBitmap);\r
+//    m_panelDefaultA = new PlotPanel((wxFrame*) m_auiNbookCtrl);\r
+//    m_auiNbookCtrl->AddPage(m_panelDefaultA, _("Test A"), true, wxNullBitmap);\r
 \r
     wxConfigBase *pConfig = wxConfigBase::Get();\r
 \r
@@ -171,6 +170,8 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)
 //    m_plotTimer.Start(500, wxTIMER_CONTINUOUS);\r
 //    m_panelWaterfall->m_newdata = true;\r
     m_panelWaterfall->Refresh();\r
+#else\r
+    Connect(wxEVT_IDLE, wxIdleEventHandler(MainFrame::OnIdle), NULL, this);\r
 #endif //_USE_TIMER\r
 }\r
 \r
@@ -213,17 +214,22 @@ MainFrame::~MainFrame()
     m_togBtnAnalog->Disconnect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnAnalogClickUI), NULL, this);\r
     m_togBtnALC->Disconnect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnALCClickUI), NULL, this);\r
     m_btnTogTX->Disconnect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnTXClickUI), NULL, this);\r
+\r
 #ifdef _USE_TIMER\r
     if(m_plotTimer.IsRunning())\r
     {\r
         m_plotTimer.Stop();\r
         Unbind(wxEVT_TIMER, &MainFrame::OnTimer, this);\r
     }
+#else\r
+    Disconnect(wxEVT_IDLE, wxIdleEventHandler(MainFrame::OnIdle), NULL, this);\r
 #endif //_USE_TIMER\r
+\r
     delete wxConfigBase::Set((wxConfigBase *) NULL);\r
 }
 \r
 #ifdef _USE_TIMER\r
+\r
 //----------------------------------------------------------------\r
 // OnTimer()\r
 //----------------------------------------------------------------\r
@@ -236,6 +242,24 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
 //    m_panelDefaultA->m_newdata = true;\r
 //    m_panelDefaultA->Refresh();\r
 }\r
+\r
+#else\r
+\r
+//----------------------------------------------------------------\r
+// OnIdle()\r
+//----------------------------------------------------------------\r
+void MainFrame::OnIdle(wxIdleEvent& event)\r
+{\r
+    if(m_panelWaterfall->m_newdata)\r
+    {\r
+        m_panelWaterfall->Refresh();\r
+    }\r
+    if(m_panelSpectrum->m_newdata)\r
+    {\r
+        m_panelSpectrum->Refresh();\r
+    }\r
+}\r
+\r
 #endif // _USE_TIMER\r
 \r
 //-------------------------------------------------------------------------\r
@@ -330,12 +354,10 @@ void MainFrame::OnCheckSQClick(wxCommandEvent& event)
     if(!m_SquelchActive)\r
     {\r
         m_SquelchActive = true;\r
-        //wxMessageBox(wxT("Squelch On!"), wxT("Squelch On"), wxOK);\r
     }\r
     else\r
     {\r
         m_SquelchActive = false;\r
-        //wxMessageBox(wxT("Squelch Off!"), wxT("Squelch Off"), wxOK);\r
     }\r
 }\r
 \r
@@ -354,7 +376,6 @@ void MainFrame::OnTogBtnTXClick(wxCommandEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnTogBtnRxID(wxCommandEvent& event)\r
 {\r
-//    wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnRxID"), wxOK);\r
     event.Skip();\r
 }\r
 \r
@@ -363,7 +384,6 @@ void MainFrame::OnTogBtnRxID(wxCommandEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnTogBtnTxID(wxCommandEvent& event)\r
 {\r
-//    wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnTxID"), wxOK);\r
     event.Skip();\r
 }\r
 \r
@@ -372,7 +392,6 @@ void MainFrame::OnTogBtnTxID(wxCommandEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnTogBtnSplitClick(wxCommandEvent& event)\r
 {\r
-//    wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnSplitClick"), wxOK);\r
     event.Skip();\r
 }\r
 \r
@@ -381,7 +400,6 @@ void MainFrame::OnTogBtnSplitClick(wxCommandEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnTogBtnAnalogClick (wxCommandEvent& event)\r
 {\r
-//    wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnAnalogClick"), wxOK);\r
     event.Skip();\r
 }\r
 \r
@@ -394,45 +412,6 @@ void MainFrame::OnTogBtnALCClick(wxCommandEvent& event)
     event.Skip();\r
 }\r
 \r
-\r
-//-------------------------------------------------------------------------\r
-// OnTogBtnOnOff()\r
-//-------------------------------------------------------------------------\r
-void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)\r
-{\r
-    if((!m_TxRunning) || (!m_RxRunning))\r
-    {\r
-        m_togBtnSplit->Enable();\r
-        m_togRxID->Enable();\r
-        m_togTxID->Enable();\r
-        m_togBtnAnalog->Enable();\r
-        m_togBtnALC->Enable();\r
-        m_btnTogTX->Enable();\r
-\r
-#ifdef _USE_TIMER\r
-        m_plotTimer.Start(500, wxTIMER_CONTINUOUS);\r
-#endif // _USE_TIMER\r
-        startRxStream();\r
-        startTxStream();\r
-        m_togBtnOnOff->SetLabel(wxT("Stop"));\r
-    }\r
-    else\r
-    {\r
-        m_togBtnSplit->Disable();\r
-        m_togRxID->Disable();\r
-        m_togTxID->Disable();\r
-        m_togBtnAnalog->Disable();\r
-        m_togBtnALC->Disable();\r
-        m_btnTogTX->Disable();\r
-#ifdef _USE_TIMER\r
-        m_plotTimer.Stop();\r
-#endif // _USE_TIMER\r
-        stopRxStream();\r
-        stopTxStream();\r
-        m_togBtnOnOff->SetLabel(wxT("Start"));\r
-    }\r
-}\r
-\r
 //-------------------------------------------------------------------------\r
 // OnTogBtnSplitClickUI()\r
 //-------------------------------------------------------------------------\r
@@ -448,7 +427,6 @@ void MainFrame::OnTogBtnSplitClickUI(wxUpdateUIEvent& event)
 void MainFrame::OnTogBtnAnalogClickUI(wxUpdateUIEvent& event)
 {\r
     wxUnusedVar(event);\r
-//    event.Enable(false);\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
@@ -457,7 +435,6 @@ void MainFrame::OnTogBtnAnalogClickUI(wxUpdateUIEvent& event)
 void MainFrame::OnTogBtnALCClickUI(wxUpdateUIEvent& event)
 {\r
     wxUnusedVar(event);\r
-//    event.Enable(false);\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
@@ -465,7 +442,7 @@ void MainFrame::OnTogBtnALCClickUI(wxUpdateUIEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnTogBtnRxIDUI(wxUpdateUIEvent& event)\r
 {\r
-//    event.Enable(false);\r
+    wxUnusedVar(event);\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
@@ -474,7 +451,6 @@ void MainFrame::OnTogBtnRxIDUI(wxUpdateUIEvent& event)
 void MainFrame::OnTogBtnTxIDUI(wxUpdateUIEvent& event)\r
 {\r
     wxUnusedVar(event);\r
-//    event.Enable(false);\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
@@ -483,310 +459,74 @@ void MainFrame::OnTogBtnTxIDUI(wxUpdateUIEvent& event)
 void MainFrame::OnTogBtnTXClickUI(wxUpdateUIEvent& event)\r
 {\r
     wxUnusedVar(event);\r
-//    event.Enable(false);\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
-// OnTogBtnOnOffUI()\r
+// OnOpenUpdateUI()\r
 //-------------------------------------------------------------------------\r
-void MainFrame::OnTogBtnOnOffUI(wxUpdateUIEvent& event)
+void MainFrame::OnOpenUpdateUI(wxUpdateUIEvent& event)\r
 {\r
     wxUnusedVar(event);\r
-//    event.Enable(true);\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
-// startRxStream()\r
+// OnSaveUpdateUI()\r
 //-------------------------------------------------------------------------\r
-void MainFrame::startRxStream()\r
+void MainFrame::OnSaveUpdateUI(wxUpdateUIEvent& event)\r
 {\r
-    if(!m_RxRunning)\r
-    {\r
-        m_RxRunning = true;\r
-        m_rxPa = new PortAudioWrap();
-\r
-#ifdef _DUMMY_DATA
-        for(int i = 0; i < FDMDV_NSPEC; i++)\r
-        {\r
-            m_rxPa->m_av_mag[i] = sin(((double)i / M_PI)) * 100.0;\r
-        }\r
-#else\r
-        for(int i = 0; i < FDMDV_NSPEC; i++)\r
-        {\r
-            m_rxPa->m_av_mag[i] = -40.0;\r
-        }\r
-#endif // _DUMMY_DATA\r
-\r
-//        m_fdmdv2 = fdmdv_create();\r
-//        m_RXCodec2 = codec2_create(CODEC2_MODE_1400);\r
-        //output_buf = (short*)malloc(2*sizeof(short)*codec2_samples_per_frame(codec2));\r
-/*\r
-        for(int i = 0; i < MEM8; i++)\r
-        {\r
-            cbData.in8k[i] = 0.0;\r
-        }\r
-        for(int i = 0; i < FDMDV_OS_TAPS; i++)\r
-        {\r
-            cbData.in48k[i] = 0.0;\r
-        }\r
-*/\r
-        m_rxDevIn = m_rxPa->getDefaultInputDevice();                        // default input device
-        if(m_rxDevIn == paNoDevice)
-        {
-            wxMessageBox(wxT("Rx Error: No default input device."), wxT("Error"), wxOK);\r
-            return;\r
-        }
-        m_rxErr = m_rxPa->setInputDevice(m_rxDevIn);
-        m_rxErr = m_rxPa->setInputChannelCount(2);                          // stereo input
-        m_rxErr = m_rxPa->setInputSampleFormat(PA_SAMPLE_TYPE);
-        m_rxErr = m_rxPa->setInputLatency(m_rxPa->getInputDefaultLowLatency());\r
-        m_rxPa->setInputHostApiStreamInfo(NULL);
-
-        m_rxDevOut = m_rxPa->getDefaultOutputDevice();                      // default output device
-        if (m_rxDevOut == paNoDevice)
-        {
-            wxMessageBox(wxT("Rx Error: No default output device."), wxT("Error"), wxOK);\r
-            return;\r
-        }
-        m_rxErr = m_rxPa->setOutputDevice(m_rxDevOut);
-        m_rxErr = m_rxPa->setOutputChannelCount(2);                         // stereo input
-        m_rxErr = m_rxPa->setOutputSampleFormat(PA_SAMPLE_TYPE);\r
-
-        m_rxErr = m_rxPa->setOutputLatency(m_rxPa->getOutputDefaultLowLatency());
-        m_rxPa->setOutputHostApiStreamInfo(NULL);
-
-        m_rxErr = m_rxPa->setFramesPerBuffer(FRAMES_PER_BUFFER);
-        m_rxErr = m_rxPa->setSampleRate(SAMPLE_RATE);
-        m_rxErr = m_rxPa->setStreamFlags(0);\r
-//        m_rxCB = rxCallback;
-        m_rxErr = m_rxPa->setCallback(rxCallback);
-        m_rxErr = m_rxPa->streamOpen();
-
-        if(m_rxErr != paNoError)
-        {
-            wxMessageBox(wxT("Rx Stream Open/Setup error."), wxT("Error"), wxOK);\r
-            return;\r
-        }
-        m_rxErr = m_rxPa->streamStart();
-        if(m_rxErr != paNoError)
-        {
-            wxMessageBox(wxT("Rx Stream Start Error."), wxT("Error"), wxOK);\r
-            return;\r
-        }
-    }\r
+//    wxUnusedVar(event);\r
+    event.Enable(false);\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
-// stopRxStream()\r
+// OnClose()\r
 //-------------------------------------------------------------------------\r
-void MainFrame::stopRxStream()\r
+void MainFrame::OnClose(wxCommandEvent& event)\r
 {\r
+    wxUnusedVar(event);\r
+\r
     if(m_RxRunning)\r
     {\r
-        m_RxRunning = false;\r
-        m_rxPa->stop();\r
-        m_rxPa->streamClose();\r
+        stopRxStream();\r
     }\r
-/*\r
-        if(m_rxPa->isActive())\r
-        {\r
-            m_rxPa->stop();\r
-            m_rxPa->streamClose();\r
-        }\r
-        if(m_rxPa->isOpen())\r
+    if(m_TxRunning)\r
+    {\r
+        stopTxStream();\r
+    }\r
+\r
+    if(m_sound != NULL)\r
+    {\r
+        if(m_sound->IsOk())\r
         {\r
-            m_rxPa->streamClose();\r
+            m_sound->Stop();\r
+            m_sound = NULL;\r
         }\r
-        m_TxRunning = false;\r
-*/\r
+    }\r
+    Close();\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
-// abortRxStream()\r
+// OnCloseUpdateUI()\r
 //-------------------------------------------------------------------------\r
-void MainFrame::abortRxStream()\r
+void MainFrame::OnCloseUpdateUI(wxUpdateUIEvent& event)\r
 {\r
-    if(m_RxRunning)\r
-    {\r
-        m_RxRunning = false;\r
-        m_rxPa->abort();\r
-    }\r
+    event.Enable(false);\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
-// startTxStream()\r
+// OnExit()\r
 //-------------------------------------------------------------------------\r
-void MainFrame::startTxStream()\r
+void MainFrame::OnExit(wxCommandEvent& event)\r
 {\r
-    if(!m_TxRunning)\r
-    {\r
-        m_TxRunning = true;\r
-        m_txPa = new PortAudioWrap();
-
-        m_txDevIn = m_txPa->getDefaultInputDevice();                        // default input device
-        if(m_txDevIn == paNoDevice)
-        {
-            wxMessageBox(wxT("Tx Error: No default input device."), wxT("Error"), wxOK);\r
-            return;\r
-        }
-        m_txErr = m_txPa->setInputDevice(m_txDevIn);
-        m_txErr = m_txPa->setInputChannelCount(2);                          // stereo input
-        m_txErr = m_txPa->setInputSampleFormat(PA_SAMPLE_TYPE);
-        m_txErr = m_txPa->setInputLatency(m_txPa->getInputDefaultLowLatency());\r
-        m_txPa->setInputHostApiStreamInfo(NULL);
-
-        m_txDevOut = m_txPa->getDefaultOutputDevice();                      // default output device
-        if (m_txDevOut == paNoDevice)
-        {
-            wxMessageBox(wxT("Tx Error: No default output device."), wxT("Error"), wxOK);\r
-            return;\r
-        }
-        m_txErr = m_txPa->setOutputDevice(m_txDevOut);
-        m_txErr = m_txPa->setOutputChannelCount(2);                         // stereo input
-        m_txErr = m_txPa->setOutputSampleFormat(PA_SAMPLE_TYPE);\r
-
-        m_txErr = m_txPa->setOutputLatency(m_txPa->getOutputDefaultLowLatency());
-        m_txPa->setOutputHostApiStreamInfo(NULL);
-
-        m_txErr = m_txPa->setFramesPerBuffer(FRAMES_PER_BUFFER);
-        m_txErr = m_txPa->setSampleRate(SAMPLE_RATE);
-        m_txErr = m_txPa->setStreamFlags(0);
-        m_txErr = m_txPa->setCallback(txCallback);
-        m_txErr = m_txPa->streamOpen();
-
-        if(m_txErr != paNoError)
-        {
-            wxMessageBox(wxT("Tx Stream Open/Setup error."), wxT("Error"), wxOK);\r
-            return;\r
-        }
-        m_txErr = m_txPa->streamStart();
-        if(m_txErr != paNoError)
-        {
-            wxMessageBox(wxT("Tx Stream Start Error."), wxT("Error"), wxOK);\r
-            return;\r
-        }
-    }\r
+    OnClose(event);\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
-// stopTxStream()\r
+// OnCopy()\r
 //-------------------------------------------------------------------------\r
-void MainFrame::stopTxStream()\r
+void MainFrame::OnCopy(wxCommandEvent& event)\r
 {\r
-    if(m_TxRunning)\r
-    {\r
-        m_TxRunning = false;\r
-        m_txPa->stop();\r
-        m_txPa->streamClose();\r
-    }\r
-/*\r
-        if(m_txPa->isActive())\r
-        {\r
-            m_txPa->stop();\r
-        }\r
-        if(m_txPa->isOpen())\r
-        {\r
-            m_txPa->streamClose();\r
-        }\r
-        m_TxRunning = false;\r
-*/\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// abortTxStream()\r
-//-------------------------------------------------------------------------\r
-void MainFrame::abortTxStream()\r
-{\r
-    if(m_TxRunning)\r
-    {\r
-        m_TxRunning = false;\r
-        m_txPa->abort();\r
-    }\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnOpen()\r
-//-------------------------------------------------------------------------\r
-void MainFrame::OnOpen(wxCommandEvent& event)\r
-{\r
-    wxUnusedVar(event);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnOpenUpdateUI()\r
-//-------------------------------------------------------------------------\r
-void MainFrame::OnOpenUpdateUI(wxUpdateUIEvent& event)\r
-{\r
-    wxUnusedVar(event);\r
-//    wxMessageBox("Got Click!", "OnOpenUpdateUI", wxOK);\r
-//    event.Skip();\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnSaveUpdateUI()\r
-//-------------------------------------------------------------------------\r
-void MainFrame::OnSaveUpdateUI(wxUpdateUIEvent& event)\r
-{\r
-//    wxUnusedVar(event);\r
-//    wxMessageBox("Got Click!", "OnSaveUpdateUI", wxOK);\r
-//    event.Skip();\r
-    event.Enable(false);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnClose()\r
-//-------------------------------------------------------------------------\r
-void MainFrame::OnClose(wxCommandEvent& event)\r
-{\r
-    wxUnusedVar(event);\r
-\r
-    if(m_RxRunning)\r
-    {\r
-        stopRxStream();\r
-    }\r
-    if(m_TxRunning)\r
-    {\r
-        stopTxStream();\r
-    }\r
-\r
-    if(m_sound != NULL)\r
-    {\r
-        if(m_sound->IsOk())\r
-        {\r
-            m_sound->Stop();\r
-            m_sound = NULL;\r
-        }\r
-    }\r
-    Close();\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnCloseUpdateUI()\r
-//-------------------------------------------------------------------------\r
-void MainFrame::OnCloseUpdateUI(wxUpdateUIEvent& event)\r
-{\r
-//    wxUnusedVar(event);\r
-    event.Enable(false);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnExit()\r
-//-------------------------------------------------------------------------\r
-void MainFrame::OnExit(wxCommandEvent& event)\r
-{\r
-    //wxUnusedVar(event);\r
-    OnClose(event);\r
-//    wxMessageBox("Got Click!", "OnExit", wxOK);\r
-//    event.Skip();\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnCopy()\r
-//-------------------------------------------------------------------------\r
-void MainFrame::OnCopy(wxCommandEvent& event)\r
-{\r
-//    wxMessageBox("Got Click!", "OnCopy", wxOK);\r
-    event.Skip();\r
+    event.Skip();\r
 }\r
 \r
 //-------------------------------------------------------------------------\r
@@ -794,7 +534,6 @@ void MainFrame::OnCopy(wxCommandEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnCopyUpdateUI(wxUpdateUIEvent& event)\r
 {\r
-//    wxUnusedVar(event);\r
     event.Enable(false);\r
 }\r
 \r
@@ -803,7 +542,6 @@ void MainFrame::OnCopyUpdateUI(wxUpdateUIEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnCut(wxCommandEvent& event)\r
 {\r
-//    wxMessageBox("Got Click!", "OnCut", wxOK);\r
     event.Skip();\r
 }\r
 \r
@@ -821,7 +559,6 @@ void MainFrame::OnCutUpdateUI(wxUpdateUIEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnPaste(wxCommandEvent& event)\r
 {\r
-//    wxMessageBox("Got Click!", "OnPaste", wxOK);\r
     event.Skip();\r
 }\r
 \r
@@ -830,7 +567,6 @@ void MainFrame::OnPaste(wxCommandEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnPasteUpdateUI(wxUpdateUIEvent& event)\r
 {\r
-//    wxUnusedVar(event);\r
     event.Enable(false);\r
 }\r
 \r
@@ -968,7 +704,6 @@ void MainFrame::OnHelpCheckUpdates(wxCommandEvent& event)
 //-------------------------------------------------------------------------\r
 void MainFrame::OnHelpCheckUpdatesUI(wxUpdateUIEvent& event)\r
 {\r
-//    wxUnusedVar(event);\r
     event.Enable(false);\r
 }\r
 \r
@@ -1008,37 +743,322 @@ wxString MainFrame::LoadUserImage(wxImage& image)
 }\r
 \r
 //-------------------------------------------------------------------------\r
-// txCallback()\r
+// OnTogBtnOnOffUI()\r
 //-------------------------------------------------------------------------\r
-int MainFrame::txCallback(\r
-                            const void *inBuffer,\r
-                            void *outBuffer,\r
-                            unsigned long framesPerBuffer,\r
-                            const PaStreamCallbackTimeInfo *outTime,\r
-                            PaStreamCallbackFlags statusFlags,\r
-                            void *userData\r
-                        )\r
+void MainFrame::OnTogBtnOnOffUI(wxUpdateUIEvent& event)
 {\r
-    float *out = (float *) outBuffer;\r
-    float *in  = (float *) inBuffer;\r
-    float leftIn;\r
-    float rightIn;\r
-    unsigned int i;\r
+    wxUnusedVar(event);\r
+}\r
 \r
-    if(inBuffer == NULL)\r
+//-------------------------------------------------------------------------\r
+// OnTogBtnOnOff()\r
+//-------------------------------------------------------------------------\r
+void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)\r
+{\r
+    if((!m_TxRunning) || (!m_RxRunning))\r
     {\r
-        return 0;\r
+        m_togBtnSplit->Enable();\r
+        m_togRxID->Enable();\r
+        m_togTxID->Enable();\r
+        m_togBtnAnalog->Enable();\r
+        m_togBtnALC->Enable();\r
+        m_btnTogTX->Enable();\r
+\r
+#ifdef _USE_TIMER\r
+        m_plotTimer.Start(500, wxTIMER_CONTINUOUS);\r
+#endif // _USE_TIMER\r
+        startRxStream();\r
+//        startTxStream();\r
+        m_togBtnOnOff->SetLabel(wxT("Stop"));\r
     }\r
-    // Read input buffer, process data, and fill output buffer.\r
-    for(i = 0; i < framesPerBuffer; i++)\r
+    else\r
     {\r
-        leftIn  = *in++;                            // Get interleaved samples from input buffer.\r
-        rightIn = *in++;\r
-        *out++  = leftIn * rightIn;                 // ring modulation\r
-        *out++  = 0.5f * (leftIn + rightIn);        // mixing\r
+        m_togBtnSplit->Disable();\r
+        m_togRxID->Disable();\r
+        m_togTxID->Disable();\r
+        m_togBtnAnalog->Disable();\r
+        m_togBtnALC->Disable();\r
+        m_btnTogTX->Disable();\r
+#ifdef _USE_TIMER\r
+        m_plotTimer.Stop();\r
+#endif // _USE_TIMER\r
+        stopRxStream();\r
+//        stopTxStream();\r
+        m_togBtnOnOff->SetLabel(wxT("Start"));\r
     }\r
-    return paContinue;                              // 0;\r
-}
+}\r
+\r
+//----------------------------------------------------------\r
+// Audio stream processing loop states (globals).\r
+//----------------------------------------------------------\r
+/*\r
+float  Ts = 0.0;\r
+short  input_buf[2*FDMDV_NOM_SAMPLES_PER_FRAME];\r
+short *output_buf;\r
+int    n_input_buf = 0;\r
+int    nin = FDMDV_NOM_SAMPLES_PER_FRAME;\r
+int    n_output_buf = 0;\r
+int    codec_bits[2*FDMDV_BITS_PER_FRAME];\r
+int    state = 0;\r
+*/\r
+\r
+int             g_nRxIn = FDMDV_NOM_SAMPLES_PER_FRAME;\r
+float           g_Ts = 0.0;\r
+\r
+short           g_RxInBuf[2 * FDMDV_NOM_SAMPLES_PER_FRAME];\r
+short           *g_pRxOutBuf;\r
+int             g_nInputBuf = 0;\r
+\r
+short           g_TxInBuf[2 * FDMDV_NOM_SAMPLES_PER_FRAME];\r
+short           *g_pTxOutBuf;\r
+int             g_nOutputBuf = 0;\r
+\r
+\r
+int             g_CodecBits[2 * FDMDV_BITS_PER_FRAME];\r
+int             g_State = 0;\r
+\r
+float           g_avmag[FDMDV_NSPEC];
+\r
+//----------------------------------------------------------\r
+// Global Codec2 thingys.\r
+//----------------------------------------------------------\r
+struct CODEC2   *g_pRxCodec2;\r
+struct CODEC2   *g_pTxCodec2;\r
+struct FDMDV    *g_pRxFDMDV;\r
+struct FDMDV    *g_pTxFDMDV;\r
+\r
+//-------------------------------------------------------------------------\r
+// startRxStream()\r
+//-------------------------------------------------------------------------\r
+void MainFrame::startRxStream()\r
+{\r
+    if(!m_RxRunning)\r
+    {\r
+        m_RxRunning = true;\r
+        m_rxPa = new PortAudioWrap();
+\r
+#ifdef _DUMMY_DATA
+        for(int i = 0; i < FDMDV_NSPEC; i++)\r
+        {\r
+//            m_rxPa->m_av_mag[i] = sin(((double)i / M_PI)) * 100.0;\r
+            g_avmag[i] = sin(((double)i / M_PI)) * 100.0;\r
+        }\r
+#else\r
+        for(int i = 0; i < FDMDV_NSPEC; i++)\r
+        {\r
+//            m_rxPa->m_av_mag[i] = -40.0;\r
+            g_avmag[i] = -40.0;\r
+        }\r
+#endif // _DUMMY_DATA\r
+\r
+        g_pRxFDMDV  = fdmdv_create();\r
+        g_pRxCodec2 = codec2_create(CODEC2_MODE_1400);\r
+        g_pRxOutBuf = (short*)malloc(2 * sizeof(short) * codec2_samples_per_frame(g_pRxCodec2));\r
+\r
+        m_rxDevIn = m_rxPa->getDefaultInputDevice();                        // default input device
+        if(m_rxDevIn == paNoDevice)
+        {
+            wxMessageBox(wxT("Rx Error: No default input device."), wxT("Error"), wxOK);\r
+            return;\r
+        }
+        m_rxErr = m_rxPa->setInputDevice(m_rxDevIn);
+        m_rxErr = m_rxPa->setInputChannelCount(2);                          // stereo input
+        m_rxErr = m_rxPa->setInputSampleFormat(PA_SAMPLE_TYPE);
+        m_rxErr = m_rxPa->setInputLatency(m_rxPa->getInputDefaultLowLatency());\r
+        m_rxPa->setInputHostApiStreamInfo(NULL);
+
+        m_rxDevOut = m_rxPa->getDefaultOutputDevice();                      // default output device
+        if (m_rxDevOut == paNoDevice)
+        {
+            wxMessageBox(wxT("Rx Error: No default output device."), wxT("Error"), wxOK);\r
+            return;\r
+        }
+        m_rxErr = m_rxPa->setOutputDevice(m_rxDevOut);
+        m_rxErr = m_rxPa->setOutputChannelCount(2);                         // stereo input
+        m_rxErr = m_rxPa->setOutputSampleFormat(PA_SAMPLE_TYPE);\r
+
+        m_rxErr = m_rxPa->setOutputLatency(m_rxPa->getOutputDefaultLowLatency());
+        m_rxPa->setOutputHostApiStreamInfo(NULL);
+
+        m_rxErr = m_rxPa->setFramesPerBuffer(FRAMES_PER_BUFFER);
+        m_rxErr = m_rxPa->setSampleRate(SAMPLE_RATE);
+        m_rxErr = m_rxPa->setStreamFlags(0);\r
+\r
+        m_rxUserdata = new paCallBackData;\r
+        m_rxUserdata->pWFPanel = m_panelWaterfall;\r
+        m_rxUserdata->pSPPanel = m_panelSpectrum;\r
+\r
+        for(int i = 0; i < MEM8; i++)\r
+        {\r
+            m_rxUserdata->in8k[i] = 0.0;\r
+        }\r
+        for(int i = 0; i < FDMDV_OS_TAPS; i++)\r
+        {\r
+            m_rxUserdata->in48k[i] = 0.0;\r
+        }\r
+\r
+        m_rxPa->setUserData(m_rxUserdata);\r
+        m_rxErr = m_rxPa->setCallback(rxCallback);
+        m_rxErr = m_rxPa->streamOpen();
+
+        if(m_rxErr != paNoError)
+        {
+            wxMessageBox(wxT("Rx Stream Open/Setup error."), wxT("Error"), wxOK);\r
+            return;\r
+        }
+        m_rxErr = m_rxPa->streamStart();
+        if(m_rxErr != paNoError)
+        {
+            wxMessageBox(wxT("Rx Stream Start Error."), wxT("Error"), wxOK);\r
+            return;\r
+        }
+    }\r
+}\r
+\r
+//-------------------------------------------------------------------------\r
+// stopRxStream()\r
+//-------------------------------------------------------------------------\r
+void MainFrame::stopRxStream()\r
+{\r
+    if(m_RxRunning)\r
+    {\r
+        m_RxRunning = false;\r
+        m_rxPa->stop();\r
+        m_rxPa->streamClose();\r
+        fdmdv_destroy(g_pTxFDMDV);\r
+        codec2_destroy(g_pTxCodec2);\r
+//        delete g_RxInBuf;\r
+        delete m_rxUserdata;\r
+    }\r
+/*\r
+        if(m_rxPa->isActive())\r
+        {\r
+            m_rxPa->stop();\r
+            m_rxPa->streamClose();\r
+        }\r
+        if(m_rxPa->isOpen())\r
+        {\r
+            m_rxPa->streamClose();\r
+        }\r
+        m_TxRunning = false;\r
+*/\r
+}\r
+\r
+//-------------------------------------------------------------------------\r
+// abortRxStream()\r
+//-------------------------------------------------------------------------\r
+void MainFrame::abortRxStream()\r
+{\r
+    if(m_RxRunning)\r
+    {\r
+        m_RxRunning = false;\r
+        m_rxPa->abort();\r
+    }\r
+}\r
+\r
+//-------------------------------------------------------------------------\r
+// startTxStream()\r
+//-------------------------------------------------------------------------\r
+void MainFrame::startTxStream()\r
+{\r
+    if(!m_TxRunning)\r
+    {\r
+        m_TxRunning = true;\r
+        m_txPa = new PortAudioWrap();
+
+        m_txDevIn = m_txPa->getDefaultInputDevice();                        // default input device
+        if(m_txDevIn == paNoDevice)
+        {
+            wxMessageBox(wxT("Tx Error: No default input device."), wxT("Error"), wxOK);\r
+            return;\r
+        }
+\r
+        g_pTxFDMDV  = fdmdv_create();\r
+        g_pTxCodec2 = codec2_create(CODEC2_MODE_1400);\r
+        g_pTxOutBuf = (short*)malloc(2*sizeof(short)*codec2_samples_per_frame(g_pTxCodec2));\r
+\r
+        m_txErr = m_txPa->setInputDevice(m_txDevIn);
+        m_txErr = m_txPa->setInputChannelCount(2);                          // stereo input
+        m_txErr = m_txPa->setInputSampleFormat(PA_SAMPLE_TYPE);
+        m_txErr = m_txPa->setInputLatency(m_txPa->getInputDefaultLowLatency());\r
+        m_txPa->setInputHostApiStreamInfo(NULL);
+
+        m_txDevOut = m_txPa->getDefaultOutputDevice();                      // default output device
+        if (m_txDevOut == paNoDevice)
+        {
+            wxMessageBox(wxT("Tx Error: No default output device."), wxT("Error"), wxOK);\r
+            return;\r
+        }
+        m_txErr = m_txPa->setOutputDevice(m_txDevOut);
+        m_txErr = m_txPa->setOutputChannelCount(2);                         // stereo input
+        m_txErr = m_txPa->setOutputSampleFormat(PA_SAMPLE_TYPE);\r
+
+        m_txErr = m_txPa->setOutputLatency(m_txPa->getOutputDefaultLowLatency());
+        m_txPa->setOutputHostApiStreamInfo(NULL);
+
+        m_txErr = m_txPa->setFramesPerBuffer(FRAMES_PER_BUFFER);
+        m_txErr = m_txPa->setSampleRate(SAMPLE_RATE);
+        m_txErr = m_txPa->setStreamFlags(0);
+        m_txErr = m_txPa->setCallback(txCallback);
+        m_txErr = m_txPa->streamOpen();
+
+        if(m_txErr != paNoError)
+        {
+            wxMessageBox(wxT("Tx Stream Open/Setup error."), wxT("Error"), wxOK);\r
+            return;\r
+        }
+        m_txErr = m_txPa->streamStart();
+        if(m_txErr != paNoError)
+        {
+            wxMessageBox(wxT("Tx Stream Start Error."), wxT("Error"), wxOK);\r
+            return;\r
+        }
+    }\r
+}\r
+\r
+//-------------------------------------------------------------------------\r
+// stopTxStream()\r
+//-------------------------------------------------------------------------\r
+void MainFrame::stopTxStream()\r
+{\r
+    if(m_TxRunning)\r
+    {\r
+        m_TxRunning = false;\r
+        m_txPa->stop();\r
+        m_txPa->streamClose();\r
+    }\r
+/*\r
+        if(m_txPa->isActive())\r
+        {\r
+            m_txPa->stop();\r
+        }\r
+        if(m_txPa->isOpen())\r
+        {\r
+            m_txPa->streamClose();\r
+        }\r
+        m_TxRunning = false;\r
+*/\r
+}\r
+\r
+//-------------------------------------------------------------------------\r
+// abortTxStream()\r
+//-------------------------------------------------------------------------\r
+void MainFrame::abortTxStream()\r
+{\r
+    if(m_TxRunning)\r
+    {\r
+        m_TxRunning = false;\r
+        m_txPa->abort();\r
+    }\r
+}\r
+\r
+//-------------------------------------------------------------------------\r
+// OnOpen()\r
+//-------------------------------------------------------------------------\r
+void MainFrame::OnOpen(wxCommandEvent& event)\r
+{\r
+    wxUnusedVar(event);\r
+}\r
 \r
 //----------------------------------------------------------------
 // update average of each spectrum point
@@ -1049,23 +1069,11 @@ void MainFrame::averageData(float mag_dB[])
 
     for(i = 0; i < FDMDV_NSPEC; i++)
     {
-        m_rxPa->m_av_mag[i] = (1.0 - BETA) * m_rxPa->m_av_mag[i] + BETA * mag_dB[i];
+//        m_rxPa->m_av_mag[i] = (1.0 - BETA) * m_rxPa->m_av_mag[i] + BETA * mag_dB[i];
+        g_avmag[i] = (1.0 - BETA) * g_avmag[i] + BETA * mag_dB[i];
     }
 }\r
 \r
-// Main processing loop states ------------------\r
-float  Ts = 0.0;\r
-short  input_buf[2*FDMDV_NOM_SAMPLES_PER_FRAME];\r
-int    n_input_buf = 0;\r
-int    nin = FDMDV_NOM_SAMPLES_PER_FRAME;\r
-short *output_buf;\r
-int    n_output_buf = 0;\r
-int    codec_bits[2*FDMDV_BITS_PER_FRAME];\r
-int    state = 0;\r
-struct CODEC2 *g_RXCodec2;\r
-struct CODEC2 *g_TXCodec2;\r
-struct FDMDV  *g_pFDMDV_state;\r
-\r
 //-------------------------------------------------------------------------\r
 // rxCallback()\r
 //-------------------------------------------------------------------------\r
@@ -1078,7 +1086,7 @@ int MainFrame::rxCallback(
                             void            *userData\r
                          )\r
 {\r
-    paCallBackData *cbData = (paCallBackData*)userData;\r
+    paCallBackData  *cbData = (paCallBackData*)userData;\r
     unsigned int    i;\r
     short           *rptr    = (short*)inputBuffer;\r
     short           *wptr    = (short*)outputBuffer;\r
@@ -1094,7 +1102,6 @@ int MainFrame::rxCallback(
     assert(inputBuffer != NULL);\r
 \r
     // Convert input model samples from 48 to 8 kHz\r
-\r
     // just use left channel\r
     for(i = 0; i < framesPerBuffer; i++, rptr += 2)\r
     {\r
@@ -1107,16 +1114,20 @@ int MainFrame::rxCallback(
         in48k[i] = in48k[i + framesPerBuffer];\r
     }\r
     // run demod, decoder and update GUI info\r
-    for(i = 0; i < N8; i++)\r
+    unsigned int j = N8;\r
+    //for(i = 0; i < N8; i++)\r
+    for(i = 0; i < j; i++)\r
     {\r
-        input_buf[n_input_buf + i] = (short)out8k[i];\r
+        g_RxInBuf[g_nInputBuf + i] = (short)out8k[i];\r
     }\r
-    n_input_buf += FDMDV_NOM_SAMPLES_PER_FRAME;\r
-    per_frame_rx_processing(output_buf, &n_output_buf, codec_bits, input_buf, &n_input_buf, &nin, &state, g_RXCodec2);\r
+    g_nInputBuf += FDMDV_NOM_SAMPLES_PER_FRAME;\r
+    per_frame_rx_processing(g_pRxOutBuf, &g_nInputBuf, g_CodecBits, g_RxInBuf, &g_nOutputBuf, &g_nRxIn, &g_State, g_pRxCodec2);\r
+    cbData->pWFPanel->m_newdata = true;\r
+    cbData->pSPPanel->m_newdata = true;\r
     // if demod out of sync copy input audio from A/D to aid in tuning\r
-    if (n_output_buf >= N8)\r
+    if (g_nOutputBuf >= N8)\r
     {\r
-        if(state == 0)\r
+        if(g_State == 0)\r
         {\r
             for(i = 0; i < N8; i++)\r
             {\r
@@ -1127,16 +1138,16 @@ int MainFrame::rxCallback(
         {\r
             for(i = 0; i < N8; i++)\r
             {\r
-                in8k[MEM8+i] = output_buf[i];   // decoded spech\r
+                in8k[MEM8+i] = g_pRxOutBuf[i];   // decoded spech\r
             }\r
         }\r
-        n_output_buf -= N8;\r
+        g_nOutputBuf -= N8;\r
     }\r
-    assert(n_output_buf >= 0);\r
+    assert(g_nOutputBuf >= 0);\r
     // shift speech samples in output buffer\r
-    for(i = 0; i < (unsigned int)n_output_buf; i++)\r
+    for(i = 0; i < (unsigned int)g_nOutputBuf; i++)\r
     {\r
-        output_buf[i] = output_buf[i + N8];\r
+        g_pRxOutBuf[i] = g_pRxOutBuf[i + N8];\r
     }\r
     // Convert output speech to 48 kHz sample rate\r
     // upsample and update filter memory\r
@@ -1163,15 +1174,15 @@ int MainFrame::rxCallback(
 // per_frame_rx_processing()
 //----------------------------------------------------------------
  void MainFrame::per_frame_rx_processing(
-                                            short   output_buf[],  // output buf of decoded speech samples
-                                            int     *n_output_buf, // how many samples currently in output_buf[]
-                                            int     codec_bits[],  // current frame of bits for decoder
-                                            short   input_buf[],   // input buf of modem samples input to demod
-                                            int     *n_input_buf,  // how many samples currently in input_buf[]
-                                            int     *nin,          // amount of samples demod needs for next call
-                                            int     *state,        // used to collect codec_bits[] halves
-                                            CODEC2 *c2     // Codec 2 states
-                                      )
+                                            short   output_buf[],   // output buf of decoded speech samples
+                                            int     *n_output_buf,  // how many samples currently in output_buf[]
+                                            int     codec_bits[],   // current frame of bits for decoder
+                                            short   input_buf[],    // input buf of modem samples input to demod
+                                            int     *n_input_buf,   // how many samples currently in input_buf[]
+                                            int     *nin,           // amount of samples demod needs for next call
+                                            int     *state,         // used to collect codec_bits[] halves
+                                            CODEC2  *c2             // Codec 2 states
+                                        )
 {
     struct FDMDV_STATS  stats;
     int                 sync_bit;
@@ -1211,7 +1222,7 @@ int MainFrame::rxCallback(
             rx_fdm[i] = (float)input_buf[i] / FDMDV_SCALE;
         }
         nin_prev = *nin;
-        fdmdv_demod(g_pFDMDV_state, rx_bits, &sync_bit, rx_fdm, nin);
+        fdmdv_demod(g_pRxFDMDV, rx_bits, &sync_bit, rx_fdm, nin);
         *n_input_buf -= nin_prev;
         assert(*n_input_buf >= 0);
 
@@ -1222,15 +1233,15 @@ int MainFrame::rxCallback(
         }
 \r
         // compute rx spectrum & get demod stats, and update GUI plot data
-        fdmdv_get_rx_spectrum(g_pFDMDV_state, rx_spec, rx_fdm, nin_prev);
-        fdmdv_get_demod_stats(g_pFDMDV_state, &stats);
-//        averageData(rx_spec);\r
-        //m_panelWaterfall->;\r
-        //m_panelScalar;
-//        m_panelScatter->add_new_samples(stats.rx_symbols);
-//        aTimingEst->add_new_sample(stats.rx_timing);
-//        aFreqEst->add_new_sample(stats.foff);
-//        aSNR->add_new_sample(stats.snr_est);
+        fdmdv_get_rx_spectrum(g_pRxFDMDV, rx_spec, rx_fdm, nin_prev);
+        fdmdv_get_demod_stats(g_pRxFDMDV, &stats);
+        // Average Data\r
+        // averageData(rx_spec);\r
+        for(i = 0; i < FDMDV_NSPEC; i++)
+        {
+            // m_rxPa->m_av_mag[i] = (1.0 - BETA) * m_rxPa->m_av_mag[i] + BETA * rx_spec[i];
+            g_avmag[i] = (1.0 - BETA) * g_avmag[i] + BETA * rx_spec[i];
+        }
         //
         //   State machine to:
         //
@@ -1318,6 +1329,39 @@ int MainFrame::rxCallback(
     }
 }\r
 \r
+//-------------------------------------------------------------------------\r
+// txCallback()\r
+//-------------------------------------------------------------------------\r
+int MainFrame::txCallback(\r
+                            const void *inBuffer,\r
+                            void *outBuffer,\r
+                            unsigned long framesPerBuffer,\r
+                            const PaStreamCallbackTimeInfo *outTime,\r
+                            PaStreamCallbackFlags statusFlags,\r
+                            void *userData\r
+                        )\r
+{\r
+    float *out = (float *) outBuffer;\r
+    float *in  = (float *) inBuffer;\r
+    float leftIn;\r
+    float rightIn;\r
+    unsigned int i;\r
+\r
+    if(inBuffer == NULL)\r
+    {\r
+        return 0;\r
+    }\r
+    // Read input buffer, process data, and fill output buffer.\r
+    for(i = 0; i < framesPerBuffer; i++)\r
+    {\r
+        leftIn  = *in++;                            // Get interleaved samples from input buffer.\r
+        rightIn = *in++;\r
+        *out++  = leftIn * rightIn;                 // ring modulation\r
+        *out++  = 0.5f * (leftIn + rightIn);        // mixing\r
+    }\r
+    return paContinue;                              // 0;\r
+}
+\r
 //-------------------------------------------------------------------------\r
 // OnSave()\r
 //-------------------------------------------------------------------------\r
index faf3af1447135b4aa4c8aab99fed1afb7448f45d..a6ab6d4b906c8b21cb443265b46629d323369914 100644 (file)
@@ -55,17 +55,11 @@ enum {
         ID_TIMER_SPECTRUM,\r
         ID_TIMER_SCATTER,\r
         ID_TIMER_SCALAR\r
-    };\r
+     };\r
 \r
 #define EXCHANGE_DATA_IN    0\r
 #define EXCHANGE_DATA_OUT   1\r
 \r
-typedef struct\r
-{\r
-    float in48k[FDMDV_OS_TAPS + N48];\r
-    float in8k[MEM8 + N8];\r
-} paCallBackData;\r
-\r
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
 // Class MainApp\r
 //\r
@@ -115,6 +109,18 @@ class MainApp : public wxApp
 // declare global static function wxGetApp()
 DECLARE_APP(MainApp)
 
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
+// paCallBackData\r
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
+typedef struct
+{\r
+    PlotSpectrum    *pSPPanel;\r
+    PlotWaterfall   *pWFPanel;\r
+//    float           *mag_dB;
+    float           in48k[FDMDV_OS_TAPS + N48];
+    float           in8k[MEM8 + N8];\r
+} paCallBackData;
+\r
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
 // Class MainFrame\r
 //\r
@@ -131,7 +137,7 @@ class MainFrame : public TopFrame
         MainFrame(wxWindow *parent);
         virtual ~MainFrame();\r
 
-        PlotPanel*              m_panelDefaultA;\r
+//        PlotPanel*              m_panelDefaultA;\r
         PlotSpectrum*           m_panelSpectrum;\r
         PlotWaterfall*          m_panelWaterfall;\r
         PlotScatter*            m_panelScatter;\r
@@ -139,9 +145,10 @@ class MainFrame : public TopFrame
         bool                    m_SquelchActive;\r
         bool                    m_RxRunning;\r
         bool                    m_TxRunning;\r
-        FDMDV                   *m_fdmdv2;\r
         PortAudioWrap           *m_rxPa;
-        PortAudioWrap           *m_txPa;
+        PortAudioWrap           *m_txPa;\r
+        paCallBackData          *m_rxUserdata;
+        paCallBackData          *m_txUserdata;
         PaDeviceIndex           m_rxDevIn;
         PaDeviceIndex           m_rxDevOut;
         PaDeviceIndex           m_txDevIn;
@@ -249,9 +256,12 @@ class MainFrame : public TopFrame
         void OnClose( wxCloseEvent& event );
         void OnSize( wxSizeEvent& event );
         void OnUpdateUI( wxUpdateUIEvent& event );
-        void OnTimer(wxTimerEvent &evt);\r
-\r
         void OnDeleteConfig(wxCommandEvent&);\r
+#ifdef _USE_TIMER\r
+        void OnTimer(wxTimerEvent &evt);\r
+#else\r
+        void OnIdle(wxIdleEvent &evt);\r
+#endif\r
 
         wxString LoadUserImage(wxImage& image);
 
index ca45d79bbfbc4af108e449f24b993e6409d2bdf3..f4627f9de3755169edaed2eea37b80debf71ed11 100644 (file)
@@ -38,7 +38,7 @@ PortAudioWrap::PortAudioWrap()
     m_pTimeInfo                 = 0;\r
     m_newdata                   = false;\r
 \r
-    loadData();\r
+//    loadData();\r
 }
 
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
@@ -325,12 +325,7 @@ PaError PortAudioWrap::setCallback(PaStreamCallback *callback)
     return paNoError;
 }
 \r
-typedef struct
-{
-    float               in48k[FDMDV_OS_TAPS + N48];
-    float               in8k[MEM8 + N8];
-} paCallBackData;
-\r
+/*\r
 //----------------------------------------------------------------
 // loadData() : create Dummy Data
 //----------------------------------------------------------------
@@ -342,4 +337,4 @@ void PortAudioWrap::loadData()
         m_av_mag[i] = i;\r
     }\r
 }
-\r
+*/\r
index 2f00db633bb8afb43824192a1aaba1ba7dc60dc9..f3b393b470c69713b29505ab0b5b9ed7a879a0f3 100644 (file)
@@ -28,7 +28,7 @@
 #include "codec2.h"
 #include "portaudio.h"
 
-#define PA_SAMPLE_TYPE      paFloat32       //paInt16
+#define PA_SAMPLE_TYPE      paInt16         //paFloat32
 #define FRAMES_PER_BUFFER   (64)
 
 typedef float SAMPLE;
@@ -39,7 +39,7 @@ class PortAudioWrap
         PortAudioWrap();
         ~PortAudioWrap();\r
 
-        float                           m_av_mag[FDMDV_NSPEC];
+//        float                           m_av_mag[FDMDV_NSPEC];
 \r
     private:
         PaStream                        *m_pStream;
@@ -113,5 +113,5 @@ class PortAudioWrap
         bool                isOpen() const;\r
         bool                isStopped() const;\r
         bool                isActive() const;\r
-        void                loadData();\r
+//        void                loadData();\r
 };\r
index d672cfae320d8f758d25931ba55321fb8d520241..177391c7ab8fadcb0662e80ffc51e1fc342c45bd 100644 (file)
@@ -28,6 +28,8 @@
 #include "fdmdv2_main.h"\r
 #include "fdmdv2_plot_spectrum.h"\r
 \r
+extern float *g_avmag;\r
+\r
 BEGIN_EVENT_TABLE(PlotSpectrum, PlotPanel)\r
     EVT_MOTION          (PlotSpectrum::OnMouseMove)\r
     EVT_LEFT_DOWN       (PlotSpectrum::OnMouseDown)\r
@@ -108,7 +110,8 @@ void PlotSpectrum::draw(wxAutoBufferedPaintDC& pDC)
         pen.SetWidth(1);\r
         m_mDC.SetPen(pen);\r
 \r
-        float *pData = m_pTopFrame->m_rxPa->m_av_mag;\r
+//        float *pData = m_pTopFrame->m_rxPa->m_av_mag;\r
+        float *pData = g_avmag;\r
         for(int x = 1; x < w; x++)\r
         {\r
 //            m_mDC.DrawPoint(x, (int)pData[x]);\r
index d2157bfbc102e9cc287516db20093f151a9de54f..444c2d461326b8c5291016e3b892454db7c2b3fc 100644 (file)
@@ -38,6 +38,9 @@
   block.\r
 \r
 */\r
+\r
+extern float *g_avmag;\r
+\r
 BEGIN_EVENT_TABLE(PlotWaterfall, PlotPanel)\r
     EVT_PAINT           (PlotWaterfall::OnPaint)\r
     EVT_MOTION          (PlotWaterfall::OnMouseMove)\r
@@ -163,22 +166,23 @@ void PlotWaterfall::draw(wxAutoBufferedPaintDC& pDC)
     pDC.Clear();\r
 //    m_mDC.Clear();\r
     m_rPlot = wxRect(PLOT_BORDER + XLEFT_OFFSET, PLOT_BORDER, m_rGrid.GetWidth(), m_rGrid.GetHeight());\r
-    if(m_firstPass)\r
-    {\r
-        m_firstPass = false;\r
-        m_mDC.FloodFill(0, 0, VERY_LTGREY_COLOR);\r
+//    if(m_firstPass)\r
+//    {\r
+//        m_firstPass = false;\r
+//        m_mDC.FloodFill(0, 0, VERY_LTGREY_COLOR);\r
 \r
         // Draw a filled rectangle with aborder\r
-        wxBrush ltGraphBkgBrush = wxBrush(DARK_BLUE_COLOR);\r
-        m_mDC.SetBrush(ltGraphBkgBrush);\r
-        m_mDC.SetPen(wxPen(BLACK_COLOR, 0));\r
-        m_mDC.DrawRectangle(m_rPlot);\r
+//        wxBrush ltGraphBkgBrush = wxBrush(DARK_BLUE_COLOR);\r
+//        m_mDC.SetBrush(ltGraphBkgBrush);\r
+//        m_mDC.SetPen(wxPen(BLACK_COLOR, 0));\r
+//        m_mDC.DrawRectangle(m_rPlot);\r
 \r
-//        pDC.SetBrush(ltGraphBkgBrush);\r
-//        pDC.SetPen(wxPen(BLACK_COLOR, 0));\r
-//        pDC.DrawRectangle(m_rPlot);\r
-        drawGraticule(pDC);\r
-    }\r
+//    }\r
+    wxBrush ltGraphBkgBrush = wxBrush(DARK_BLUE_COLOR);\r
+    pDC.SetBrush(ltGraphBkgBrush);\r
+    pDC.SetPen(wxPen(BLACK_COLOR, 0));\r
+    pDC.DrawRectangle(m_rPlot);\r
+    drawGraticule(pDC);\r
     if(m_newdata)\r
     {\r
         m_newdata = false;\r
@@ -224,9 +228,13 @@ void PlotWaterfall::drawData()  //wxMemoryDC&  pDC)
         wxNativePixelData::Iterator rowStart = p;\r
         for(int x = 0; x < (w - 1); ++x, ++p)\r
         {\r
-            p.Red()     = m_pTopFrame->m_rxPa->m_av_mag[x];\r
-            p.Green()   = m_pTopFrame->m_rxPa->m_av_mag[x];\r
-            p.Blue()    = m_pTopFrame->m_rxPa->m_av_mag[x];\r
+//            p.Red()     = m_pTopFrame->m_rxPa->m_av_mag[x];\r
+//            p.Green()   = m_pTopFrame->m_rxPa->m_av_mag[x];\r
+//            p.Blue()    = m_pTopFrame->m_rxPa->m_av_mag[x];\r
+\r
+            p.Red()     = g_avmag[x];\r
+            p.Green()   = g_avmag[x];\r
+            p.Blue()    = g_avmag[x];\r
         }\r
         p = rowStart;\r
         p.OffsetY(*m_pPix, 1);\r
@@ -315,12 +323,12 @@ void PlotWaterfall::plotPixelData(wxAutoBufferedPaintDC&  dc)
     wxNativePixelData data(*m_pBmp);\r
     if(!data)\r
     {\r
-        // ... raw access to bitmap data unavailable, do something else ...\r
+        wxMessageBox(wxT("Unable to access Bitmap Data"), wxT("Error"));\r
         return;\r
     }\r
     if(data.GetWidth() < 20 || data.GetHeight() < 20)\r
     {\r
-        // ... complain: the bitmap it too small ...\r
+        wxMessageBox(wxT("Bitmap is too small to use"), wxT("Warning"));\r
         return;\r
     }\r
     wxNativePixelData::Iterator p(data);\r
@@ -330,7 +338,8 @@ void PlotWaterfall::plotPixelData(wxAutoBufferedPaintDC&  dc)
     {
         index = px * spec_index_per_px;
         // intensity = intensity_per_dB * (m_av_mag[index] - MIN_DB);
-        intensity = intensity_per_dB * (((MainFrame *)GetParent())->m_rxPa->m_av_mag[index] - MIN_DB);
+        intensity = intensity_per_dB * (g_avmag[index] - MIN_DB);
+//        intensity = intensity_per_dB * (((MainFrame *)GetParent())->m_rxPa->m_av_mag[index] - MIN_DB);
 //        intensity = intensity_per_dB * (((MainFrame *)GetParent())->m_av_mag[index] - MIN_DB);
         if(intensity > 255)
         {