\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
// 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
// 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
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
// 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
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
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnRxID(wxCommandEvent& event)\r
{\r
-// wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnRxID"), wxOK);\r
event.Skip();\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnTxID(wxCommandEvent& event)\r
{\r
-// wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnTxID"), wxOK);\r
event.Skip();\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnSplitClick(wxCommandEvent& event)\r
{\r
-// wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnSplitClick"), wxOK);\r
event.Skip();\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnAnalogClick (wxCommandEvent& event)\r
{\r
-// wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnAnalogClick"), wxOK);\r
event.Skip();\r
}\r
\r
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
void MainFrame::OnTogBtnAnalogClickUI(wxUpdateUIEvent& event)
{\r
wxUnusedVar(event);\r
-// event.Enable(false);\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnALCClickUI(wxUpdateUIEvent& event)
{\r
wxUnusedVar(event);\r
-// event.Enable(false);\r
}\r
\r
//-------------------------------------------------------------------------\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnRxIDUI(wxUpdateUIEvent& event)\r
{\r
-// event.Enable(false);\r
+ wxUnusedVar(event);\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnTxIDUI(wxUpdateUIEvent& event)\r
{\r
wxUnusedVar(event);\r
-// event.Enable(false);\r
}\r
\r
//-------------------------------------------------------------------------\r
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
//-------------------------------------------------------------------------\r
void MainFrame::OnCopyUpdateUI(wxUpdateUIEvent& event)\r
{\r
-// wxUnusedVar(event);\r
event.Enable(false);\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnCut(wxCommandEvent& event)\r
{\r
-// wxMessageBox("Got Click!", "OnCut", wxOK);\r
event.Skip();\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnPaste(wxCommandEvent& event)\r
{\r
-// wxMessageBox("Got Click!", "OnPaste", wxOK);\r
event.Skip();\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnPasteUpdateUI(wxUpdateUIEvent& event)\r
{\r
-// wxUnusedVar(event);\r
event.Enable(false);\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnHelpCheckUpdatesUI(wxUpdateUIEvent& event)\r
{\r
-// wxUnusedVar(event);\r
event.Enable(false);\r
}\r
\r
}\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
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
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
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
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
{\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
// 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;
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);
}
\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:
//
}
}\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