From fe6204d91b7b85c64d4408469672f30591846fd1 Mon Sep 17 00:00:00 2001 From: wittend99 Date: Tue, 12 Jun 2012 12:30:44 +0000 Subject: [PATCH] git-svn-id: https://svn.code.sf.net/p/freetel/code@546 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2/FDMDV2.fbp | 735 ++++++++++++++---- fdmdv2/Release/fdmdv2.exe | Bin 218624 -> 227328 bytes fdmdv2/dlg_audio.cpp | 97 ++- fdmdv2/dlg_audio.h | 2 +- fdmdv2/extern/include/portaudio.h | 124 ++- fdmdv2/fdmdv2.mk | 31 +- fdmdv2/fdmdv2.project | 53 +- fdmdv2/fdmdv2.txt | 2 +- fdmdv2/fdmdv2.workspace | 4 +- fdmdv2/fdmdv2_main.cpp | 329 +++++++- fdmdv2/fdmdv2_main.h | 34 +- fdmdv2/fdmdv2_wsp.mk | 8 +- fdmdv2/hamlib-3.0/test_hamlib/test_hamlib.mk | 18 +- .../Projects/w32-mingw/test_sndfile.mk | 16 +- .../pa_cppbinding_test/pa_cppbinding_test.mk | 22 +- fdmdv2/pa_test/pa_class.cpp | 96 +-- fdmdv2/pa_test/pa_class.h | 24 +- fdmdv2/pa_test/pa_test.mk | 18 +- fdmdv2/pa_test/pa_test.project | 11 +- fdmdv2/paclass.cpp | 212 +++++ fdmdv2/paclass.h | 78 ++ fdmdv2/thread_audio.cpp | 29 +- fdmdv2/thread_audio.h | 183 ++++- fdmdv2/topFrame.cpp | 126 ++- fdmdv2/topFrame.h | 18 +- fdmdv2/topFrame.py | 135 +++- fdmdv2/topFrame.xrc | 214 +++-- 27 files changed, 2073 insertions(+), 546 deletions(-) create mode 100644 fdmdv2/paclass.cpp create mode 100644 fdmdv2/paclass.h diff --git a/fdmdv2/FDMDV2.fbp b/fdmdv2/FDMDV2.fbp index e25a23de..04681507 100644 --- a/fdmdv2/FDMDV2.fbp +++ b/fdmdv2/FDMDV2.fbp @@ -71,7 +71,7 @@ Resizable 1 - 732,507 + 761,500 wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER FDMDV2 @@ -484,7 +484,7 @@ wxGA_SMOOTH|wxGA_VERTICAL 0 - + Display signal to noise ratio. wxFILTER_NONE wxDefaultValidator @@ -580,7 +580,7 @@ wxTE_READONLY 0 - + Show S/N ratio numerically. wxFILTER_NONE wxDefaultValidator @@ -687,7 +687,7 @@ wxGA_SMOOTH|wxGA_VERTICAL 0 - + Display signal level. wxFILTER_NONE wxDefaultValidator @@ -729,16 +729,16 @@ 1 wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND 4 - + centerSizer wxVERTICAL none - + 0 wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALIGN_TOP|wxEXPAND 1 - + upperSizer wxVERTICAL @@ -771,7 +771,7 @@ 1 1 - + ,90,90,6,70,0 0 0 wxID_ANY @@ -1152,7 +1152,7 @@ 3 wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND - 3 + 2 wxID_ANY SQ @@ -1215,7 +1215,7 @@ wxSL_AUTOTICKS|wxSL_INVERSE|wxSL_VERTICAL 0 - + Set Squelch level. wxFILTER_NONE wxDefaultValidator @@ -1332,7 +1332,7 @@ wxCHK_2STATE 0 - + Activate/Deactivate Squelch wxFILTER_NONE wxDefaultValidator @@ -1370,11 +1370,11 @@ - + 3 wxALIGN_CENTER|wxALL|wxEXPAND 2 - + wxID_ANY Control @@ -1382,11 +1382,109 @@ wxVERTICAL none - + + 1 + wxEXPAND + 0 + + + bSizer1511 + wxVERTICAL + none + + 1 + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Start + + 0 + + + 0 + + 1 + m_togBtnOnOff + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + Begin receiving data. + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + OnTogBtnOnOff + + + + + + 1 wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND 0 - + bSizer151 wxVERTICAL @@ -1443,7 +1541,7 @@ 0 - Toggle Split mode. + Toggle split frequency mode. wxFILTER_NONE wxDefaultValidator @@ -1639,7 +1737,7 @@ 0 - Toggle ALC Mode. + Toggle automatic level control mode. wxFILTER_NONE wxDefaultValidator @@ -1737,7 +1835,7 @@ 0 - + Switch between Receive and Transmit wxFILTER_NONE wxDefaultValidator @@ -2381,7 +2479,7 @@ - + 1 1 1 @@ -2428,7 +2526,7 @@ Resizable 1 - 553,381 + 555,419 wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER Audio Options @@ -2477,16 +2575,16 @@ - + bSizer32 wxVERTICAL none - + 1 wxEXPAND | wxALL 1 - + 1 1 1 @@ -2568,11 +2666,11 @@ - + Devices 1 - + 1 1 1 @@ -2650,46 +2748,49 @@ - + bSizer34 wxVERTICAL none - + 5 wxEXPAND 1 - + wxID_ANY PortAudio sbSizer10 - wxVERTICAL + wxHORIZONTAL none - + 5 wxEXPAND 1 - + bSizer41 wxHORIZONTAL none - + 5 - wxEXPAND + wxALL 0 - - - bSizer37 - wxVERTICAL + + 1 + 0 + 115,-1 + gSizer6 none - + 3 + 0 + 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL + wxALIGN_CENTER_VERTICAL|wxALL 1 - + 1 1 1 @@ -2773,25 +2874,395 @@ + + 5 + wxEXPAND + 0 + + 2 + 0 + 110,-1 + gSizer51 + none + 2 + 0 + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,90,7,70,0 + 0 + 0 + wxID_ANY + # Ch Out: + + 0 + 80,-1 + + 0 + 80,-1 + 1 + m_staticText151 + 1 + + + protected + 1 + + Resizable + 1 + 80,-1 + wxALIGN_RIGHT + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,90,7,70,0 + 0 + 0 + wxID_ANY + + 0 + 30,-1 + 0 + + 0 + 30,-1 + 1 + m_textNumChOut + 1 + + + protected + 1 + + Resizable + 1 + 30,-1 + wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,90,7,70,0 + 0 + 0 + wxID_ANY + # Ch In: + + 0 + 90,-1 + + 0 + 80,-1 + 1 + m_staticText141 + 1 + + + protected + 1 + + Resizable + 1 + 80,-1 + wxALIGN_RIGHT + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,90,7,70,0 + 0 + 0 + wxID_ANY + + 0 + 30,-1 + 0 + + 0 + 30,-1 + 1 + m_textNumChIn + 1 + + + protected + 1 + + Resizable + 1 + 30,-1 + wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + 5 - wxEXPAND - 1 - - 1 + wxALL|wxEXPAND + 0 + + 2 0 gSizer7 none 4 0 - + 5 wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL 0 - + 1 1 1 @@ -2837,7 +3308,7 @@ Resizable 1 - wxALIGN_RIGHT + wxALIGN_RIGHT|wxST_NO_AUTORESIZE 0 @@ -2874,11 +3345,11 @@ - + 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - + wxALL + 1 + 1 1 1 @@ -2892,6 +3363,7 @@ 1 0 + 1 1 @@ -2906,7 +3378,6 @@ 0 0 wxID_ANY - codec -> Radio Tx: 0 @@ -2914,7 +3385,7 @@ 0 1 - m_staticText15 + m_comboAudioCodec 1 @@ -2922,9 +3393,10 @@ 1 Resizable + -1 1 - wxALIGN_RIGHT + 0 @@ -2932,11 +3404,12 @@ wxFILTER_NONE wxDefaultValidator + <default> - -1 + @@ -2958,14 +3431,16 @@ + + - + 5 - wxALIGN_RIGHT|wxALL + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL 0 - + 1 1 1 @@ -2993,7 +3468,7 @@ 0 0 wxID_ANY - Radio Rx -> codec: + codec -> Radio Tx: 0 @@ -3001,7 +3476,7 @@ 0 1 - m_staticText16 + m_staticText15 1 @@ -3011,7 +3486,7 @@ Resizable 1 - wxALIGN_RIGHT + wxALIGN_RIGHT|wxST_NO_AUTORESIZE 0 @@ -3048,11 +3523,11 @@ - + 5 - wxALIGN_RIGHT|wxALL - 0 - + wxALL + 1 + 1 1 1 @@ -3066,6 +3541,7 @@ 1 0 + 1 1 @@ -3080,7 +3556,6 @@ 0 0 wxID_ANY - codec -> Audio out (spkr): 0 @@ -3088,7 +3563,7 @@ 0 1 - m_staticText17 + m_comboCodecTx 1 @@ -3096,9 +3571,10 @@ 1 Resizable + -1 1 - wxALIGN_RIGHT + 0 @@ -3106,11 +3582,12 @@ wxFILTER_NONE wxDefaultValidator + <default> - -1 + @@ -3132,28 +3609,16 @@ + + - - - - 5 - wxEXPAND - 1 - - 1 - 0 - - gSizer5 - none - 4 - 0 - + 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL 0 - + 1 1 1 @@ -3167,7 +3632,6 @@ 1 0 - 1 1 @@ -3182,6 +3646,7 @@ 0 0 wxID_ANY + Radio Rx -> codec: 0 @@ -3189,7 +3654,7 @@ 0 1 - m_comboBox1 + m_staticText16 1 @@ -3197,10 +3662,9 @@ 1 Resizable - -1 1 - + wxALIGN_RIGHT|wxST_NO_AUTORESIZE 0 @@ -3208,12 +3672,11 @@ wxFILTER_NONE wxDefaultValidator - Combo! + -1 - @@ -3235,16 +3698,14 @@ - - - + 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 - + wxALL + 1 + 1 1 1 @@ -3280,7 +3741,7 @@ 0 1 - m_comboBox2 + m_comboRadioRx 1 @@ -3299,7 +3760,7 @@ wxFILTER_NONE wxDefaultValidator - Combo! + <default> @@ -3331,11 +3792,11 @@ - + 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL 0 - + 1 1 1 @@ -3349,7 +3810,6 @@ 1 0 - 1 1 @@ -3364,6 +3824,7 @@ 0 0 wxID_ANY + codec -> Audio out (spkr): 0 @@ -3371,7 +3832,7 @@ 0 1 - m_comboBox11 + m_staticText17 1 @@ -3379,10 +3840,9 @@ 1 Resizable - -1 1 - + wxALIGN_RIGHT|wxST_NO_AUTORESIZE 0 @@ -3390,12 +3850,11 @@ wxFILTER_NONE wxDefaultValidator - Combo! + -1 - @@ -3417,16 +3876,14 @@ - - - + 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + wxALL 0 - + 1 1 1 @@ -3462,7 +3919,7 @@ 0 1 - m_comboBox12 + m_comboCodecSpkr 1 @@ -3481,7 +3938,7 @@ wxFILTER_NONE wxDefaultValidator - Combo! + <default> @@ -3519,11 +3976,11 @@ - + 5 wxEXPAND 1 - + wxID_ANY File I/O @@ -3531,20 +3988,20 @@ wxHORIZONTAL none - + 5 wxEXPAND 0 - + bSizer38 wxVERTICAL none - + 5 wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL 1 - + 1 1 1 @@ -3590,7 +4047,7 @@ Resizable 1 - wxRB_GROUP + 0 @@ -3630,22 +4087,22 @@ - + 5 wxEXPAND 1 - + bSizer45 wxVERTICAL none - + 5 wxEXPAND 1 - + bSizer46 wxVERTICAL @@ -3657,11 +4114,11 @@ - + Settings 0 - + 1 1 1 @@ -3739,7 +4196,7 @@ - + bSizer27 wxVERTICAL @@ -4163,7 +4620,7 @@ - + 1 wxEXPAND 1 @@ -4585,11 +5042,11 @@ - + Right Channel 0 - + 1 1 1 @@ -4667,7 +5124,7 @@ - + bSizer36 wxVERTICAL @@ -4677,11 +5134,11 @@ - + 5 wxEXPAND 0 - + bSizer28 wxVERTICAL @@ -4714,11 +5171,11 @@ - + 5 wxEXPAND 0 - + 15 protected 0 diff --git a/fdmdv2/Release/fdmdv2.exe b/fdmdv2/Release/fdmdv2.exe index d311d9d86e75fc2c63a6843c8668bb3c4070db9f..5bc524810d09cb2d38b6dc6fa47f29dbb07b7d61 100644 GIT binary patch literal 227328 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

B;{E*HC?4--}h6^7A*r3h5Noj-Rj4f{xA4 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 literal 218624 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%0D4(K3mC( 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 T=aARo=d&=zZvJ^qjlh2ZI-7c< diff --git a/fdmdv2/dlg_audio.cpp b/fdmdv2/dlg_audio.cpp index 1062fddf..e7870224 100644 --- a/fdmdv2/dlg_audio.cpp +++ b/fdmdv2/dlg_audio.cpp @@ -11,59 +11,92 @@ //========================================================================== #include "dlg_audio.h" +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= +// Class AudioDlg( wxWindow* parent ) : DlgAudio( parent ) +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= AudioDlg::AudioDlg( wxWindow* parent ) : DlgAudio( parent ) { } +//------------------------------------------------------------------------- +// OnCancel() +//------------------------------------------------------------------------- void AudioDlg::OnCancel( wxCommandEvent& event ) { this->EndModal(wxID_OK); } +//------------------------------------------------------------------------- +// OnOK() +//------------------------------------------------------------------------- void AudioDlg::OnOK( wxCommandEvent& event ) { this->EndModal(wxID_OK); } +//------------------------------------------------------------------------- +// OnApply() +//------------------------------------------------------------------------- void AudioDlg::OnApply( wxCommandEvent& event ) { this->EndModal(wxID_OK); } +//------------------------------------------------------------------------- +// OnClose() +//------------------------------------------------------------------------- void AudioDlg::OnClose( wxCloseEvent& event ) { this->EndModal(wxID_OK); } +//------------------------------------------------------------------------- +// OnInitDialog() +//------------------------------------------------------------------------- void AudioDlg::OnInitDialog( wxInitDialogEvent& event ) { //wxMessageBox(wxT("got OnInitDialog()"), wxT("Select"), wxOK); populateAudioInfo(); } +//------------------------------------------------------------------------- +// OnRxInputSelect() +//------------------------------------------------------------------------- void AudioDlg::OnRxInputSelect( wxCommandEvent& event ) { wxMessageBox(wxT("got OnRxInputSelect()"), wxT("Select"), wxOK); } +//------------------------------------------------------------------------- +// OnTxOutputSelect() +//------------------------------------------------------------------------- void AudioDlg::OnTxOutputSelect( wxCommandEvent& event ) { wxMessageBox(wxT("got OnTxOutputSelect()"), wxT("Select"), wxOK); } +//------------------------------------------------------------------------- +// OnVoiceInputSelect() +//------------------------------------------------------------------------- void AudioDlg::OnVoiceInputSelect( wxCommandEvent& event ) { wxMessageBox(wxT("got OnVoiceInputSelect()"), wxT("Select"), wxOK); } +//------------------------------------------------------------------------- +// OnVoiceOutputSelect() +//------------------------------------------------------------------------- void AudioDlg::OnVoiceOutputSelect( wxCommandEvent& event ) { wxMessageBox(wxT("got OnVoiceOutputSelect()"), wxT("Select"), wxOK); } +//------------------------------------------------------------------------- +// populateStandardSampleRates() +//------------------------------------------------------------------------- void AudioDlg::populateStandardSampleRates( - wxListBox* target, + wxComboBox* target, const portaudio::DirectionSpecificStreamParameters &inputParameters, const portaudio::DirectionSpecificStreamParameters &outputParameters) { @@ -82,17 +115,20 @@ void AudioDlg::populateStandardSampleRates( if (tmp.isSupported()) { tStr.Printf("%i %8.2f", printCount, STANDARD_SAMPLE_RATES[i]); - target->InsertItems(1, &tStr, 0); + target->Append(tStr); ++printCount; } } if (printCount == 0) { tStr = "None\n"; - target->InsertItems(1, &tStr, 0); + target->Append(tStr); } } +//------------------------------------------------------------------------- +// OnActivate() +//------------------------------------------------------------------------- int AudioDlg::populateAudioInfo() { wxString tStr; @@ -100,7 +136,7 @@ int AudioDlg::populateAudioInfo() try { portaudio::AutoSystem autoSys; - portaudio::System &sys = portaudio::System::instance(); + portaudio::System &sys = portaudio::System::instance(); /* tStr.Printf("PortAudio version number: %i\n", sys.version()); @@ -118,9 +154,7 @@ int AudioDlg::populateAudioInfo() /* tStr.Printf("---------- device #: %i ----------\n", (*i).index()); m_textTopRight->AppendText(tStr); - bool defaultDisplayed = false; - if ((*i).isSystemDefaultInputDevice()) { tStr.Printf("[ System Default Input %s", (*i).hostApi().name()); @@ -149,13 +183,11 @@ int AudioDlg::populateAudioInfo() m_textTopRight->AppendText(tStr); defaultDisplayed = true; } - if (defaultDisplayed) { tStr = " ]\n"; m_textTopRight->AppendText(tStr); } - ttStr.Printf("Name : %s\n", (*i).name()); tStr += ttStr; ttStr.Printf("Host API : %s\n", (*i).hostApi().name()); @@ -164,7 +196,6 @@ int AudioDlg::populateAudioInfo() tStr += ttStr; ttStr.Printf("Max outputs : %i\n\n", (*i).maxOutputChannels()); tStr += ttStr; - ttStr.Printf("Default low input latency : %8.3f\n", (*i).defaultLowInputLatency()); tStr += ttStr; ttStr.Printf("Default low output latency : %8.3f\n", (*i).defaultLowOutputLatency()); @@ -180,11 +211,9 @@ int AudioDlg::populateAudioInfo() if ((*i).hostApi().typeId() == paASIO) { portaudio::AsioDeviceAdapter asioDevice((*i)); - //std::cout << "ASIO minimum buffer size = " << asioDevice.minBufferSize() << std::endl; //std::cout << "ASIO maximum buffer size = " << asioDevice.maxBufferSize() << std::endl; //std::cout << "ASIO preferred buffer size = " << asioDevice.preferredBufferSize() << std::endl; - if (asioDevice.granularity() == -1) { //std::cout << "ASIO buffer granularity = power of 2" << std::endl; @@ -198,33 +227,47 @@ int AudioDlg::populateAudioInfo() tStr.Printf("Default sample rate : %8.2f\n", (*i).defaultSampleRate()); m_textTopRight->AppendText(tStr); + wxComboBox* m_comboAudioCodec; + wxComboBox* m_comboCodecTx; + wxComboBox* m_comboRadioRx; + wxComboBox* m_comboCodecSpkr; */ // Poll for standard sample rates: portaudio::DirectionSpecificStreamParameters inputParameters((*i), (*i).maxInputChannels(), portaudio::INT16, true, 0.0, NULL); portaudio::DirectionSpecificStreamParameters outputParameters((*i), (*i).maxOutputChannels(), portaudio::INT16, true, 0.0, NULL); if (inputParameters.numChannels() > 0) { - tStr = "Supported standard Input sample rates\n"; - m_lbRxInput->InsertItems(1, &tStr, 0); - tStr.Printf(" for half-duplex 16 bit %i channel input = ", inputParameters.numChannels()); - m_lbRxInput->InsertItems(1, &tStr, 0); - populateStandardSampleRates(m_lbRxInput, inputParameters, portaudio::DirectionSpecificStreamParameters::null()); +// tStr = "Supported standard Input sample rates\n"; +// m_comboAudioCodec->Append(tStr); +// tStr.Printf(" for half-duplex 16 bit %i channel input = ", inputParameters.numChannels()); +// m_comboAudioCodec->InsertItems(1, &tStr, 0); +// m_comboAudioCodec->Append(tStr); + populateStandardSampleRates(m_comboAudioCodec, inputParameters, portaudio::DirectionSpecificStreamParameters::null()); } if (outputParameters.numChannels() > 0) { - tStr = "Supported standard Output sample rates\n"; - m_lbTxOutput->InsertItems(1, &tStr, 0); - tStr.Printf(" for half-duplex 16 bit %i channel output = ", outputParameters.numChannels()); - m_lbTxOutput->InsertItems(1, &tStr, 0); - populateStandardSampleRates(m_lbTxOutput, portaudio::DirectionSpecificStreamParameters::null(), outputParameters); +// tStr = "Supported standard Output sample rates\n"; +// m_comboRadioRx->Append(tStr); +// tStr.Printf(" for half-duplex 16 bit %i channel output = ", outputParameters.numChannels()); +// m_comboRadioRx->Append(tStr); + populateStandardSampleRates(m_comboRadioRx, portaudio::DirectionSpecificStreamParameters::null(), outputParameters); + } + if (inputParameters.numChannels() > 0 && inputParameters.numChannels() > 0) + { +// tStr = "Supported full-duplex sample rates\n"; +// m_comboCodecTx->Append(tStr); +// tStr.Printf(" for full-duplex 16 bit %i channel input, %i", inputParameters.numChannels(), outputParameters.numChannels()); +// m_comboCodecTx->InsertItems(1, &tStr, 0); +// m_comboCodecTx->Append(tStr); + populateStandardSampleRates(m_comboCodecTx, inputParameters, outputParameters); } - if (inputParameters.numChannels() > 0 && outputParameters.numChannels() > 0) + if (outputParameters.numChannels() > 0 && outputParameters.numChannels() > 0) { - tStr = "Supported full-duplex sample rates\n"; - m_lbVoiceInput->InsertItems(1, &tStr, 0); - tStr.Printf(" for full-duplex 16 bit %i channel input, %i", inputParameters.numChannels(), outputParameters.numChannels()); - m_lbVoiceInput->InsertItems(1, &tStr, 0); - populateStandardSampleRates(m_lbVoiceInput, inputParameters, outputParameters); +// tStr = "Supported full-duplex sample rates\n"; +// m_comboCodecSpkr->Append(tStr); +// tStr.Printf(" for full-duplex 16 bit %i channel input, %i", inputParameters.numChannels(), outputParameters.numChannels()); +// m_comboCodecTx->InsertItems(1, &tStr, 0); + populateStandardSampleRates(m_comboCodecSpkr, inputParameters, outputParameters); } } } diff --git a/fdmdv2/dlg_audio.h b/fdmdv2/dlg_audio.h index bfb988b6..23aa002f 100644 --- a/fdmdv2/dlg_audio.h +++ b/fdmdv2/dlg_audio.h @@ -30,7 +30,7 @@ class AudioDlg : public DlgAudio void OnInitDialog( wxInitDialogEvent& event ); void OnApply( wxCommandEvent& event ); void populateStandardSampleRates( - wxListBox* target, + wxComboBox* target, const portaudio::DirectionSpecificStreamParameters &inputParameters, const portaudio::DirectionSpecificStreamParameters &outputParameters); int populateAudioInfo(); diff --git a/fdmdv2/extern/include/portaudio.h b/fdmdv2/extern/include/portaudio.h index 79019abb..1dad5736 100644 --- a/fdmdv2/extern/include/portaudio.h +++ b/fdmdv2/extern/include/portaudio.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * Any person wishing to distribute modifications to the Software is * requested to send the modifications to the original developer so that - * they can be incorporated into the canonical version. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -50,7 +50,7 @@ extern "C" { #endif /* __cplusplus */ - + /** Retrieve the release number of the currently running PortAudio build, eg 1900. */ @@ -116,9 +116,9 @@ const char *Pa_GetErrorText( PaError errorCode ); and Pa_GetErrorText(), this function MUST be called before using any other PortAudio API functions. - If Pa_Initialize() is called multiple times, each successful - call must be matched with a corresponding call to Pa_Terminate(). - Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not + If Pa_Initialize() is called multiple times, each successful + call must be matched with a corresponding call to Pa_Terminate(). + Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not required to be fully nested. Note that if Pa_Initialize() returns an error code, Pa_Terminate() should @@ -145,7 +145,7 @@ PaError Pa_Initialize( void ); @return paNoError if successful, otherwise an error code indicating the cause of failure. - + @see Pa_Initialize */ PaError Pa_Terminate( void ); @@ -269,7 +269,7 @@ typedef struct PaHostApiInfo if no default output device is available. */ PaDeviceIndex defaultOutputDevice; - + } PaHostApiInfo; @@ -298,7 +298,7 @@ const PaHostApiInfo * Pa_GetHostApiInfo( PaHostApiIndex hostApi ); @return A valid PaHostApiIndex ranging from 0 to (Pa_GetHostApiCount()-1) or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. - + The paHostApiNotFound error code indicates that the host API specified by the type parameter is not available. @@ -325,7 +325,7 @@ PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type ); A paInvalidDevice error code indicates that the hostApiDeviceIndex parameter is out of range. - + @see PaHostApiInfo */ PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi, @@ -357,8 +357,6 @@ typedef struct PaHostErrorInfo{ */ const PaHostErrorInfo* Pa_GetLastHostErrorInfo( void ); - - /* Device enumeration and capabilities */ /** Retrieve the number of available devices. The number of available devices @@ -398,12 +396,12 @@ PaDeviceIndex Pa_GetDefaultInputDevice( void ); PaDeviceIndex Pa_GetDefaultOutputDevice( void ); -/** The type used to represent monotonic time in seconds. PaTime is - used for the fields of the PaStreamCallbackTimeInfo argument to the +/** The type used to represent monotonic time in seconds. PaTime is + used for the fields of the PaStreamCallbackTimeInfo argument to the PaStreamCallback and as the result of Pa_GetStreamTime(). PaTime values have unspecified origin. - + @see PaStreamCallback, PaStreamCallbackTimeInfo, Pa_GetStreamTime */ typedef double PaTime; @@ -421,7 +419,7 @@ typedef double PaTime; paUInt8 is an unsigned 8 bit format where 128 is considered "ground" - The paNonInterleaved flag indicates that audio data is passed as an array + The paNonInterleaved flag indicates that audio data is passed as an array of pointers to separate buffers, one buffer for each channel. Usually, when this flag is not used, audio data is passed as a single buffer with all channels interleaved. @@ -451,7 +449,7 @@ typedef struct PaDeviceInfo int structVersion; /* this is struct version 2 */ const char *name; PaHostApiIndex hostApi; /**< note this is a host API index, not a type id*/ - + int maxInputChannels; int maxOutputChannels; @@ -493,7 +491,7 @@ typedef struct PaStreamParameters This field must not be set to paNoDevice. */ PaDeviceIndex device; - + /** The number of channels of sound to be delivered to the stream callback or accessed by Pa_ReadStream() or Pa_WriteStream(). It can range from 1 to the value of maxInputChannels in the @@ -568,9 +566,9 @@ PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters, A single PaStream can provide multiple channels of real-time streaming audio input and output to a client application. A stream provides access to audio hardware represented by one or more - PaDevices. Depending on the underlying Host API, it may be possible - to open multiple streams using the same device, however this behavior - is implementation defined. Portable applications should assume that + PaDevices. Depending on the underlying Host API, it may be possible + to open multiple streams using the same device, however this behavior + is implementation defined. Portable applications should assume that a PaDevice may be simultaneously used by at most one PaStream. Pointers to PaStream objects are passed between PortAudio functions that @@ -628,7 +626,7 @@ typedef unsigned long PaStreamFlags; /** Call the stream callback to fill initial output buffers, rather than the default behavior of priming the buffers with zeros (silence). This flag has no effect for input-only and blocking read/write streams. - + @see PaStreamFlags */ #define paPrimeOutputBuffersUsingStreamCallback ((PaStreamFlags) 0x00000008) @@ -642,7 +640,7 @@ typedef unsigned long PaStreamFlags; Timing information for the buffers passed to the stream callback. Time values are expressed in seconds and are synchronised with the time base used by Pa_GetStreamTime() for the associated stream. - + @see PaStreamCallback, Pa_GetStreamTime */ typedef struct PaStreamCallbackTimeInfo{ @@ -713,41 +711,41 @@ typedef enum PaStreamCallbackResult active PortAudio stream. When a stream is running, PortAudio calls the stream callback periodically. - The callback function is responsible for processing buffers of audio samples + The callback function is responsible for processing buffers of audio samples passed via the input and output parameters. The PortAudio stream callback runs at very high or real-time priority. - It is required to consistently meet its time deadlines. Do not allocate - memory, access the file system, call library functions or call other functions + It is required to consistently meet its time deadlines. Do not allocate + memory, access the file system, call library functions or call other functions from the stream callback that may block or take an unpredictable amount of time to complete. In order for a stream to maintain glitch-free operation the callback must consume and return audio data faster than it is recorded and/or - played. PortAudio anticipates that each callback invocation may execute for - a duration approaching the duration of frameCount audio frames at the stream + played. PortAudio anticipates that each callback invocation may execute for + a duration approaching the duration of frameCount audio frames at the stream sample rate. It is reasonable to expect to be able to utilise 70% or more of - the available CPU time in the PortAudio callback. However, due to buffer size - adaption and other factors, not all host APIs are able to guarantee audio - stability under heavy CPU load with arbitrary fixed callback buffer sizes. - When high callback CPU utilisation is required the most robust behavior - can be achieved by using paFramesPerBufferUnspecified as the + the available CPU time in the PortAudio callback. However, due to buffer size + adaption and other factors, not all host APIs are able to guarantee audio + stability under heavy CPU load with arbitrary fixed callback buffer sizes. + When high callback CPU utilisation is required the most robust behavior + can be achieved by using paFramesPerBufferUnspecified as the Pa_OpenStream() framesPerBuffer parameter. - + @param input and @param output are either arrays of interleaved samples or; - if non-interleaved samples were requested using the paNonInterleaved sample - format flag, an array of buffer pointers, one non-interleaved buffer for + if non-interleaved samples were requested using the paNonInterleaved sample + format flag, an array of buffer pointers, one non-interleaved buffer for each channel. The format, packing and number of channels used by the buffers are determined by parameters to Pa_OpenStream(). - + @param frameCount The number of sample frames to be processed by the stream callback. @param timeInfo Timestamps indicating the ADC capture time of the first sample in the input buffer, the DAC output time of the first sample in the output buffer - and the time the callback was invoked. + and the time the callback was invoked. See PaStreamCallbackTimeInfo and Pa_GetStreamTime() @param statusFlags Flags indicating whether input and/or output buffers @@ -785,10 +783,10 @@ typedef int PaStreamCallback( /** Opens a stream for either input, output or both. - + @param stream The address of a PaStream pointer which will receive a pointer to the newly opened stream. - + @param inputParameters A structure that describes the input parameters used by the opened stream. See PaStreamParameters for a description of these parameters. inputParameters must be NULL for output-only streams. @@ -796,10 +794,10 @@ typedef int PaStreamCallback( @param outputParameters A structure that describes the output parameters used by the opened stream. See PaStreamParameters for a description of these parameters. outputParameters must be NULL for input-only streams. - + @param sampleRate The desired sampleRate. For full-duplex streams it is the sample rate for both input and output - + @param framesPerBuffer The number of frames passed to the stream callback function, or the preferred block granularity for a blocking read/write stream. The special value paFramesPerBufferUnspecified (0) may be used to request that @@ -811,11 +809,11 @@ typedef int PaStreamCallback( will be kept to the theoretical minimum however, it is strongly recommended that a non-zero framesPerBuffer value only be used when your algorithm requires a fixed number of frames per stream callback. - + @param streamFlags Flags which modify the behavior of the streaming process. This parameter may contain a combination of flags ORed together. Some flags may only be relevant to certain buffer formats. - + @param streamCallback A pointer to a client supplied function that is responsible for processing and filling input and output buffers. If this parameter is NULL the stream will be opened in 'blocking read/write' mode. In blocking mode, @@ -828,7 +826,7 @@ typedef int PaStreamCallback( function. It could for example, contain a pointer to instance data necessary for processing the audio buffers. This parameter is ignored if streamCallback is NULL. - + @return Upon success Pa_OpenStream() returns paNoError and places a pointer to a valid PaStream in the stream argument. The stream is inactive (stopped). @@ -853,7 +851,7 @@ PaError Pa_OpenStream( PaStream** stream, @param stream The address of a PaStream pointer which will receive a pointer to the newly opened stream. - + @param numInputChannels The number of channels of sound that will be supplied to the stream callback or returned by Pa_ReadStream. It can range from 1 to the value of maxInputChannels in the PaDeviceInfo record for the default input @@ -868,7 +866,7 @@ PaError Pa_OpenStream( PaStream** stream, provided to the callback or passed to and from Pa_ReadStream and Pa_WriteStream. sampleFormat may be any of the formats described by the PaSampleFormat enumeration. - + @param sampleRate Same as Pa_OpenStream parameter of the same name. @param framesPerBuffer Same as Pa_OpenStream parameter of the same name. @param streamCallback Same as Pa_OpenStream parameter of the same name. @@ -894,7 +892,7 @@ PaError Pa_OpenDefaultStream( PaStream** stream, PaError Pa_CloseStream( PaStream *stream ); -/** Functions of type PaStreamFinishedCallback are implemented by PortAudio +/** Functions of type PaStreamFinishedCallback are implemented by PortAudio clients. They can be registered with a stream using the Pa_SetStreamFinishedCallback function. Once registered they are called when the stream becomes inactive (ie once a call to Pa_StopStream() will not block). @@ -903,7 +901,7 @@ PaError Pa_CloseStream( PaStream *stream ); output, if the stream callback returns paComplete, or Pa_StopStream is called, the stream finished callback will not be called until all generated sample data has been played. - + @param userData The userData parameter supplied to Pa_OpenStream() @see Pa_SetStreamFinishedCallback @@ -911,12 +909,12 @@ PaError Pa_CloseStream( PaStream *stream ); typedef void PaStreamFinishedCallback( void *userData ); -/** Register a stream finished callback function which will be called when the - stream becomes inactive. See the description of PaStreamFinishedCallback for +/** Register a stream finished callback function which will be called when the + stream becomes inactive. See the description of PaStreamFinishedCallback for further details about when the callback will be called. @param stream a pointer to a PaStream that is in the stopped state - if the - stream is not stopped, the stream's finished callback will remain unchanged + stream is not stopped, the stream's finished callback will remain unchanged and an error code will be returned. @param streamFinishedCallback a pointer to a function with the same signature @@ -929,7 +927,7 @@ typedef void PaStreamFinishedCallback( void *userData ); @see PaStreamFinishedCallback */ -PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ); +PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ); /** Commences audio processing. @@ -1014,7 +1012,7 @@ typedef struct PaStreamInfo parameter passed to Pa_OpenStream(). */ double sampleRate; - + } PaStreamInfo; @@ -1036,15 +1034,15 @@ const PaStreamInfo* Pa_GetStreamInfo( PaStream *stream ); /** Returns the current time in seconds for a stream according to the same clock used to generate callback PaStreamCallbackTimeInfo timestamps. The time values are - monotonically increasing and have unspecified origin. - + monotonically increasing and have unspecified origin. + Pa_GetStreamTime returns valid time values for the entire life of the stream, from when the stream is opened until it is closed. Starting and stopping the stream does not affect the passage of time returned by Pa_GetStreamTime. - This time may be used for synchronizing other events to the audio stream, for + This time may be used for synchronizing other events to the audio stream, for example synchronizing audio to MIDI. - + @return The stream's current time in seconds, or 0 if an error occurred. @see PaTime, PaStreamCallback, PaStreamCallbackTimeInfo @@ -1059,7 +1057,7 @@ PaTime Pa_GetStreamTime( PaStream *stream ); This function may be called from the stream callback function or the application. - + @return A floating point value, typically between 0.0 and 1.0, where 1.0 indicates that the stream callback is consuming the maximum number of CPU cycles possible @@ -1076,12 +1074,12 @@ double Pa_GetStreamCpuLoad( PaStream* stream ); system to supply the data. @param stream A pointer to an open stream previously created with Pa_OpenStream. - + @param buffer A pointer to a buffer of sample frames. The buffer contains samples in the format specified by the inputParameters->sampleFormat field used to open the stream, and the number of channels specified by inputParameters->numChannels. If non-interleaved samples were requested using - the paNonInterleaved sample format flag, buffer is a pointer to the first element + the paNonInterleaved sample format flag, buffer is a pointer to the first element of an array of buffer pointers, one non-interleaved buffer for each channel. @param frames The number of frames to be read into buffer. This parameter @@ -1107,7 +1105,7 @@ PaError Pa_ReadStream( PaStream* stream, samples in the format specified by the outputParameters->sampleFormat field used to open the stream, and the number of channels specified by outputParameters->numChannels. If non-interleaved samples were requested using - the paNonInterleaved sample format flag, buffer is a pointer to the first element + the paNonInterleaved sample format flag, buffer is a pointer to the first element of an array of buffer pointers, one non-interleaved buffer for each channel. @param frames The number of frames to be written from buffer. This parameter diff --git a/fdmdv2/fdmdv2.mk b/fdmdv2/fdmdv2.mk index 5cba256e..7e6365db 100644 --- a/fdmdv2/fdmdv2.mk +++ b/fdmdv2/fdmdv2.mk @@ -2,10 +2,10 @@ ## Auto Generated makefile by CodeLite IDE ## any manual changes will be erased ## -## Release +## Debug ProjectName :=fdmdv2 -ConfigurationName :=Release -IntermediateDirectory :=./Release +ConfigurationName :=Debug +IntermediateDirectory :=./Debug OutDir := $(IntermediateDirectory) WorkspacePath := "C:\Users\wittend\Projects\Radio\fdmdv2" ProjectPath := "C:\Users\wittend\Projects\Radio\fdmdv2" @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=wittend -Date :=5/30/2012 +Date :=6/12/2012 CodeLitePath :="C:\Program Files\CodeLite" LinkerName :=g++ ArchiveTool :=ar rcus @@ -38,9 +38,9 @@ PreprocessOnlySwitch :=-E ObjectsFileList :="C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2.txt" PCHCompileFlags := MakeDirCommand :=makedir -CmpOptions := -O2 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=no) $(Preprocessors) -C_CmpOptions := -O2 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=no) $(Preprocessors) -LinkOptions := -mwindows -s $(shell wx-config --debug=no --libs --unicode=yes) +CmpOptions := -g -O0 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=yes) $(Preprocessors) +C_CmpOptions := -g -O0 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=yes) $(Preprocessors) +LinkOptions := -mwindows $(shell wx-config --debug=yes --libs --unicode=yes) IncludePath := $(IncludeSwitch). $(IncludeSwitch)./extern/include IncludePCH := RcIncludePath := @@ -56,7 +56,7 @@ WXWIN:=C:\bin\wxWidgets-2.9.2 PATH:=$(WXWIN)\lib\gcc_dll;$(PATH) WXCFG:=gcc_dll\mswu UNIT_TEST_PP_SRC_DIR:=C:\bin\UnitTest++-1.3 -Objects=$(IntermediateDirectory)/topFrame$(ObjectSuffix) $(IntermediateDirectory)/dlg_about$(ObjectSuffix) $(IntermediateDirectory)/dlg_audio$(ObjectSuffix) $(IntermediateDirectory)/dlg_options$(ObjectSuffix) $(IntermediateDirectory)/dlg_comports$(ObjectSuffix) $(IntermediateDirectory)/fdmdv2_plot$(ObjectSuffix) $(IntermediateDirectory)/fdmdv2_main$(ObjectSuffix) +Objects=$(IntermediateDirectory)/topFrame$(ObjectSuffix) $(IntermediateDirectory)/dlg_about$(ObjectSuffix) $(IntermediateDirectory)/dlg_audio$(ObjectSuffix) $(IntermediateDirectory)/dlg_options$(ObjectSuffix) $(IntermediateDirectory)/dlg_comports$(ObjectSuffix) $(IntermediateDirectory)/fdmdv2_plot$(ObjectSuffix) $(IntermediateDirectory)/fdmdv2_main$(ObjectSuffix) $(IntermediateDirectory)/paclass$(ObjectSuffix) ## ## Main Build Targets @@ -71,7 +71,7 @@ $(OutputFile): $(IntermediateDirectory)/.d $(Objects) $(LinkerName) $(OutputSwitch)$(OutputFile) @$(ObjectsFileList) $(LibPath) $(Libs) $(LinkOptions) $(IntermediateDirectory)/.d: - @$(MakeDirCommand) "./Release" + @$(MakeDirCommand) "./Debug" PreBuild: @@ -135,6 +135,14 @@ $(IntermediateDirectory)/fdmdv2_main$(DependSuffix): fdmdv2_main.cpp $(IntermediateDirectory)/fdmdv2_main$(PreprocessSuffix): fdmdv2_main.cpp @$(CompilerName) $(CmpOptions) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/fdmdv2_main$(PreprocessSuffix) "C:/Users/wittend/Projects/Radio/fdmdv2/fdmdv2_main.cpp" +$(IntermediateDirectory)/paclass$(ObjectSuffix): paclass.cpp $(IntermediateDirectory)/paclass$(DependSuffix) + $(CompilerName) $(IncludePCH) $(SourceSwitch) "C:/Users/wittend/Projects/Radio/fdmdv2/paclass.cpp" $(CmpOptions) $(ObjectSwitch)$(IntermediateDirectory)/paclass$(ObjectSuffix) $(IncludePath) +$(IntermediateDirectory)/paclass$(DependSuffix): paclass.cpp + @$(CompilerName) $(CmpOptions) $(IncludePCH) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/paclass$(ObjectSuffix) -MF$(IntermediateDirectory)/paclass$(DependSuffix) -MM "C:/Users/wittend/Projects/Radio/fdmdv2/paclass.cpp" + +$(IntermediateDirectory)/paclass$(PreprocessSuffix): paclass.cpp + @$(CompilerName) $(CmpOptions) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/paclass$(PreprocessSuffix) "C:/Users/wittend/Projects/Radio/fdmdv2/paclass.cpp" + -include $(IntermediateDirectory)/*$(DependSuffix) ## @@ -162,8 +170,11 @@ clean: $(RM) $(IntermediateDirectory)/fdmdv2_main$(ObjectSuffix) $(RM) $(IntermediateDirectory)/fdmdv2_main$(DependSuffix) $(RM) $(IntermediateDirectory)/fdmdv2_main$(PreprocessSuffix) + $(RM) $(IntermediateDirectory)/paclass$(ObjectSuffix) + $(RM) $(IntermediateDirectory)/paclass$(DependSuffix) + $(RM) $(IntermediateDirectory)/paclass$(PreprocessSuffix) $(RM) $(OutputFile) $(RM) $(OutputFile).exe - $(RM) "C:\Users\wittend\Projects\Radio\fdmdv2\.build-release\fdmdv2" + $(RM) "C:\Users\wittend\Projects\Radio\fdmdv2\.build-debug\fdmdv2" diff --git a/fdmdv2/fdmdv2.project b/fdmdv2/fdmdv2.project index 24882cce..97f3a779 100644 --- a/fdmdv2/fdmdv2.project +++ b/fdmdv2/fdmdv2.project @@ -15,26 +15,7 @@ <File Name="dlg_comports.cpp"/> <File Name="fdmdv2_plot.cpp"/> <File Name="fdmdv2_main.cpp"/> - <File Name="extern/include/portaudiocpp/AsioDeviceAdapter.hxx"/> - <File Name="extern/include/portaudiocpp/AutoSystem.hxx"/> - <File Name="extern/include/portaudiocpp/BlockingStream.hxx"/> - <File Name="extern/include/portaudiocpp/CallbackInterface.hxx"/> - <File Name="extern/include/portaudiocpp/CallbackStream.hxx"/> - <File Name="extern/include/portaudiocpp/CFunCallbackStream.hxx"/> - <File Name="extern/include/portaudiocpp/CppFunCallbackStream.hxx"/> - <File Name="extern/include/portaudiocpp/Device.hxx"/> - <File Name="extern/include/portaudiocpp/DirectionSpecificStreamParameters.hxx"/> - <File Name="extern/include/portaudiocpp/Exception.hxx"/> - <File Name="extern/include/portaudiocpp/HostApi.hxx"/> - <File Name="extern/include/portaudiocpp/InterfaceCallbackStream.hxx"/> - <File Name="extern/include/portaudiocpp/MemFunCallbackStream.hxx"/> - <File Name="extern/include/portaudiocpp/PortAudioCpp.hxx"/> - <File Name="extern/include/portaudiocpp/SampleDataFormat.hxx"/> - <File Name="extern/include/portaudiocpp/Stream.hxx"/> - <File Name="extern/include/portaudiocpp/StreamParameters.hxx"/> - <File Name="extern/include/portaudiocpp/System.hxx"/> - <File Name="extern/include/portaudiocpp/SystemDeviceIterator.hxx"/> - <File Name="extern/include/portaudiocpp/SystemHostApiIterator.hxx"/> + <File Name="paclass.cpp"/> </VirtualDirectory> <VirtualDirectory Name="include"> <File Name="topFrame.h"/> @@ -50,6 +31,29 @@ <File Name="extern/include/rig_dll.h"/> <File Name="extern/include/riglist.h"/> <File Name="extern/include/samplerate.h"/> + <VirtualDirectory Name="portaudio_cpp"> + <File Name="extern/include/portaudiocpp/AsioDeviceAdapter.hxx"/> + <File Name="extern/include/portaudiocpp/AutoSystem.hxx"/> + <File Name="extern/include/portaudiocpp/BlockingStream.hxx"/> + <File Name="extern/include/portaudiocpp/CallbackInterface.hxx"/> + <File Name="extern/include/portaudiocpp/CallbackStream.hxx"/> + <File Name="extern/include/portaudiocpp/CFunCallbackStream.hxx"/> + <File Name="extern/include/portaudiocpp/CppFunCallbackStream.hxx"/> + <File Name="extern/include/portaudiocpp/Device.hxx"/> + <File Name="extern/include/portaudiocpp/DirectionSpecificStreamParameters.hxx"/> + <File Name="extern/include/portaudiocpp/Exception.hxx"/> + <File Name="extern/include/portaudiocpp/HostApi.hxx"/> + <File Name="extern/include/portaudiocpp/InterfaceCallbackStream.hxx"/> + <File Name="extern/include/portaudiocpp/MemFunCallbackStream.hxx"/> + <File Name="extern/include/portaudiocpp/PortAudioCpp.hxx"/> + <File Name="extern/include/portaudiocpp/SampleDataFormat.hxx"/> + <File Name="extern/include/portaudiocpp/Stream.hxx"/> + <File Name="extern/include/portaudiocpp/StreamParameters.hxx"/> + <File Name="extern/include/portaudiocpp/System.hxx"/> + <File Name="extern/include/portaudiocpp/SystemDeviceIterator.hxx"/> + <File Name="extern/include/portaudiocpp/SystemHostApiIterator.hxx"/> + </VirtualDirectory> + <File Name="paclass.h"/> </VirtualDirectory> <VirtualDirectory Name="resources"> <File Name="FDMDV2.fbp"/> @@ -68,11 +72,16 @@ </GlobalSettings> <Configuration Name="Debug" CompilerType="gnu g++" DebuggerType="GNU gdb debugger" Type="Executable" BuildCmpWithGlobalSettings="append" BuildLnkWithGlobalSettings="append" BuildResWithGlobalSettings="append"> <Compiler Options="-g;-O0;-Wall;$(shell wx-config --cxxflags --unicode=yes --debug=yes)" C_Options="-g;-O0;-Wall;$(shell wx-config --cxxflags --unicode=yes --debug=yes)" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags=""> + <IncludePath Value="./extern/include"/> <Preprocessor Value="__WX__"/> </Compiler> <Linker Options="-mwindows;$(shell wx-config --debug=yes --libs --unicode=yes)" Required="yes"> <LibraryPath Value="./libsndfile/bin"/> + <LibraryPath Value="./extern/lib"/> <Library Value="libsndfile-1.dll"/> + <Library Value="libcodec2.a"/> + <Library Value="libportaudio.a"/> + <Library Value="libportaudiocpp.a"/> </Linker> <ResourceCompiler Options="$(shell wx-config --rcflags)" Required="no"/> <General OutputFile="$(IntermediateDirectory)/$(ProjectName)" IntermediateDirectory="./Debug" Command="./$(ProjectName)" CommandArguments="" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes"/> @@ -99,7 +108,7 @@ <CustomPostBuild/> <CustomPreBuild/> </AdditionalRules> - <Completion> + <Completion EnableCpp11="no"> <ClangCmpFlags/> <ClangPP/> <SearchPaths/> @@ -143,7 +152,7 @@ <CustomPostBuild/> <CustomPreBuild/> </AdditionalRules> - <Completion> + <Completion EnableCpp11="no"> <ClangCmpFlags/> <ClangPP/> <SearchPaths/> diff --git a/fdmdv2/fdmdv2.txt b/fdmdv2/fdmdv2.txt index 132b2279..fce2d890 100644 --- a/fdmdv2/fdmdv2.txt +++ b/fdmdv2/fdmdv2.txt @@ -1 +1 @@ -./Release/topFrame.o ./Release/dlg_about.o ./Release/dlg_audio.o ./Release/dlg_options.o ./Release/dlg_comports.o ./Release/fdmdv2_plot.o ./Release/fdmdv2_main.o +./Debug/topFrame.o ./Debug/dlg_about.o ./Debug/dlg_audio.o ./Debug/dlg_options.o ./Debug/dlg_comports.o ./Debug/fdmdv2_plot.o ./Debug/fdmdv2_main.o ./Debug/paclass.o diff --git a/fdmdv2/fdmdv2.workspace b/fdmdv2/fdmdv2.workspace index 1ac9a3cf..75a4c32d 100644 --- a/fdmdv2/fdmdv2.workspace +++ b/fdmdv2/fdmdv2.workspace @@ -6,7 +6,7 @@ <Project Name="pa_test" Path="pa_test/pa_test.project" Active="No"/> <Project Name="pa_cppbinding_test" Path="pa_cppbinding_test/pa_cppbinding_test.project" Active="No"/> <BuildMatrix> - <WorkspaceConfiguration Name="Debug" Selected="no"> + <WorkspaceConfiguration Name="Debug" Selected="yes"> <Project Name="test_sndfile" ConfigName="Debug"/> <Project Name="test_portaudio" ConfigName="Debug"/> <Project Name="test_codec2" ConfigName="Debug"/> @@ -16,7 +16,7 @@ <Project Name="pa_test" ConfigName="Debug"/> <Project Name="pa_cppbinding_test" ConfigName="Debug"/> </WorkspaceConfiguration> - <WorkspaceConfiguration Name="Release" Selected="yes"> + <WorkspaceConfiguration Name="Release" Selected="no"> <Project Name="test_sndfile" ConfigName="Release"/> <Project Name="test_portaudio" ConfigName="Release"/> <Project Name="test_codec2" ConfigName="Release"/> diff --git a/fdmdv2/fdmdv2_main.cpp b/fdmdv2/fdmdv2_main.cpp index f6c474ca..ae28ff61 100644 --- a/fdmdv2/fdmdv2_main.cpp +++ b/fdmdv2/fdmdv2_main.cpp @@ -19,7 +19,6 @@ // initialize the application IMPLEMENT_APP(MainApp); -// `Main program' equivalent: the program execution "starts" here //------------------------------------------------------------------------- // OnInit() //------------------------------------------------------------------------- @@ -53,23 +52,36 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent) // m_bitmap = bitmap; m_sound = NULL; m_zoom = 1.; + m_SquelchActive = false; } +//------------------------------------------------------------------------- +// ~MainFrame() +//------------------------------------------------------------------------- MainFrame::~MainFrame() { } +//------------------------------------------------------------------------- +// OnCloseFrame() +//------------------------------------------------------------------------- void MainFrame::OnCloseFrame(wxCloseEvent& event) { Destroy(); } +//------------------------------------------------------------------------- +// OnExitClick() +//------------------------------------------------------------------------- void MainFrame::OnExitClick(wxCommandEvent& event) { Destroy(); } +//------------------------------------------------------------------------- +// OnPaint() +//------------------------------------------------------------------------- void MainFrame::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); @@ -83,33 +95,59 @@ void MainFrame::OnPaint(wxPaintEvent& WXUNUSED(event)) dc.DrawBitmap(m_bitmap, dc.DeviceToLogicalX((size.x - m_zoom * m_bitmap.GetWidth()) / 2), dc.DeviceToLogicalY((size.y - m_zoom * m_bitmap.GetHeight()) / 2), true); } +//------------------------------------------------------------------------- +// OnCmdSliderScroll() +//------------------------------------------------------------------------- void MainFrame::OnCmdSliderScroll(wxScrollEvent& event) { event.Skip(); } +//------------------------------------------------------------------------- +// OnCmdSliderScrollChanged() +//------------------------------------------------------------------------- void MainFrame::OnCmdSliderScrollChanged(wxScrollEvent& event) { event.Skip(); } +//------------------------------------------------------------------------- +// OnSliderScrollTop() +//------------------------------------------------------------------------- void MainFrame::OnSliderScrollTop(wxScrollEvent& event) { event.Skip(); } +//------------------------------------------------------------------------- +// OnSliderScrollBottom() +//------------------------------------------------------------------------- void MainFrame::OnSliderScrollBottom(wxScrollEvent& event) { wxMessageBox(wxT("Got Click!"), wxT("OnSliderScrollBottom"), wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnCheckSQClick() +//------------------------------------------------------------------------- void MainFrame::OnCheckSQClick(wxCommandEvent& event) { - wxMessageBox(wxT("Got Click!"), wxT("OnCheckSQClick"), wxOK); - event.Skip(); + if(!m_SquelchActive) + { + m_SquelchActive = true; + //wxMessageBox(wxT("Squelch On!"), wxT("Squelch On"), wxOK); + } + else + { + m_SquelchActive = false; + //wxMessageBox(wxT("Squelch Off!"), wxT("Squelch Off"), wxOK); + } } +//------------------------------------------------------------------------- +// OnTogBtnTXClick() +//------------------------------------------------------------------------- void MainFrame::OnTogBtnTXClick(wxCommandEvent& event) { m_soundFile = wxT("./hts1a.wav"); @@ -117,161 +155,394 @@ void MainFrame::OnTogBtnTXClick(wxCommandEvent& event) m_sound->Play(); } +//------------------------------------------------------------------------- +// OnTogBtnRxID() +//------------------------------------------------------------------------- void MainFrame::OnTogBtnRxID(wxCommandEvent& event) { wxMessageBox("Got Click!", "OnTogBtnRxID", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnTogBtnTxID() +//------------------------------------------------------------------------- void MainFrame::OnTogBtnTxID(wxCommandEvent& event) { wxMessageBox("Got Click!", "OnTogBtnTxID", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnTogBtnSplitClick() +//------------------------------------------------------------------------- void MainFrame::OnTogBtnSplitClick(wxCommandEvent& event) { wxMessageBox("Got Click!", "OnTogBtnSplitClick", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnTogBtnAnalogClick() +//------------------------------------------------------------------------- void MainFrame::OnTogBtnAnalogClick (wxCommandEvent& event) { wxMessageBox("Got Click!", "OnTogBtnAnalogClick", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnTogBtnALCClick() +//------------------------------------------------------------------------- void MainFrame::OnTogBtnALCClick(wxCommandEvent& event) { wxMessageBox("Got Click!", "OnTogBtnALCClick", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// audioCallback() +//------------------------------------------------------------------------- +static int audioCallback( const void *inputBuffer, + void *outputBuffer, + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo *outTime, + PaStreamCallbackFlags statusFlags, + void *userData + ) +{ + float *out = (float *) outputBuffer; + float *in = (float *) inputBuffer; + float leftInput; + float rightInput; + unsigned int i; + + if(inputBuffer == NULL) + { + return 0; + } + // Read input buffer, process data, and fill output buffer. + for(i = 0; i < framesPerBuffer; i++) + { + leftInput = *in++; // Get interleaved samples from input buffer. + rightInput = *in++; + *out++ = leftInput * rightInput; // ring modulation + *out++ = 0.5f * (leftInput + rightInput); // mixing + } + return paContinue; // 0; +} + +/* +#define FUZZ(x) CubicAmplifier(CubicAmplifier(CubicAmplifier(CubicAmplifier(x)))) +static int gNumNoInputs = 0; +//------------------------------------------------------------------------- +// fuzzCallback() +//------------------------------------------------------------------------- +static int fuzzCallback(const void *inputBuffer, + void *outputBuffer, + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData) +{ + SAMPLE *out = (SAMPLE*)outputBuffer; + const SAMPLE *in = (const SAMPLE*)inputBuffer; + unsigned int i; + (void) timeInfo; // Prevent unused variable warnings. + (void) statusFlags; + (void) userData; + + if(inputBuffer == NULL) + { + for(i = 0; i < framesPerBuffer; i++) + { + *out++ = 0; // left - silent + *out++ = 0; // right - silent + } + gNumNoInputs += 1; + } + else + { + for(i = 0; i < framesPerBuffer; i++) + { + *out++ = FUZZ(*in++); // left - distorted + *out++ = *in++; // right - clean + } + } + return paContinue; +} +*/ + +//------------------------------------------------------------------------- +// OnTogBtnOnOff() +//------------------------------------------------------------------------- +void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) +{ + PortAudioWrap pa; + if(!m_radioRunning) + { + m_radioRunning = true; + pa = PortAudioWrap(); + err = pa.init(); + + inputDevice = pa.getDefaultInputDevice(); // default input device + if(inputDevice == paNoDevice) + { + wxMessageBox("Error: No default input device.", "Error", wxOK); + return; + } + err = pa.setInputDevice(inputDevice); + err = pa.setInputChannelCount(2); // stereo input + err = pa.setInputSampleFormat(PA_SAMPLE_TYPE); + err = pa.setInputLatency(pa.getInputDefaultLowLatency()); + pa.setInputHostApiStreamInfo(NULL); + + outputDevice = pa.getDefaultOutputDevice(); // default output device + if (outputDevice == paNoDevice) + { + wxMessageBox("Error: No default output device.", "Error", wxOK); + return; + } + err = pa.setOutputDevice(outputDevice); + err = pa.setOutputChannelCount(2); // stereo input + err = pa.setOutputSampleFormat(PA_SAMPLE_TYPE); + + err = pa.setOutputLatency(pa.getOutputDefaultLowLatency()); + pa.setOutputHostApiStreamInfo(NULL); + + err = pa.setFramesPerBuffer(FRAMES_PER_BUFFER); + err = pa.setSampleRate(SAMPLE_RATE); + err = pa.setStreamFlags(0); + err = pa.setCallback(audioCallback); + err = pa.streamOpen(); + + if(err != paNoError) + { + wxMessageBox("Open/Setup error.", "Error", wxOK); + return; + } + err = pa.streamStart(); + if(err != paNoError) + { + wxMessageBox("Stream Start Error.", "Error", wxOK); + return; + } + m_togBtnOnOff->SetLabel(wxT("Stop")); + } + else + { + m_radioRunning = false; + pa.terminate(); + m_togBtnOnOff->SetLabel(wxT("Start")); + } +} + +//------------------------------------------------------------------------- +// OnOpen() +//------------------------------------------------------------------------- void MainFrame::OnOpen( wxCommandEvent& event ) { - wxMessageBox("Got Click!", "OnOpen", wxOK); - event.Skip(); + if(m_sound != NULL) + { + if (wxMessageBox(wxT("Current content has not been saved! Proceed?"),wxT("Please confirm"), wxICON_QUESTION | wxYES_NO, this) == wxNO ) + { + return; + } + } + wxFileDialog openFileDialog(this, + wxT("Open Sound file"), + wxEmptyString, + wxEmptyString, + wxT("WAV files (*.wav)|*.wav|") + wxT("RAW files (*.raw)|*.raw|") + wxT("SPEEX files (*.spx)|*.spx|") + wxT("FLAC files (*.flc)|*.flc|") + wxT("All files (*.*)|*.*|"), + wxFD_OPEN | wxFD_FILE_MUST_EXIST); + if (openFileDialog.ShowModal() == wxID_CANCEL) + { + return; // the user changed idea... + } + // proceed loading the file chosen by the user; + m_sound->Play(openFileDialog.GetPath()); +/* + // this can be done with e.g. wxWidgets input streams: + wxFileInputStream input_stream(openFileDialog.GetPath()); + if (!input_stream.IsOk()) + { + wxLogError("Cannot open file '%s'.", openFileDialog.GetPath()); + return; + } +*/ } +//------------------------------------------------------------------------- +// OnOpenUpdateUI() +//------------------------------------------------------------------------- void MainFrame::OnOpenUpdateUI( wxUpdateUIEvent& event ) { // wxMessageBox("Got Click!", "OnOpenUpdateUI", wxOK); // event.Skip(); } +//------------------------------------------------------------------------- +// OnSaveUpdateUI() +//------------------------------------------------------------------------- void MainFrame::OnSaveUpdateUI( wxUpdateUIEvent& event ) { // wxMessageBox("Got Click!", "OnSaveUpdateUI", wxOK); // event.Skip(); } +//------------------------------------------------------------------------- +// OnClose() +//------------------------------------------------------------------------- void MainFrame::OnClose( wxCommandEvent& event ) { if(m_sound != NULL) { // if(m_sound->IsPlaying()) // { - m_sound->Stop(); - m_sound = NULL; + m_sound->Stop(); + m_sound = NULL; // } } // wxMessageBox("Got Click!", "OnClose", wxOK); // event.Skip(); } +//------------------------------------------------------------------------- +// OnCloseUpdateUI() +//------------------------------------------------------------------------- void MainFrame::OnCloseUpdateUI( wxUpdateUIEvent& event ) { -// wxMessageBox("Got Click!", "OnCloseUpdateUI", wxOK); -// event.Skip(); } +//------------------------------------------------------------------------- +// OnExit() +//------------------------------------------------------------------------- void MainFrame::OnExit( wxCommandEvent& event ) { wxMessageBox("Got Click!", "OnExit", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnCopy() +//------------------------------------------------------------------------- void MainFrame::OnCopy( wxCommandEvent& event ) { wxMessageBox("Got Click!", "OnCopy", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnCopyUpdateUI() +//------------------------------------------------------------------------- void MainFrame::OnCopyUpdateUI( wxUpdateUIEvent& event ) { -// wxMessageBox("Got Click!", "OnCopyUpdateUI", wxOK); -// event.Skip(); } +//------------------------------------------------------------------------- +// OnCut() +//------------------------------------------------------------------------- void MainFrame::OnCut( wxCommandEvent& event ) { wxMessageBox("Got Click!", "OnCut", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnCutUpdateUI() +//------------------------------------------------------------------------- void MainFrame::OnCutUpdateUI( wxUpdateUIEvent& event ) { -// wxMessageBox("Got Click!", "OnCutUpdateUI", wxOK); -// event.Skip(); } +//------------------------------------------------------------------------- +// OnPaste() +//------------------------------------------------------------------------- void MainFrame::OnPaste( wxCommandEvent& event ) { wxMessageBox("Got Click!", "OnPaste", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnPasteUpdateUI() +//------------------------------------------------------------------------- void MainFrame::OnPasteUpdateUI( wxUpdateUIEvent& event ) { -// wxMessageBox("Got Click!", "OnPasteUpdateUI", wxOK); -// event.Skip(); } +//------------------------------------------------------------------------- +// OnToolsOptions() +//------------------------------------------------------------------------- void MainFrame::OnToolsOptions( wxCommandEvent& event ) { OptionsDlg *dlg = new OptionsDlg(NULL); dlg->ShowModal(); } +//------------------------------------------------------------------------- +// OnToolsOptionsUI() +//------------------------------------------------------------------------- void MainFrame::OnToolsOptionsUI( wxUpdateUIEvent& event ) { -// OptionsDlg *dlg = new OptionsDlg(NULL); -// dlg->ShowModal(); } +//------------------------------------------------------------------------- +// OnToolsAudio() +//------------------------------------------------------------------------- void MainFrame::OnToolsAudio( wxCommandEvent& event ) { AudioDlg *dlg = new AudioDlg(NULL); dlg->ShowModal(); } +//------------------------------------------------------------------------- +// OnToolsAudioUI() +//------------------------------------------------------------------------- void MainFrame::OnToolsAudioUI( wxUpdateUIEvent& event ) { -// OptionsDlg *dlg = new OptionsDlg(NULL); -// dlg->ShowModal(); } +//------------------------------------------------------------------------- +// OnToolsComCfg() +//------------------------------------------------------------------------- void MainFrame::OnToolsComCfg( wxCommandEvent& event ) { ComPortsDlg *dlg = new ComPortsDlg(NULL); dlg->ShowModal(); } +//------------------------------------------------------------------------- +// OnToolsComCfgUI() +//------------------------------------------------------------------------- void MainFrame::OnToolsComCfgUI( wxUpdateUIEvent& event ) { event.Enable(!m_radioRunning); } +//------------------------------------------------------------------------- +// OnHelpCheckUpdates() +//------------------------------------------------------------------------- void MainFrame::OnHelpCheckUpdates( wxCommandEvent& event ) { wxMessageBox("Got Click!", "OnHelpCheckUpdates", wxOK); event.Skip(); } +//------------------------------------------------------------------------- +// OnHelpCheckUpdatesUI() +//------------------------------------------------------------------------- void MainFrame::OnHelpCheckUpdatesUI( wxUpdateUIEvent& event ) { } +//------------------------------------------------------------------------- +// OnHelpAbout() +//------------------------------------------------------------------------- void MainFrame::OnHelpAbout( wxCommandEvent& event ) { AboutDlg *dlg = new AboutDlg(NULL); @@ -279,6 +550,9 @@ void MainFrame::OnHelpAbout( wxCommandEvent& event ) } +//------------------------------------------------------------------------- +// LoadUserImage() +//------------------------------------------------------------------------- wxString MainFrame::LoadUserImage(wxImage& image) { wxString filename; @@ -295,22 +569,21 @@ wxString MainFrame::LoadUserImage(wxImage& image) return filename; } +//------------------------------------------------------------------------- +// OnSave() +//------------------------------------------------------------------------- void MainFrame::OnSave(wxCommandEvent& WXUNUSED(event)) { wxImage image = m_bitmap.ConvertToImage(); - wxString savefilename = wxFileSelector(wxT("Save Image"), + wxString savefilename = wxFileSelector(wxT("Save Sound File"), wxEmptyString, wxEmptyString, (const wxChar *)NULL, - wxT("BMP files (*.bmp)|*.bmp|") - wxT("PNG files (*.png)|*.png|") - wxT("JPEG files (*.jpg)|*.jpg|") - wxT("GIF files (*.gif)|*.gif|") - wxT("TIFF files (*.tif)|*.tif|") - wxT("PCX files (*.pcx)|*.pcx|") - wxT("ICO files (*.ico)|*.ico|") - wxT("CUR files (*.cur)|*.cur"), + wxT("WAV files (*.wav)|*.wav|") + wxT("RAW files (*.raw)|*.raw|") + wxT("SPEEX files (*.spx)|*.spx|") + wxT("FLAC files (*.flc)|*.flc|"), wxFD_SAVE, this); diff --git a/fdmdv2/fdmdv2_main.h b/fdmdv2/fdmdv2_main.h index 28b8f7e0..097914e4 100644 --- a/fdmdv2/fdmdv2_main.h +++ b/fdmdv2/fdmdv2_main.h @@ -10,8 +10,8 @@ #ifndef __FDMDV2_MAIN__ #define __FDMDV2_MAIN__ -#include <wx/wx.h> -#include "wx/image.h" +#include <wx/wx.h> + #include "wx/file.h" #include "wx/filename.h" #include "wx/graphics.h" @@ -23,8 +23,13 @@ #include "wx/versioninfo.h" #include <wx/sound.h> #include <wx/thread.h> +#include "libsndfile/include/sndfile.h" +#include "extern/include/portaudio.h" +#include "paclass.h" +//#include "extern/include/portaudiocpp/PortAudioCpp.hxx" #include "topFrame.h" +#include "codec2.h" #include "dlg_about.h" #include "dlg_audio.h" #include "dlg_options.h" @@ -55,7 +60,7 @@ class MainApp : public wxApp return 0; } - protected: + protected: //void DeleteBitmaps(); //bool LoadImages(); }; @@ -71,11 +76,22 @@ class MainFrame : public TopFrame public: MainFrame(wxWindow *parent); virtual ~MainFrame(); - DrawPanel* m_panelSpectrum; - DrawPanel* m_panelWaterfall; - DrawPanel* m_panelExtra1; - DrawPanel* m_panelExtra2; - bool m_radioRunning; + DrawPanel* m_panelSpectrum; + DrawPanel* m_panelWaterfall; + DrawPanel* m_panelExtra1; + DrawPanel* m_panelExtra2; + bool m_radioRunning; + bool m_SquelchActive; + CODEC2 *m_RXCodec2; + CODEC2 *m_TXCodec2; + PaError err; + PaDeviceIndex inputDevice; + PaDeviceIndex outputDevice; + +// PortAudioWrap stream; +// portaudio::AutoSystem autoSys; +// portaudio::System *sys; // = portaudio::System::instance(); +// StreamParameters void DoStartThread(); void DoPauseThread(); @@ -126,7 +142,7 @@ class MainFrame : public TopFrame void OnTogBtnRxID( wxCommandEvent& event ); void OnTogBtnTxID( wxCommandEvent& event ); void OnTogBtnTXClick( wxCommandEvent& event ); - + void OnTogBtnOnOff( wxCommandEvent& event ); void OnPaint(wxPaintEvent& event); void OnClose( wxCloseEvent& event ); void OnSize( wxSizeEvent& event ); diff --git a/fdmdv2/fdmdv2_wsp.mk b/fdmdv2/fdmdv2_wsp.mk index 359a9f63..b319cb16 100644 --- a/fdmdv2/fdmdv2_wsp.mk +++ b/fdmdv2/fdmdv2_wsp.mk @@ -1,8 +1,8 @@ .PHONY: clean All All: - @echo ----------Building project:[ fdmdv2 - Release ]---------- - @"mingw32-make.exe" -j 2 -f "fdmdv2.mk" + @echo ----------Building project:[ test_sndfile - Debug ]---------- + @cd "libsndfile\Projects\w32-mingw" && "mingw32-make.exe" -j 2 -f "test_sndfile.mk" clean: - @echo ----------Cleaning project:[ fdmdv2 - Release ]---------- - @"mingw32-make.exe" -j 2 -f "fdmdv2.mk" clean + @echo ----------Cleaning project:[ test_sndfile - Debug ]---------- + @cd "libsndfile\Projects\w32-mingw" && "mingw32-make.exe" -j 2 -f "test_sndfile.mk" clean diff --git a/fdmdv2/hamlib-3.0/test_hamlib/test_hamlib.mk b/fdmdv2/hamlib-3.0/test_hamlib/test_hamlib.mk index 3831fe3b..62c1be1e 100644 --- a/fdmdv2/hamlib-3.0/test_hamlib/test_hamlib.mk +++ b/fdmdv2/hamlib-3.0/test_hamlib/test_hamlib.mk @@ -2,10 +2,10 @@ ## Auto Generated makefile by CodeLite IDE ## any manual changes will be erased ## -## Release +## Debug ProjectName :=test_hamlib -ConfigurationName :=Release -IntermediateDirectory :=./Release +ConfigurationName :=Debug +IntermediateDirectory :=./Debug OutDir := $(IntermediateDirectory) WorkspacePath := "C:\Users\wittend\Projects\Radio\fdmdv2" ProjectPath := "C:\Users\wittend\Projects\Radio\fdmdv2\hamlib-3.0\test_hamlib" @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=wittend -Date :=5/13/2012 +Date :=6/12/2012 CodeLitePath :="C:\Program Files\CodeLite" LinkerName :=g++ ArchiveTool :=ar rcus @@ -38,9 +38,9 @@ PreprocessOnlySwitch :=-E ObjectsFileList :="C:\Users\wittend\Projects\Radio\fdmdv2\hamlib-3.0\test_hamlib\test_hamlib.txt" PCHCompileFlags := MakeDirCommand :=makedir -CmpOptions := -O2 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=no) $(Preprocessors) -C_CmpOptions := -O2 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=no) $(Preprocessors) -LinkOptions := -s $(shell wx-config --debug=no --libs --unicode=yes) +CmpOptions := -g -O0 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=yes) $(Preprocessors) +C_CmpOptions := -g -O0 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=yes) $(Preprocessors) +LinkOptions := $(shell wx-config --debug=yes --libs --unicode=yes) IncludePath := $(IncludeSwitch). $(IncludeSwitch)../include/ IncludePCH := RcIncludePath := @@ -71,7 +71,7 @@ $(OutputFile): $(IntermediateDirectory)/.d $(Objects) $(LinkerName) $(OutputSwitch)$(OutputFile) @$(ObjectsFileList) $(LibPath) $(Libs) $(LinkOptions) $(IntermediateDirectory)/.d: - @$(MakeDirCommand) "./Release" + @$(MakeDirCommand) "./Debug" PreBuild: @@ -98,6 +98,6 @@ clean: $(RM) $(IntermediateDirectory)/main$(PreprocessSuffix) $(RM) $(OutputFile) $(RM) $(OutputFile).exe - $(RM) "C:\Users\wittend\Projects\Radio\fdmdv2\.build-release\test_hamlib" + $(RM) "C:\Users\wittend\Projects\Radio\fdmdv2\.build-debug\test_hamlib" diff --git a/fdmdv2/libsndfile/Projects/w32-mingw/test_sndfile.mk b/fdmdv2/libsndfile/Projects/w32-mingw/test_sndfile.mk index 229b530c..042ee3b7 100644 --- a/fdmdv2/libsndfile/Projects/w32-mingw/test_sndfile.mk +++ b/fdmdv2/libsndfile/Projects/w32-mingw/test_sndfile.mk @@ -2,10 +2,10 @@ ## Auto Generated makefile by CodeLite IDE ## any manual changes will be erased ## -## Release +## Debug ProjectName :=test_sndfile -ConfigurationName :=Release -IntermediateDirectory :=./Release +ConfigurationName :=Debug +IntermediateDirectory :=./Debug OutDir := $(IntermediateDirectory) WorkspacePath := "C:\Users\wittend\Projects\Radio\fdmdv2" ProjectPath := "C:\Users\wittend\Projects\Radio\fdmdv2\libsndfile\Projects\w32-mingw" @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=wittend -Date :=5/24/2012 +Date :=6/12/2012 CodeLitePath :="C:\Program Files\CodeLite" LinkerName :=g++ ArchiveTool :=ar rcus @@ -38,8 +38,8 @@ PreprocessOnlySwitch :=-E ObjectsFileList :="C:\Users\wittend\Projects\Radio\fdmdv2\libsndfile\Projects\w32-mingw\test_sndfile.txt" PCHCompileFlags := MakeDirCommand :=makedir -CmpOptions := -O2 -Wall $(Preprocessors) -C_CmpOptions := -O2 -Wall $(Preprocessors) +CmpOptions := -g -O0 -Wall $(Preprocessors) +C_CmpOptions := -g -O0 -Wall $(Preprocessors) LinkOptions := IncludePath := $(IncludeSwitch). $(IncludeSwitch). IncludePCH := @@ -71,7 +71,7 @@ $(OutputFile): $(IntermediateDirectory)/.d $(Objects) $(LinkerName) $(OutputSwitch)$(OutputFile) @$(ObjectsFileList) $(LibPath) $(Libs) $(LinkOptions) $(IntermediateDirectory)/.d: - @$(MakeDirCommand) "./Release" + @$(MakeDirCommand) "./Debug" PreBuild: @@ -98,6 +98,6 @@ clean: $(RM) $(IntermediateDirectory)/main$(PreprocessSuffix) $(RM) $(OutputFile) $(RM) $(OutputFile).exe - $(RM) "C:\Users\wittend\Projects\Radio\fdmdv2\.build-release\test_sndfile" + $(RM) "C:\Users\wittend\Projects\Radio\fdmdv2\.build-debug\test_sndfile" diff --git a/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.mk b/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.mk index 13c340c7..f2c5c878 100644 --- a/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.mk +++ b/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.mk @@ -2,10 +2,10 @@ ## Auto Generated makefile by CodeLite IDE ## any manual changes will be erased ## -## Release +## Debug ProjectName :=pa_cppbinding_test -ConfigurationName :=Release -IntermediateDirectory :=./Release +ConfigurationName :=Debug +IntermediateDirectory :=./Debug OutDir := $(IntermediateDirectory) WorkspacePath := "C:\Users\wittend\Projects\Radio\fdmdv2" ProjectPath := "C:\Users\wittend\Projects\Radio\fdmdv2\pa_cppbinding_test" @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=wittend -Date :=5/29/2012 +Date :=6/12/2012 CodeLitePath :="C:\Program Files\CodeLite" LinkerName :=g++ ArchiveTool :=ar rcus @@ -38,13 +38,13 @@ PreprocessOnlySwitch :=-E ObjectsFileList :="C:\Users\wittend\Projects\Radio\fdmdv2\pa_cppbinding_test\pa_cppbinding_test.txt" PCHCompileFlags := MakeDirCommand :=makedir -CmpOptions := -O2 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=no) $(Preprocessors) -C_CmpOptions := -O2 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=no) $(Preprocessors) -LinkOptions := -mwindows -s $(shell wx-config --debug=no --libs --unicode=yes) -IncludePath := $(IncludeSwitch). $(IncludeSwitch)./ $(IncludeSwitch)C:/bin/MinGW/msys/1.0/local/include $(IncludeSwitch)./portaudiocpp +CmpOptions := -g -O0 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=yes) $(Preprocessors) +C_CmpOptions := -g -O0 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=yes) $(Preprocessors) +LinkOptions := -mwindows $(shell wx-config --debug=yes --libs --unicode=yes) +IncludePath := $(IncludeSwitch). IncludePCH := RcIncludePath := -Libs := $(LibrarySwitch)portaudiocpp-0 $(LibrarySwitch)portaudio-2 +Libs := $(LibrarySwitch)portaudiocpp.la $(LibrarySwitch)portaudio.la LibPath := $(LibraryPathSwitch). $(LibraryPathSwitch). @@ -71,7 +71,7 @@ $(OutputFile): $(IntermediateDirectory)/.d $(Objects) $(LinkerName) $(OutputSwitch)$(OutputFile) @$(ObjectsFileList) $(LibPath) $(Libs) $(LinkOptions) $(IntermediateDirectory)/.d: - @$(MakeDirCommand) "./Release" + @$(MakeDirCommand) "./Debug" PreBuild: @@ -109,6 +109,6 @@ clean: $(RM) $(IntermediateDirectory)/main$(PreprocessSuffix) $(RM) $(OutputFile) $(RM) $(OutputFile).exe - $(RM) "C:\Users\wittend\Projects\Radio\fdmdv2\.build-release\pa_cppbinding_test" + $(RM) "C:\Users\wittend\Projects\Radio\fdmdv2\.build-debug\pa_cppbinding_test" diff --git a/fdmdv2/pa_test/pa_class.cpp b/fdmdv2/pa_test/pa_class.cpp index 694ca7cf..1a815869 100644 --- a/fdmdv2/pa_test/pa_class.cpp +++ b/fdmdv2/pa_test/pa_class.cpp @@ -100,32 +100,32 @@ PaDeviceIndex PortAudioWrap::getDefaultOutputDevice() PaError PortAudioWrap::setInputChannelCount(int count) { - if(!isActive()) - { +// if(!isActive()) +// { inputBuffer.channelCount = count; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } PaError PortAudioWrap::setInputSampleFormat(PaSampleFormat format) { - if(!isActive()) - { +// if(!isActive()) +// { inputBuffer.sampleFormat = format; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } PaError PortAudioWrap::setInputLatency(PaTime latency) { - if(!isActive()) - { +// if(!isActive()) +// { inputBuffer.suggestedLatency = latency; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } void PortAudioWrap::setInputHostApiStreamInfo(void *info) @@ -140,32 +140,32 @@ PaTime PortAudioWrap::getInputDefaultLowLatency() PaError PortAudioWrap::setOutputChannelCount(int count) { - if(!isActive()) - { +// if(!isActive()) +// { outputBuffer.channelCount = count; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } PaError PortAudioWrap::setOutputSampleFormat(PaSampleFormat format) { - if(!isActive()) - { +// if(!isActive()) +// { outputBuffer.sampleFormat = format; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } PaError PortAudioWrap::setOutputLatency(PaTime latency) { - if(!isOpen()) - { +// if(!isOpen()) +// { outputBuffer.suggestedLatency = latency; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } void PortAudioWrap::setOutputHostApiStreamInfo(void *info) @@ -180,62 +180,62 @@ PaTime PortAudioWrap::getOutputDefaultLowLatency() PaError PortAudioWrap::setFramesPerBuffer(unsigned long size) { - if(!isOpen()) - { +// if(!isOpen()) +// { framesPerBuffer = size; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } PaError PortAudioWrap::setSampleRate(unsigned long rate) { - if(!isOpen()) - { +// if(!isOpen()) +// { samplerate = rate; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } PaError PortAudioWrap::setStreamFlags(PaStreamFlags flags) { - if(!isOpen()) - { +// if(!isOpen()) +// { statusFlags = flags; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } PaError PortAudioWrap::setInputDevice(PaDeviceIndex flags) { - if(!isOpen()) - { +// if(!isOpen()) +// { inputDevice = flags; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } PaError PortAudioWrap::setOutputDevice(PaDeviceIndex flags) { - if(!isOpen()) - { +// if(!isOpen()) +// { outputDevice = flags; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } PaError PortAudioWrap::setCallback(PaStreamCallback *callback) { - if(!isOpen()) - { +// if(!isOpen()) +// { streamCallback = callback; return paNoError; - } - return paStreamIsNotStopped; +// } +// return paStreamIsNotStopped; } diff --git a/fdmdv2/pa_test/pa_class.h b/fdmdv2/pa_test/pa_class.h index a1d29597..e565e9dd 100644 --- a/fdmdv2/pa_test/pa_class.h +++ b/fdmdv2/pa_test/pa_class.h @@ -20,18 +20,18 @@ class PortAudioWrap ~PortAudioWrap(); private: - PaStream *stream; - PaStreamParameters inputBuffer; - PaStreamParameters outputBuffer; - void *userData; - int samplerate; - unsigned long framesPerBuffer; - PaStreamCallbackFlags statusFlags; - PaStreamCallback *streamCallback; - PaStreamFinishedCallback *streamFinishedCallback; - const PaStreamCallbackTimeInfo* timeInfo; - PaDeviceIndex inputDevice; - PaDeviceIndex outputDevice; + PaStream *stream; + PaStreamParameters inputBuffer; + PaStreamParameters outputBuffer; + void *userData; + int samplerate; + unsigned long framesPerBuffer; + PaStreamCallbackFlags statusFlags; + PaStreamCallback *streamCallback; + PaStreamFinishedCallback *streamFinishedCallback; + const PaStreamCallbackTimeInfo *timeInfo; + PaDeviceIndex inputDevice; + PaDeviceIndex outputDevice; public: diff --git a/fdmdv2/pa_test/pa_test.mk b/fdmdv2/pa_test/pa_test.mk index 8306337d..9f7391ef 100644 --- a/fdmdv2/pa_test/pa_test.mk +++ b/fdmdv2/pa_test/pa_test.mk @@ -7,13 +7,13 @@ ProjectName :=pa_test ConfigurationName :=Debug IntermediateDirectory :=./Debug OutDir := $(IntermediateDirectory) -WorkspacePath := "C:\Users\wittend\Projects\audio\portaudio_test\paEcho" -ProjectPath := "C:\Users\wittend\Projects\audio\portaudio_test\paEcho\pa_test" +WorkspacePath := "C:\Users\wittend\Projects\Radio\fdmdv2" +ProjectPath := "C:\Users\wittend\Projects\Radio\fdmdv2\pa_test" CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=wittend -Date :=5/15/2012 +Date :=6/12/2012 CodeLitePath :="C:\Program Files\CodeLite" LinkerName :=g++ ArchiveTool :=ar rcus @@ -35,13 +35,13 @@ Preprocessors := ObjectSwitch :=-o ArchiveOutputSwitch := PreprocessOnlySwitch :=-E -ObjectsFileList :="C:\Users\wittend\Projects\audio\portaudio_test\paEcho\pa_test\pa_test.txt" +ObjectsFileList :="C:\Users\wittend\Projects\Radio\fdmdv2\pa_test\pa_test.txt" PCHCompileFlags := MakeDirCommand :=makedir CmpOptions := -g -O0 -Wall $(Preprocessors) C_CmpOptions := -g -O0 -Wall $(Preprocessors) LinkOptions := -IncludePath := $(IncludeSwitch). $(IncludeSwitch). $(IncludeSwitch)../../../portaudio/include +IncludePath := $(IncludeSwitch). $(IncludeSwitch). $(IncludeSwitch)../extern/include $(IncludeSwitch)../../../portaudio/include IncludePCH := RcIncludePath := Libs := $(LibrarySwitch)portaudio @@ -80,12 +80,12 @@ PreBuild: ## Objects ## $(IntermediateDirectory)/pa_class$(ObjectSuffix): pa_class.cpp $(IntermediateDirectory)/pa_class$(DependSuffix) - $(CompilerName) $(IncludePCH) $(SourceSwitch) "C:/Users/wittend/Projects/audio/portaudio_test/paEcho/pa_test/pa_class.cpp" $(CmpOptions) $(ObjectSwitch)$(IntermediateDirectory)/pa_class$(ObjectSuffix) $(IncludePath) + $(CompilerName) $(IncludePCH) $(SourceSwitch) "C:/Users/wittend/Projects/Radio/fdmdv2/pa_test/pa_class.cpp" $(CmpOptions) $(ObjectSwitch)$(IntermediateDirectory)/pa_class$(ObjectSuffix) $(IncludePath) $(IntermediateDirectory)/pa_class$(DependSuffix): pa_class.cpp - @$(CompilerName) $(CmpOptions) $(IncludePCH) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/pa_class$(ObjectSuffix) -MF$(IntermediateDirectory)/pa_class$(DependSuffix) -MM "C:/Users/wittend/Projects/audio/portaudio_test/paEcho/pa_test/pa_class.cpp" + @$(CompilerName) $(CmpOptions) $(IncludePCH) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/pa_class$(ObjectSuffix) -MF$(IntermediateDirectory)/pa_class$(DependSuffix) -MM "C:/Users/wittend/Projects/Radio/fdmdv2/pa_test/pa_class.cpp" $(IntermediateDirectory)/pa_class$(PreprocessSuffix): pa_class.cpp - @$(CompilerName) $(CmpOptions) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/pa_class$(PreprocessSuffix) "C:/Users/wittend/Projects/audio/portaudio_test/paEcho/pa_test/pa_class.cpp" + @$(CompilerName) $(CmpOptions) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/pa_class$(PreprocessSuffix) "C:/Users/wittend/Projects/Radio/fdmdv2/pa_test/pa_class.cpp" -include $(IntermediateDirectory)/*$(DependSuffix) @@ -98,6 +98,6 @@ clean: $(RM) $(IntermediateDirectory)/pa_class$(PreprocessSuffix) $(RM) $(OutputFile) $(RM) $(OutputFile).exe - $(RM) "C:\Users\wittend\Projects\audio\portaudio_test\paEcho\.build-debug\pa_test" + $(RM) "C:\Users\wittend\Projects\Radio\fdmdv2\.build-debug\pa_test" diff --git a/fdmdv2/pa_test/pa_test.project b/fdmdv2/pa_test/pa_test.project index 1774f1d4..3c024018 100644 --- a/fdmdv2/pa_test/pa_test.project +++ b/fdmdv2/pa_test/pa_test.project @@ -13,6 +13,8 @@ <VirtualDirectory Name="include"> <File Name="pa_class.h"/> </VirtualDirectory> + <Dependencies Name="Debug"/> + <Dependencies Name="Release"/> <Settings Type="Executable"> <GlobalSettings> <Compiler Options="" C_Options=""> @@ -26,8 +28,7 @@ <Configuration Name="Debug" CompilerType="gnu g++" DebuggerType="GNU gdb debugger" Type="Executable" BuildCmpWithGlobalSettings="append" BuildLnkWithGlobalSettings="append" BuildResWithGlobalSettings="append"> <Compiler Options="-g;-O0;-Wall" C_Options="-g;-O0;-Wall" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags=""> <IncludePath Value="."/> - <IncludePath Value="."/> - <IncludePath Value="extern/include"/> + <IncludePath Value="../extern/include"/> <IncludePath Value="../../../portaudio/include"/> </Compiler> <Linker Options="" Required="yes"> @@ -58,7 +59,7 @@ <CustomPostBuild/> <CustomPreBuild/> </AdditionalRules> - <Completion> + <Completion EnableCpp11="no"> <ClangCmpFlags/> <ClangPP/> <SearchPaths/> @@ -97,13 +98,11 @@ <CustomPostBuild/> <CustomPreBuild/> </AdditionalRules> - <Completion> + <Completion EnableCpp11="no"> <ClangCmpFlags/> <ClangPP/> <SearchPaths/> </Completion> </Configuration> </Settings> - <Dependencies Name="Debug"/> - <Dependencies Name="Release"/> </CodeLite_Project> diff --git a/fdmdv2/paclass.cpp b/fdmdv2/paclass.cpp new file mode 100644 index 00000000..bac2f6dc --- /dev/null +++ b/fdmdv2/paclass.cpp @@ -0,0 +1,212 @@ +#include "paclass.h" + +PortAudioWrap::PortAudioWrap() +{ + stream = NULL; + userData = NULL; + samplerate = 0; + framesPerBuffer = 0; + statusFlags = 0; + streamCallback = NULL; + streamFinishedCallback = NULL; + timeInfo = 0; +} + +PortAudioWrap::~PortAudioWrap() +{ +} + +PaError PortAudioWrap::init() +{ + return Pa_Initialize(); +} + +PaError PortAudioWrap::streamOpen() +{ + return Pa_OpenStream( + &stream, + &inputBuffer, + &outputBuffer, + samplerate, + framesPerBuffer, + statusFlags, + *streamCallback, + userData + ); +} + +PaError PortAudioWrap::streamStart() +{ + return Pa_StartStream(this->stream); +} + +PaError PortAudioWrap::streamClose() +{ + if(isOpen()) + { + PaError rv = Pa_CloseStream(this->stream); + this->stream = NULL; + return rv; + } + else + { + return paNoError; + } +} + +void PortAudioWrap::terminate() +{ + if(Pa_IsStreamStopped(stream) != paNoError) + { + Pa_StopStream(stream); + } + Pa_Terminate(); +} + +void PortAudioWrap::stop() +{ + Pa_StopStream(stream); +} + +void PortAudioWrap::abort() +{ + Pa_AbortStream(stream); +} + +bool PortAudioWrap::isStopped() const +{ + PaError ret = Pa_IsStreamStopped(stream); + return ret; +} + +bool PortAudioWrap::isActive() const +{ + PaError ret = Pa_IsStreamActive(stream); + return ret; +} + +bool PortAudioWrap::isOpen() const +{ + return (stream != NULL); +} + +PaDeviceIndex PortAudioWrap::getDefaultInputDevice() +{ + return Pa_GetDefaultInputDevice(); +} + +PaDeviceIndex PortAudioWrap::getDefaultOutputDevice() +{ + return Pa_GetDefaultOutputDevice(); +} + +PaError PortAudioWrap::setInputChannelCount(int count) +{ + inputBuffer.channelCount = count; + return paNoError; +} + +PaError PortAudioWrap::getInputChannelCount() +{ + return inputBuffer.channelCount; +} + +PaError PortAudioWrap::setInputSampleFormat(PaSampleFormat format) +{ + inputBuffer.sampleFormat = format; + return paNoError; +} + +PaError PortAudioWrap::setInputLatency(PaTime latency) +{ + inputBuffer.suggestedLatency = latency; + return paNoError; +} + +void PortAudioWrap::setInputHostApiStreamInfo(void *info) +{ + inputBuffer.hostApiSpecificStreamInfo = info; +} + +PaTime PortAudioWrap::getInputDefaultLowLatency() +{ + return Pa_GetDeviceInfo(inputBuffer.device)->defaultLowInputLatency; +} + +PaError PortAudioWrap::setOutputChannelCount(int count) +{ + outputBuffer.channelCount = count; + return paNoError; +} + +int PortAudioWrap::getOutputChannelCount() +{ + return outputBuffer.channelCount; +} + +const char *PortAudioWrap::getDeviceName(PaDeviceIndex dev) +{ + const PaDeviceInfo *info; + info = Pa_GetDeviceInfo(dev); + return info->name; +} + +PaError PortAudioWrap::setOutputSampleFormat(PaSampleFormat format) +{ + outputBuffer.sampleFormat = format; + return paNoError; +} + +PaError PortAudioWrap::setOutputLatency(PaTime latency) +{ + outputBuffer.suggestedLatency = latency; + return paNoError; +} + +void PortAudioWrap::setOutputHostApiStreamInfo(void *info) +{ + outputBuffer.hostApiSpecificStreamInfo = info; +} + +PaTime PortAudioWrap::getOutputDefaultLowLatency() +{ + return Pa_GetDeviceInfo(outputBuffer.device)->defaultLowOutputLatency; +} + +PaError PortAudioWrap::setFramesPerBuffer(unsigned long size) +{ + framesPerBuffer = size; + return paNoError; +} + +PaError PortAudioWrap::setSampleRate(unsigned long rate) +{ + samplerate = rate; + return paNoError; +} + +PaError PortAudioWrap::setStreamFlags(PaStreamFlags flags) +{ + statusFlags = flags; + return paNoError; +} + +PaError PortAudioWrap::setInputDevice(PaDeviceIndex index) +{ +// inputDevice = index; + inputBuffer.device = index; + return paNoError; +} + +PaError PortAudioWrap::setOutputDevice(PaDeviceIndex index) +{ +// outputDevice = index; + outputBuffer.device = index; + return paNoError; +} + +PaError PortAudioWrap::setCallback(PaStreamCallback *callback) +{ + streamCallback = callback; + return paNoError; +} diff --git a/fdmdv2/paclass.h b/fdmdv2/paclass.h new file mode 100644 index 00000000..f7418f83 --- /dev/null +++ b/fdmdv2/paclass.h @@ -0,0 +1,78 @@ +#include <stdio.h> +#include <math.h> +#include "portaudio.h" + +// Note that many of the older ISA sound cards on PCs do NOT support +// full duplex audio (simultaneous record and playback). +// And some only support full duplex at lower sample rates. +#define SAMPLE_RATE (44100) +#define PA_SAMPLE_TYPE paFloat32 //paInt16 +#define FRAMES_PER_BUFFER (64) + +typedef float SAMPLE; + +float CubicAmplifier(float input); + +class PortAudioWrap +{ + public: + PortAudioWrap(); + ~PortAudioWrap(); + + private: + PaStream *stream; + PaStreamParameters inputBuffer; + PaStreamParameters outputBuffer; + void *userData; + int samplerate; + unsigned long framesPerBuffer; + PaStreamCallbackFlags statusFlags; + PaStreamCallback *streamCallback; + PaStreamFinishedCallback *streamFinishedCallback; + const PaStreamCallbackTimeInfo *timeInfo; + PaDeviceIndex inputDevice; + PaDeviceIndex outputDevice; + + public: + + PaError streamOpen(); + + PaDeviceIndex getDefaultInputDevice(); + PaDeviceIndex getDefaultOutputDevice(); + + PaStreamParameters *getDeviceInfo(PaDeviceIndex idx); + PaError setFramesPerBuffer(unsigned long size); + PaError setSampleRate(unsigned long size); + PaError setStreamFlags(PaStreamFlags flags); + PaError setCallback(PaStreamCallback *streamCallback); + PaError setStreamCallback(PaStream *stream, PaStreamCallback* callback ) { streamCallback = callback; return 0;} + PaError setStreamFinishedCallback(PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ); + + PaError setInputDevice(PaDeviceIndex dev); + PaError setInputChannelCount(int count); + int getInputChannelCount(); + PaError setInputSampleFormat(PaSampleFormat format); + PaError setInputSampleRate(PaSampleFormat format); + PaError setInputLatency(PaTime latency); + void setInputHostApiStreamInfo(void *info = NULL); + PaTime getInputDefaultLowLatency(); + const char *getDeviceName(PaDeviceIndex dev); + + PaError setOutputDevice(PaDeviceIndex dev); + PaError setOutputChannelCount(int count); + int getOutputChannelCount(); + PaError setOutputSampleFormat(PaSampleFormat format); + PaError setOutputLatency(PaTime latency); + void setOutputHostApiStreamInfo(void *info = NULL); + PaTime getOutputDefaultLowLatency(); + + PaError init(); + PaError streamStart(); + PaError streamClose(); + void terminate(); + bool isOpen() const; + void stop(); + void abort(); + bool isStopped() const; + bool isActive() const; +}; diff --git a/fdmdv2/thread_audio.cpp b/fdmdv2/thread_audio.cpp index d5c465c3..ff1795e0 100644 --- a/fdmdv2/thread_audio.cpp +++ b/fdmdv2/thread_audio.cpp @@ -1,7 +1,7 @@ //========================================================================== // Name: thread_audio.cpp // -// Purpose: Implements simple wxWidgets application with GUI. +// Purpose: Implements a thread for processing an audio data stream. // Created: May 11, 2012 // Initial author: David Witten // License: BSD License (other licenses may apply to other @@ -38,6 +38,33 @@ static int audioCallback( void *inputBuffer, void *outputBuffer, unsigned long f } return 0; } + +AudioThread::AudioThread() +{ +} + +AudioThread::~AudioThread() +{ +} + +void* AudioThread::Entry() +{ + return NULL; +} +void AudioThread::OnDelete() +{ +} +void AudioThread::OnExit() +{ +} +void AudioThread::OnKill() +{ +} + +// bool Fdmdv2ThreadAudio::TestDestroy() +// { +// } + #ifdef PORTAUDIO_MAIN /* Use a PortAudioStream to process audio data. */ int main(void) diff --git a/fdmdv2/thread_audio.h b/fdmdv2/thread_audio.h index fa2cc4f4..22069572 100644 --- a/fdmdv2/thread_audio.h +++ b/fdmdv2/thread_audio.h @@ -10,6 +10,9 @@ #include <wx/thread.h> #include "fdmdv2_main.h" +#ifndef __THREAD_AUDIO__ +#define __THREAD_AUDIO__ + //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= // Class AudioThread //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= @@ -18,9 +21,187 @@ class AudioThread: public wxThread public: AudioThread(MainFrame *handler) : wxThread(wxTHREAD_DETACHED){ m_pHandler = handler; } ~AudioThread(); + void *Entry(); + void OnDelete(); + void OnExit(); + void OnKill(); + bool TestDestroy(); protected: - virtual ExitCode Entry(); + //ExitCode Entry(); MainFrame *m_pHandler; }; + // declare a new type of event, to be used by our MyThread class: + wxDECLARE_EVENT(wxEVT_COMMAND_MYTHREAD_COMPLETED, wxThreadEvent); + wxDECLARE_EVENT(wxEVT_COMMAND_MYTHREAD_UPDATE, wxThreadEvent); + class MyFrame; + + class MyThread : public wxThread + { + public: + MyThread(MyFrame *handler) + : wxThread(wxTHREAD_DETACHED) + { m_pHandler = handler } + ~MyThread(); + + protected: + virtual ExitCode Entry(); + MyFrame *m_pHandler; + }; + + class MyFrame : public wxFrame + { + public: + ... + ~MyFrame() + { + // it's better to do any thread cleanup in the OnClose() + // event handler, rather than in the destructor. + // This is because the event loop for a top-level window is not + // active anymore when its destructor is called and if the thread + // sends events when ending, they won't be processed unless + // you ended the thread from OnClose. + // See @ref overview_windowdeletion for more info. + } + ... + void DoStartThread(); + void DoPauseThread(); + + // a resume routine would be nearly identic to DoPauseThread() + void DoResumeThread() { ... } + + void OnThreadUpdate(wxThreadEvent&); + void OnThreadCompletion(wxThreadEvent&); + void OnClose(wxCloseEvent&); + + protected: + MyThread *m_pThread; + wxCriticalSection m_pThreadCS; // protects the m_pThread pointer + + wxDECLARE_EVENT_TABLE(); + }; + + wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) + EVT_CLOSE(MyFrame::OnClose) + EVT_MENU(Minimal_Start, MyFrame::DoStartThread) + EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_MYTHREAD_UPDATE, MyFrame::OnThreadUpdate) + EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_MYTHREAD_COMPLETED, MyFrame::OnThreadCompletion) + wxEND_EVENT_TABLE() + + wxDEFINE_EVENT(wxEVT_COMMAND_MYTHREAD_COMPLETED, wxThreadEvent) + wxDEFINE_EVENT(wxEVT_COMMAND_MYTHREAD_UPDATE, wxThreadEvent) + + void MyFrame::DoStartThread() + { + m_pThread = new MyThread(this); + + if ( m_pThread->Create() != wxTHREAD_NO_ERROR ) + { + wxLogError("Can't create the thread!"); + delete m_pThread; + m_pThread = NULL; + } + else + { + if (m_pThread->Run() != wxTHREAD_NO_ERROR ) + { + wxLogError("Can't create the thread!"); + delete m_pThread; + m_pThread = NULL; + } + + // after the call to wxThread::Run(), the m_pThread pointer is "unsafe": + // at any moment the thread may cease to exist (because it completes its work). + // To avoid dangling pointers OnThreadExit() will set m_pThread + // to NULL when the thread dies. + } + } + + wxThread::ExitCode MyThread::Entry() + { + while (!TestDestroy()) + { + // ... do a bit of work... + + wxQueueEvent(m_pHandler, new wxThreadEvent(wxEVT_COMMAND_MYTHREAD_UPDATE)); + } + + // signal the event handler that this thread is going to be destroyed + // NOTE: here we assume that using the m_pHandler pointer is safe, + // (in this case this is assured by the MyFrame destructor) + wxQueueEvent(m_pHandler, new wxThreadEvent(wxEVT_COMMAND_MYTHREAD_COMPLETED)); + + return (wxThread::ExitCode)0; // success + } + + MyThread::~MyThread() + { + wxCriticalSectionLocker enter(m_pHandler->m_pThreadCS); + + // the thread is being destroyed; make sure not to leave dangling pointers around + m_pHandler->m_pThread = NULL; + } + + void MyFrame::OnThreadCompletion(wxThreadEvent&) + { + wxMessageOutputDebug().Printf("MYFRAME: MyThread exited!\n"); + } + + void MyFrame::OnThreadUpdate(wxThreadEvent&) + { + wxMessageOutputDebug().Printf("MYFRAME: MyThread update...\n"); + } + + void MyFrame::DoPauseThread() + { + // anytime we access the m_pThread pointer we must ensure that it won't + // be modified in the meanwhile; since only a single thread may be + // inside a given critical section at a given time, the following code + // is safe: + wxCriticalSectionLocker enter(m_pThreadCS); + + if (m_pThread) // does the thread still exist? + { + // without a critical section, once reached this point it may happen + // that the OS scheduler gives control to the MyThread::Entry() function, + // which in turn may return (because it completes its work) making + // invalid the m_pThread pointer + + if (m_pThread->Pause() != wxTHREAD_NO_ERROR ) + wxLogError("Can't pause the thread!"); + } + } + + void MyFrame::OnClose(wxCloseEvent&) + { + { + wxCriticalSectionLocker enter(m_pThreadCS); + + if (m_pThread) // does the thread still exist? + { + wxMessageOutputDebug().Printf("MYFRAME: deleting thread"); + + if (m_pThread->Delete() != wxTHREAD_NO_ERROR ) + wxLogError("Can't delete the thread!"); + } + } // exit from the critical section to give the thread + // the possibility to enter its destructor + // (which is guarded with m_pThreadCS critical section!) + + while (1) + { + { // was the ~MyThread() function executed? + wxCriticalSectionLocker enter(m_pThreadCS); + if (!m_pThread) break; + } + + // wait for thread completion + wxThread::This()->Sleep(1); + } + + Destroy(); + } + + +#endif // __THREAD_AUDIO__ diff --git a/fdmdv2/topFrame.cpp b/fdmdv2/topFrame.cpp index 30db3808..1f9f2b1c 100644 --- a/fdmdv2/topFrame.cpp +++ b/fdmdv2/topFrame.cpp @@ -94,12 +94,15 @@ TopFrame::TopFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons snrSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("SNR") ), wxVERTICAL ); m_gaugeSNR = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( 15,135 ), wxGA_SMOOTH|wxGA_VERTICAL ); + m_gaugeSNR->SetToolTip( _("Display signal to noise ratio.") ); + snrSizer->Add( m_gaugeSNR, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 10 ); wxBoxSizer* bSizer29; bSizer29 = new wxBoxSizer( wxVERTICAL ); m_textSNR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxPoint( -1,-1 ), wxSize( 35,25 ), wxTE_READONLY ); + m_textSNR->SetToolTip( _("Show S/N ratio numerically.") ); m_textSNR->SetMinSize( wxSize( 35,25 ) ); bSizer29->Add( m_textSNR, 0, wxALIGN_CENTER|wxALL, 1 ); @@ -114,6 +117,8 @@ TopFrame::TopFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons levelSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Level") ), wxVERTICAL ); m_gaugeLevel = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( 15,135 ), wxGA_SMOOTH|wxGA_VERTICAL ); + m_gaugeLevel->SetToolTip( _("Display signal level.") ); + levelSizer->Add( m_gaugeLevel, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 10 ); @@ -129,6 +134,8 @@ TopFrame::TopFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons upperSizer = new wxBoxSizer( wxVERTICAL ); m_auiNbookCtrl = new wxAuiNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_NB_BOTTOM|wxAUI_NB_DEFAULT_STYLE ); + m_auiNbookCtrl->SetFont( wxFont( 6, 70, 90, 90, false, wxEmptyString ) ); + upperSizer->Add( m_auiNbookCtrl, 1, wxALIGN_TOP|wxEXPAND, 1 ); @@ -172,28 +179,43 @@ TopFrame::TopFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("SQ") ), wxVERTICAL ); m_sliderSQ = new wxSlider( this, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxSize( -1,100 ), wxSL_AUTOTICKS|wxSL_INVERSE|wxSL_VERTICAL ); + m_sliderSQ->SetToolTip( _("Set Squelch level.") ); + sbSizer3->Add( m_sliderSQ, 2, wxALIGN_CENTER|wxALL, 1 ); wxBoxSizer* bSizer131; bSizer131 = new wxBoxSizer( wxVERTICAL ); m_ckboxSQ = new wxCheckBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); + m_ckboxSQ->SetToolTip( _("Activate/Deactivate Squelch") ); + bSizer131->Add( m_ckboxSQ, 0, wxALIGN_CENTER|wxALL, 5 ); sbSizer3->Add( bSizer131, 0, wxALIGN_CENTER, 5 ); - rightSizer->Add( sbSizer3, 3, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 3 ); + rightSizer->Add( sbSizer3, 2, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 3 ); wxStaticBoxSizer* sbSizer5; sbSizer5 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Control") ), wxVERTICAL ); + wxBoxSizer* bSizer1511; + bSizer1511 = new wxBoxSizer( wxVERTICAL ); + + m_togBtnOnOff = new wxToggleButton( this, wxID_ANY, _("Start"), wxDefaultPosition, wxDefaultSize, 0 ); + m_togBtnOnOff->SetToolTip( _("Begin receiving data.") ); + + bSizer1511->Add( m_togBtnOnOff, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1 ); + + + sbSizer5->Add( bSizer1511, 0, wxEXPAND, 1 ); + wxBoxSizer* bSizer151; bSizer151 = new wxBoxSizer( wxVERTICAL ); m_togBtnSplit = new wxToggleButton( this, wxID_ANY, _("Split"), wxDefaultPosition, wxDefaultSize, 0 ); - m_togBtnSplit->SetToolTip( _("Toggle Split mode.") ); + m_togBtnSplit->SetToolTip( _("Toggle split frequency mode.") ); bSizer151->Add( m_togBtnSplit, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1 ); @@ -215,7 +237,7 @@ TopFrame::TopFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons bSizer14 = new wxBoxSizer( wxVERTICAL ); m_togBtnALC = new wxToggleButton( this, wxID_ANY, _("ALC"), wxDefaultPosition, wxDefaultSize, 0 ); - m_togBtnALC->SetToolTip( _("Toggle ALC Mode.") ); + m_togBtnALC->SetToolTip( _("Toggle automatic level control mode.") ); bSizer14->Add( m_togBtnALC, 0, wxALL, 1 ); @@ -226,6 +248,8 @@ TopFrame::TopFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons bSizer11 = new wxBoxSizer( wxVERTICAL ); m_btnTogTX = new wxToggleButton( this, wxID_ANY, _("TX"), wxDefaultPosition, wxDefaultSize, 0 ); + m_btnTogTX->SetToolTip( _("Switch between Receive and Transmit") ); + bSizer11->Add( m_btnTogTX, 1, wxALIGN_CENTER|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1 ); @@ -284,6 +308,7 @@ TopFrame::TopFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons m_sliderSQ->Connect( wxEVT_SCROLL_CHANGED, wxScrollEventHandler( TopFrame::OnCmdSliderScrollChanged ), NULL, this ); m_sliderSQ->Connect( wxEVT_SCROLL_TOP, wxScrollEventHandler( TopFrame::OnSliderScrollTop ), NULL, this ); m_ckboxSQ->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( TopFrame::OnCheckSQClick ), NULL, this ); + m_togBtnOnOff->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( TopFrame::OnTogBtnOnOff ), NULL, this ); m_togBtnSplit->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( TopFrame::OnTogBtnSplitClick ), NULL, this ); m_togBtnAnalog->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( TopFrame::OnTogBtnAnalogClick ), NULL, this ); m_togBtnALC->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( TopFrame::OnTogBtnALCClick ), NULL, this ); @@ -334,6 +359,7 @@ TopFrame::~TopFrame() m_sliderSQ->Disconnect( wxEVT_SCROLL_CHANGED, wxScrollEventHandler( TopFrame::OnCmdSliderScrollChanged ), NULL, this ); m_sliderSQ->Disconnect( wxEVT_SCROLL_TOP, wxScrollEventHandler( TopFrame::OnSliderScrollTop ), NULL, this ); m_ckboxSQ->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( TopFrame::OnCheckSQClick ), NULL, this ); + m_togBtnOnOff->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( TopFrame::OnTogBtnOnOff ), NULL, this ); m_togBtnSplit->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( TopFrame::OnTogBtnSplitClick ), NULL, this ); m_togBtnAnalog->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( TopFrame::OnTogBtnAnalogClick ), NULL, this ); m_togBtnALC->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( TopFrame::OnTogBtnALCClick ), NULL, this ); @@ -429,60 +455,92 @@ DlgAudio::DlgAudio( wxWindow* parent, wxWindowID id, const wxString& title, cons bSizer34 = new wxBoxSizer( wxVERTICAL ); wxStaticBoxSizer* sbSizer10; - sbSizer10 = new wxStaticBoxSizer( new wxStaticBox( m_panelDevices, wxID_ANY, _("PortAudio") ), wxVERTICAL ); + sbSizer10 = new wxStaticBoxSizer( new wxStaticBox( m_panelDevices, wxID_ANY, _("PortAudio") ), wxHORIZONTAL ); wxBoxSizer* bSizer41; bSizer41 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer37; - bSizer37 = new wxBoxSizer( wxVERTICAL ); + wxGridSizer* gSizer6; + gSizer6 = new wxGridSizer( 3, 1, 0, 0 ); + gSizer6->SetMinSize( wxSize( 115,-1 ) ); m_radioBtnPortAudio = new wxRadioButton( m_panelDevices, wxID_ANY, _("PortAudio"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); m_radioBtnPortAudio->SetValue( true ); - bSizer37->Add( m_radioBtnPortAudio, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + gSizer6->Add( m_radioBtnPortAudio, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxGridSizer* gSizer51; + gSizer51 = new wxGridSizer( 2, 2, 0, 0 ); + + gSizer51->SetMinSize( wxSize( 110,-1 ) ); + m_staticText151 = new wxStaticText( m_panelDevices, wxID_ANY, _("# Ch Out:"), wxDefaultPosition, wxSize( 80,-1 ), wxALIGN_RIGHT ); + m_staticText151->Wrap( -1 ); + m_staticText151->SetFont( wxFont( 7, 70, 90, 90, false, wxEmptyString ) ); + m_staticText151->SetMinSize( wxSize( 80,-1 ) ); + m_staticText151->SetMaxSize( wxSize( 80,-1 ) ); + + gSizer51->Add( m_staticText151, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL|wxEXPAND, 5 ); + + m_textNumChOut = new wxTextCtrl( m_panelDevices, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 30,-1 ), wxTE_READONLY ); + m_textNumChOut->SetFont( wxFont( 7, 70, 90, 90, false, wxEmptyString ) ); + m_textNumChOut->SetMinSize( wxSize( 30,-1 ) ); + m_textNumChOut->SetMaxSize( wxSize( 30,-1 ) ); + + gSizer51->Add( m_textNumChOut, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL, 5 ); + m_staticText141 = new wxStaticText( m_panelDevices, wxID_ANY, _("# Ch In:"), wxDefaultPosition, wxSize( 80,-1 ), wxALIGN_RIGHT ); + m_staticText141->Wrap( -1 ); + m_staticText141->SetFont( wxFont( 7, 70, 90, 90, false, wxEmptyString ) ); + m_staticText141->SetMinSize( wxSize( 80,-1 ) ); + m_staticText141->SetMaxSize( wxSize( 90,-1 ) ); - bSizer41->Add( bSizer37, 0, wxEXPAND, 5 ); + gSizer51->Add( m_staticText141, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL|wxEXPAND, 5 ); + + m_textNumChIn = new wxTextCtrl( m_panelDevices, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 30,-1 ), wxTE_READONLY ); + m_textNumChIn->SetFont( wxFont( 7, 70, 90, 90, false, wxEmptyString ) ); + m_textNumChIn->SetMinSize( wxSize( 30,-1 ) ); + m_textNumChIn->SetMaxSize( wxSize( 30,-1 ) ); + + gSizer51->Add( m_textNumChIn, 0, wxALL, 4 ); + + + gSizer6->Add( gSizer51, 0, wxEXPAND, 5 ); + + + bSizer41->Add( gSizer6, 0, wxALL, 5 ); wxGridSizer* gSizer7; - gSizer7 = new wxGridSizer( 4, 1, 0, 0 ); + gSizer7 = new wxGridSizer( 4, 2, 0, 0 ); - m_staticText14 = new wxStaticText( m_panelDevices, wxID_ANY, _("Audio in (mic) -> codec:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); + m_staticText14 = new wxStaticText( m_panelDevices, wxID_ANY, _("Audio in (mic) -> codec:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); m_staticText14->Wrap( -1 ); gSizer7->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); - m_staticText15 = new wxStaticText( m_panelDevices, wxID_ANY, _("codec -> Radio Tx: "), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); + m_comboAudioCodec = new wxComboBox( m_panelDevices, wxID_ANY, _("<default>"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + gSizer7->Add( m_comboAudioCodec, 1, wxALL, 5 ); + + m_staticText15 = new wxStaticText( m_panelDevices, wxID_ANY, _("codec -> Radio Tx:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); m_staticText15->Wrap( -1 ); gSizer7->Add( m_staticText15, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); - m_staticText16 = new wxStaticText( m_panelDevices, wxID_ANY, _("Radio Rx -> codec:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); - m_staticText16->Wrap( -1 ); - gSizer7->Add( m_staticText16, 0, wxALIGN_RIGHT|wxALL, 5 ); + m_comboCodecTx = new wxComboBox( m_panelDevices, wxID_ANY, _("<default>"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + gSizer7->Add( m_comboCodecTx, 1, wxALL, 5 ); - m_staticText17 = new wxStaticText( m_panelDevices, wxID_ANY, _("codec -> Audio out (spkr):"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); - m_staticText17->Wrap( -1 ); - gSizer7->Add( m_staticText17, 0, wxALIGN_RIGHT|wxALL, 5 ); - - - bSizer41->Add( gSizer7, 1, wxEXPAND, 5 ); - - wxGridSizer* gSizer5; - gSizer5 = new wxGridSizer( 4, 1, 0, 0 ); - - m_comboBox1 = new wxComboBox( m_panelDevices, wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - gSizer5->Add( m_comboBox1, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); + m_staticText16 = new wxStaticText( m_panelDevices, wxID_ANY, _("Radio Rx -> codec:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); + m_staticText16->Wrap( -1 ); + gSizer7->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); - m_comboBox2 = new wxComboBox( m_panelDevices, wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - gSizer5->Add( m_comboBox2, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); + m_comboRadioRx = new wxComboBox( m_panelDevices, wxID_ANY, _("<default>"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + gSizer7->Add( m_comboRadioRx, 1, wxALL, 5 ); - m_comboBox11 = new wxComboBox( m_panelDevices, wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - gSizer5->Add( m_comboBox11, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); + m_staticText17 = new wxStaticText( m_panelDevices, wxID_ANY, _("codec -> Audio out (spkr):"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); + m_staticText17->Wrap( -1 ); + gSizer7->Add( m_staticText17, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); - m_comboBox12 = new wxComboBox( m_panelDevices, wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - gSizer5->Add( m_comboBox12, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); + m_comboCodecSpkr = new wxComboBox( m_panelDevices, wxID_ANY, _("<default>"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + gSizer7->Add( m_comboCodecSpkr, 0, wxALL, 5 ); - bSizer41->Add( gSizer5, 1, wxEXPAND, 5 ); + bSizer41->Add( gSizer7, 0, wxALL|wxEXPAND, 5 ); sbSizer10->Add( bSizer41, 1, wxEXPAND, 5 ); @@ -496,7 +554,7 @@ DlgAudio::DlgAudio( wxWindow* parent, wxWindowID id, const wxString& title, cons wxBoxSizer* bSizer38; bSizer38 = new wxBoxSizer( wxVERTICAL ); - m_radioBtnFileOnly = new wxRadioButton( m_panelDevices, wxID_ANY, _("File Only"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); + m_radioBtnFileOnly = new wxRadioButton( m_panelDevices, wxID_ANY, _("File Only"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer38->Add( m_radioBtnFileOnly, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); diff --git a/fdmdv2/topFrame.h b/fdmdv2/topFrame.h index 28e05a19..1c96167f 100644 --- a/fdmdv2/topFrame.h +++ b/fdmdv2/topFrame.h @@ -74,6 +74,7 @@ class TopFrame : public wxFrame wxToggleButton* m_togTxID; wxSlider* m_sliderSQ; wxCheckBox* m_ckboxSQ; + wxToggleButton* m_togBtnOnOff; wxToggleButton* m_togBtnSplit; wxToggleButton* m_togBtnAnalog; wxToggleButton* m_togBtnALC; @@ -114,6 +115,7 @@ class TopFrame : public wxFrame virtual void OnCmdSliderScrollChanged( wxScrollEvent& event ) { event.Skip(); } virtual void OnSliderScrollTop( wxScrollEvent& event ) { event.Skip(); } virtual void OnCheckSQClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnTogBtnOnOff( wxCommandEvent& event ) { event.Skip(); } virtual void OnTogBtnSplitClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnTogBtnAnalogClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnTogBtnALCClick( wxCommandEvent& event ) { event.Skip(); } @@ -123,7 +125,7 @@ class TopFrame : public wxFrame public: wxAuiNotebook* m_auiNbookCtrl; - TopFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FDMDV2"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 732,507 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL ); + TopFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FDMDV2"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 761,500 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL ); ~TopFrame(); @@ -165,14 +167,18 @@ class DlgAudio : public wxDialog wxNotebook* m_nbAudioOptions; wxPanel* m_panelDevices; wxRadioButton* m_radioBtnPortAudio; + wxStaticText* m_staticText151; + wxTextCtrl* m_textNumChOut; + wxStaticText* m_staticText141; + wxTextCtrl* m_textNumChIn; wxStaticText* m_staticText14; + wxComboBox* m_comboAudioCodec; wxStaticText* m_staticText15; + wxComboBox* m_comboCodecTx; wxStaticText* m_staticText16; + wxComboBox* m_comboRadioRx; wxStaticText* m_staticText17; - wxComboBox* m_comboBox1; - wxComboBox* m_comboBox2; - wxComboBox* m_comboBox11; - wxComboBox* m_comboBox12; + wxComboBox* m_comboCodecSpkr; wxRadioButton* m_radioBtnFileOnly; wxPanel* m_panelSettings; wxListBox* m_lbRxInput; @@ -203,7 +209,7 @@ class DlgAudio : public wxDialog public: - DlgAudio( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Audio Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 553,381 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + DlgAudio( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Audio Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 555,419 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); ~DlgAudio(); }; diff --git a/fdmdv2/topFrame.py b/fdmdv2/topFrame.py index 658ef40d..854c6421 100644 --- a/fdmdv2/topFrame.py +++ b/fdmdv2/topFrame.py @@ -31,7 +31,7 @@ ID_ABOUT = 1008 class TopFrame ( wx.Frame ): def __init__( self, parent ): - wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = _(u"FDMDV2"), pos = wx.DefaultPosition, size = wx.Size( 732,507 ), style = wx.DEFAULT_FRAME_STYLE|wx.RESIZE_BORDER|wx.TAB_TRAVERSAL ) + wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = _(u"FDMDV2"), pos = wx.DefaultPosition, size = wx.Size( 761,500 ), style = wx.DEFAULT_FRAME_STYLE|wx.RESIZE_BORDER|wx.TAB_TRAVERSAL ) self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) self.SetForegroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOWTEXT ) ) @@ -101,11 +101,14 @@ class TopFrame ( wx.Frame ): snrSizer = wx.StaticBoxSizer( wx.StaticBox( self, wx.ID_ANY, _(u"SNR") ), wx.VERTICAL ) self.m_gaugeSNR = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.Size( 15,135 ), wx.GA_SMOOTH|wx.GA_VERTICAL ) + self.m_gaugeSNR.SetToolTipString( _(u"Display signal to noise ratio.") ) + snrSizer.Add( self.m_gaugeSNR, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 10 ) bSizer29 = wx.BoxSizer( wx.VERTICAL ) self.m_textSNR = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.Point( -1,-1 ), wx.Size( 35,25 ), wx.TE_READONLY ) + self.m_textSNR.SetToolTipString( _(u"Show S/N ratio numerically.") ) self.m_textSNR.SetMinSize( wx.Size( 35,25 ) ) bSizer29.Add( self.m_textSNR, 0, wx.ALIGN_CENTER|wx.ALL, 1 ) @@ -119,6 +122,8 @@ class TopFrame ( wx.Frame ): levelSizer = wx.StaticBoxSizer( wx.StaticBox( self, wx.ID_ANY, _(u"Level") ), wx.VERTICAL ) self.m_gaugeLevel = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.Size( 15,135 ), wx.GA_SMOOTH|wx.GA_VERTICAL ) + self.m_gaugeLevel.SetToolTipString( _(u"Display signal level.") ) + levelSizer.Add( self.m_gaugeLevel, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 10 ) @@ -132,6 +137,8 @@ class TopFrame ( wx.Frame ): upperSizer = wx.BoxSizer( wx.VERTICAL ) self.m_auiNbookCtrl = wx.aui.AuiNotebook( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.aui.AUI_NB_BOTTOM|wx.aui.AUI_NB_DEFAULT_STYLE ) + self.m_auiNbookCtrl.SetFont( wx.Font( 6, 70, 90, 90, False, wx.EmptyString ) ) + upperSizer.Add( self.m_auiNbookCtrl, 1, wx.ALIGN_TOP|wx.EXPAND, 1 ) @@ -170,25 +177,39 @@ class TopFrame ( wx.Frame ): sbSizer3 = wx.StaticBoxSizer( wx.StaticBox( self, wx.ID_ANY, _(u"SQ") ), wx.VERTICAL ) self.m_sliderSQ = wx.Slider( self, wx.ID_ANY, 50, 0, 100, wx.DefaultPosition, wx.Size( -1,100 ), wx.SL_AUTOTICKS|wx.SL_INVERSE|wx.SL_VERTICAL ) + self.m_sliderSQ.SetToolTipString( _(u"Set Squelch level.") ) + sbSizer3.Add( self.m_sliderSQ, 2, wx.ALIGN_CENTER|wx.ALL, 1 ) bSizer131 = wx.BoxSizer( wx.VERTICAL ) self.m_ckboxSQ = wx.CheckBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.CHK_2STATE ) + self.m_ckboxSQ.SetToolTipString( _(u"Activate/Deactivate Squelch") ) + bSizer131.Add( self.m_ckboxSQ, 0, wx.ALIGN_CENTER|wx.ALL, 5 ) sbSizer3.Add( bSizer131, 0, wx.ALIGN_CENTER, 5 ) - rightSizer.Add( sbSizer3, 3, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL|wx.EXPAND, 3 ) + rightSizer.Add( sbSizer3, 2, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL|wx.EXPAND, 3 ) sbSizer5 = wx.StaticBoxSizer( wx.StaticBox( self, wx.ID_ANY, _(u"Control") ), wx.VERTICAL ) + bSizer1511 = wx.BoxSizer( wx.VERTICAL ) + + self.m_togBtnOnOff = wx.ToggleButton( self, wx.ID_ANY, _(u"Start"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_togBtnOnOff.SetToolTipString( _(u"Begin receiving data.") ) + + bSizer1511.Add( self.m_togBtnOnOff, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) + + + sbSizer5.Add( bSizer1511, 0, wx.EXPAND, 1 ) + bSizer151 = wx.BoxSizer( wx.VERTICAL ) self.m_togBtnSplit = wx.ToggleButton( self, wx.ID_ANY, _(u"Split"), wx.DefaultPosition, wx.DefaultSize, 0 ) - self.m_togBtnSplit.SetToolTipString( _(u"Toggle Split mode.") ) + self.m_togBtnSplit.SetToolTipString( _(u"Toggle split frequency mode.") ) bSizer151.Add( self.m_togBtnSplit, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) @@ -208,7 +229,7 @@ class TopFrame ( wx.Frame ): bSizer14 = wx.BoxSizer( wx.VERTICAL ) self.m_togBtnALC = wx.ToggleButton( self, wx.ID_ANY, _(u"ALC"), wx.DefaultPosition, wx.DefaultSize, 0 ) - self.m_togBtnALC.SetToolTipString( _(u"Toggle ALC Mode.") ) + self.m_togBtnALC.SetToolTipString( _(u"Toggle automatic level control mode.") ) bSizer14.Add( self.m_togBtnALC, 0, wx.ALL, 1 ) @@ -218,6 +239,8 @@ class TopFrame ( wx.Frame ): bSizer11 = wx.BoxSizer( wx.VERTICAL ) self.m_btnTogTX = wx.ToggleButton( self, wx.ID_ANY, _(u"TX"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_btnTogTX.SetToolTipString( _(u"Switch between Receive and Transmit") ) + bSizer11.Add( self.m_btnTogTX, 1, wx.ALIGN_CENTER|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) @@ -268,6 +291,7 @@ class TopFrame ( wx.Frame ): self.m_sliderSQ.Bind( wx.EVT_SCROLL_CHANGED, self.OnCmdSliderScrollChanged ) self.m_sliderSQ.Bind( wx.EVT_SCROLL_TOP, self.OnSliderScrollTop ) self.m_ckboxSQ.Bind( wx.EVT_CHECKBOX, self.OnCheckSQClick ) + self.m_togBtnOnOff.Bind( wx.EVT_TOGGLEBUTTON, self.OnTogBtnOnOff ) self.m_togBtnSplit.Bind( wx.EVT_TOGGLEBUTTON, self.OnTogBtnSplitClick ) self.m_togBtnAnalog.Bind( wx.EVT_TOGGLEBUTTON, self.OnTogBtnAnalogClick ) self.m_togBtnALC.Bind( wx.EVT_TOGGLEBUTTON, self.OnTogBtnALCClick ) @@ -377,6 +401,9 @@ class TopFrame ( wx.Frame ): def OnCheckSQClick( self, event ): event.Skip() + def OnTogBtnOnOff( self, event ): + event.Skip() + def OnTogBtnSplitClick( self, event ): event.Skip() @@ -475,7 +502,7 @@ class DlgAbout ( wx.Dialog ): class DlgAudio ( wx.Dialog ): def __init__( self, parent ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = _(u"Audio Options"), pos = wx.DefaultPosition, size = wx.Size( 553,381 ), style = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER ) + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = _(u"Audio Options"), pos = wx.DefaultPosition, size = wx.Size( 555,419 ), style = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER ) self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) @@ -485,60 +512,92 @@ class DlgAudio ( wx.Dialog ): self.m_panelDevices = wx.Panel( self.m_nbAudioOptions, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL ) bSizer34 = wx.BoxSizer( wx.VERTICAL ) - sbSizer10 = wx.StaticBoxSizer( wx.StaticBox( self.m_panelDevices, wx.ID_ANY, _(u"PortAudio") ), wx.VERTICAL ) + sbSizer10 = wx.StaticBoxSizer( wx.StaticBox( self.m_panelDevices, wx.ID_ANY, _(u"PortAudio") ), wx.HORIZONTAL ) bSizer41 = wx.BoxSizer( wx.HORIZONTAL ) - bSizer37 = wx.BoxSizer( wx.VERTICAL ) + gSizer6 = wx.GridSizer( 3, 1, 0, 0 ) + gSizer6.SetMinSize( wx.Size( 115,-1 ) ) self.m_radioBtnPortAudio = wx.RadioButton( self.m_panelDevices, wx.ID_ANY, _(u"PortAudio"), wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) self.m_radioBtnPortAudio.SetValue( True ) - bSizer37.Add( self.m_radioBtnPortAudio, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + gSizer6.Add( self.m_radioBtnPortAudio, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + gSizer51 = wx.GridSizer( 2, 2, 0, 0 ) - bSizer41.Add( bSizer37, 0, wx.EXPAND, 5 ) + gSizer51.SetMinSize( wx.Size( 110,-1 ) ) + self.m_staticText151 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"# Ch Out:"), wx.DefaultPosition, wx.Size( 80,-1 ), wx.ALIGN_RIGHT ) + self.m_staticText151.Wrap( -1 ) + self.m_staticText151.SetFont( wx.Font( 7, 70, 90, 90, False, wx.EmptyString ) ) + self.m_staticText151.SetMinSize( wx.Size( 80,-1 ) ) + self.m_staticText151.SetMaxSize( wx.Size( 80,-1 ) ) - gSizer7 = wx.GridSizer( 4, 1, 0, 0 ) + gSizer51.Add( self.m_staticText151, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL|wx.EXPAND, 5 ) - self.m_staticText14 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"Audio in (mic) -> codec:"), wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT ) - self.m_staticText14.Wrap( -1 ) - gSizer7.Add( self.m_staticText14, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 ) + self.m_textNumChOut = wx.TextCtrl( self.m_panelDevices, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 30,-1 ), wx.TE_READONLY ) + self.m_textNumChOut.SetFont( wx.Font( 7, 70, 90, 90, False, wx.EmptyString ) ) + self.m_textNumChOut.SetMinSize( wx.Size( 30,-1 ) ) + self.m_textNumChOut.SetMaxSize( wx.Size( 30,-1 ) ) - self.m_staticText15 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"codec -> Radio Tx: "), wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT ) - self.m_staticText15.Wrap( -1 ) - gSizer7.Add( self.m_staticText15, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 ) + gSizer51.Add( self.m_textNumChOut, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.ALL, 5 ) - self.m_staticText16 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"Radio Rx -> codec:"), wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT ) - self.m_staticText16.Wrap( -1 ) - gSizer7.Add( self.m_staticText16, 0, wx.ALIGN_RIGHT|wx.ALL, 5 ) + self.m_staticText141 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"# Ch In:"), wx.DefaultPosition, wx.Size( 80,-1 ), wx.ALIGN_RIGHT ) + self.m_staticText141.Wrap( -1 ) + self.m_staticText141.SetFont( wx.Font( 7, 70, 90, 90, False, wx.EmptyString ) ) + self.m_staticText141.SetMinSize( wx.Size( 80,-1 ) ) + self.m_staticText141.SetMaxSize( wx.Size( 90,-1 ) ) - self.m_staticText17 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"codec -> Audio out (spkr):"), wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT ) - self.m_staticText17.Wrap( -1 ) - gSizer7.Add( self.m_staticText17, 0, wx.ALIGN_RIGHT|wx.ALL, 5 ) + gSizer51.Add( self.m_staticText141, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL|wx.EXPAND, 5 ) + + self.m_textNumChIn = wx.TextCtrl( self.m_panelDevices, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 30,-1 ), wx.TE_READONLY ) + self.m_textNumChIn.SetFont( wx.Font( 7, 70, 90, 90, False, wx.EmptyString ) ) + self.m_textNumChIn.SetMinSize( wx.Size( 30,-1 ) ) + self.m_textNumChIn.SetMaxSize( wx.Size( 30,-1 ) ) + + gSizer51.Add( self.m_textNumChIn, 0, wx.ALL, 4 ) + + + gSizer6.Add( gSizer51, 0, wx.EXPAND, 5 ) + + + bSizer41.Add( gSizer6, 0, wx.ALL, 5 ) + gSizer7 = wx.GridSizer( 4, 2, 0, 0 ) - bSizer41.Add( gSizer7, 1, wx.EXPAND, 5 ) + self.m_staticText14 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"Audio in (mic) -> codec:"), wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT|wx.ST_NO_AUTORESIZE ) + self.m_staticText14.Wrap( -1 ) + gSizer7.Add( self.m_staticText14, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 ) + + m_comboAudioCodecChoices = [] + self.m_comboAudioCodec = wx.ComboBox( self.m_panelDevices, wx.ID_ANY, _(u"<default>"), wx.DefaultPosition, wx.DefaultSize, m_comboAudioCodecChoices, 0 ) + gSizer7.Add( self.m_comboAudioCodec, 1, wx.ALL, 5 ) + + self.m_staticText15 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"codec -> Radio Tx:"), wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT|wx.ST_NO_AUTORESIZE ) + self.m_staticText15.Wrap( -1 ) + gSizer7.Add( self.m_staticText15, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 ) - gSizer5 = wx.GridSizer( 4, 1, 0, 0 ) + m_comboCodecTxChoices = [] + self.m_comboCodecTx = wx.ComboBox( self.m_panelDevices, wx.ID_ANY, _(u"<default>"), wx.DefaultPosition, wx.DefaultSize, m_comboCodecTxChoices, 0 ) + gSizer7.Add( self.m_comboCodecTx, 1, wx.ALL, 5 ) - m_comboBox1Choices = [] - self.m_comboBox1 = wx.ComboBox( self.m_panelDevices, wx.ID_ANY, _(u"Combo!"), wx.DefaultPosition, wx.DefaultSize, m_comboBox1Choices, 0 ) - gSizer5.Add( self.m_comboBox1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND, 5 ) + self.m_staticText16 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"Radio Rx -> codec:"), wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT|wx.ST_NO_AUTORESIZE ) + self.m_staticText16.Wrap( -1 ) + gSizer7.Add( self.m_staticText16, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 ) - m_comboBox2Choices = [] - self.m_comboBox2 = wx.ComboBox( self.m_panelDevices, wx.ID_ANY, _(u"Combo!"), wx.DefaultPosition, wx.DefaultSize, m_comboBox2Choices, 0 ) - gSizer5.Add( self.m_comboBox2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND, 5 ) + m_comboRadioRxChoices = [] + self.m_comboRadioRx = wx.ComboBox( self.m_panelDevices, wx.ID_ANY, _(u"<default>"), wx.DefaultPosition, wx.DefaultSize, m_comboRadioRxChoices, 0 ) + gSizer7.Add( self.m_comboRadioRx, 1, wx.ALL, 5 ) - m_comboBox11Choices = [] - self.m_comboBox11 = wx.ComboBox( self.m_panelDevices, wx.ID_ANY, _(u"Combo!"), wx.DefaultPosition, wx.DefaultSize, m_comboBox11Choices, 0 ) - gSizer5.Add( self.m_comboBox11, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND, 5 ) + self.m_staticText17 = wx.StaticText( self.m_panelDevices, wx.ID_ANY, _(u"codec -> Audio out (spkr):"), wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT|wx.ST_NO_AUTORESIZE ) + self.m_staticText17.Wrap( -1 ) + gSizer7.Add( self.m_staticText17, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 ) - m_comboBox12Choices = [] - self.m_comboBox12 = wx.ComboBox( self.m_panelDevices, wx.ID_ANY, _(u"Combo!"), wx.DefaultPosition, wx.DefaultSize, m_comboBox12Choices, 0 ) - gSizer5.Add( self.m_comboBox12, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND, 5 ) + m_comboCodecSpkrChoices = [] + self.m_comboCodecSpkr = wx.ComboBox( self.m_panelDevices, wx.ID_ANY, _(u"<default>"), wx.DefaultPosition, wx.DefaultSize, m_comboCodecSpkrChoices, 0 ) + gSizer7.Add( self.m_comboCodecSpkr, 0, wx.ALL, 5 ) - bSizer41.Add( gSizer5, 1, wx.EXPAND, 5 ) + bSizer41.Add( gSizer7, 0, wx.ALL|wx.EXPAND, 5 ) sbSizer10.Add( bSizer41, 1, wx.EXPAND, 5 ) @@ -550,7 +609,7 @@ class DlgAudio ( wx.Dialog ): bSizer38 = wx.BoxSizer( wx.VERTICAL ) - self.m_radioBtnFileOnly = wx.RadioButton( self.m_panelDevices, wx.ID_ANY, _(u"File Only"), wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) + self.m_radioBtnFileOnly = wx.RadioButton( self.m_panelDevices, wx.ID_ANY, _(u"File Only"), wx.DefaultPosition, wx.DefaultSize, 0 ) bSizer38.Add( self.m_radioBtnFileOnly, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) diff --git a/fdmdv2/topFrame.xrc b/fdmdv2/topFrame.xrc index 5702aa2a..f0bb74c0 100644 --- a/fdmdv2/topFrame.xrc +++ b/fdmdv2/topFrame.xrc @@ -2,7 +2,7 @@ <resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1"> <object class="wxFrame" name="TopFrame"> <style>wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL</style> - <size>732,507</size> + <size>761,500</size> <bg>#e3e3e3</bg> <fg>#000000</fg> <title>FDMDV2</title> @@ -97,6 +97,7 @@ <object class="wxGauge" name="m_gaugeSNR"> <style>wxGA_SMOOTH|wxGA_VERTICAL</style> <size>15,135</size> + <tooltip>Display signal to noise ratio.</tooltip> <range>100</range> <value>0</value> </object> @@ -115,6 +116,7 @@ <style>wxTE_READONLY</style> <pos>-1,-1</pos> <size>35,25</size> + <tooltip>Show S/N ratio numerically.</tooltip> <value></value> <maxlength>0</maxlength> </object> @@ -137,6 +139,7 @@ <object class="wxGauge" name="m_gaugeLevel"> <style>wxGA_SMOOTH|wxGA_VERTICAL</style> <size>15,135</size> + <tooltip>Display signal level.</tooltip> <range>100</range> <value>0</value> </object> @@ -225,7 +228,7 @@ <object class="wxBoxSizer"> <orient>wxVERTICAL</orient> <object class="sizeritem"> - <option>3</option> + <option>2</option> <flag>wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND</flag> <border>3</border> <object class="wxStaticBoxSizer"> @@ -238,6 +241,7 @@ <object class="wxSlider" name="m_sliderSQ"> <style>wxSL_AUTOTICKS|wxSL_INVERSE|wxSL_VERTICAL</style> <size>-1,100</size> + <tooltip>Set Squelch level.</tooltip> <value>50</value> <min>0</min> <max>100</max> @@ -255,6 +259,7 @@ <border>5</border> <object class="wxCheckBox" name="m_ckboxSQ"> <style>wxCHK_2STATE</style> + <tooltip>Activate/Deactivate Squelch</tooltip> <label></label> <checked>0</checked> </object> @@ -270,6 +275,24 @@ <object class="wxStaticBoxSizer"> <orient>wxVERTICAL</orient> <label>Control</label> + <object class="sizeritem"> + <option>0</option> + <flag>wxEXPAND</flag> + <border>1</border> + <object class="wxBoxSizer"> + <orient>wxVERTICAL</orient> + <object class="sizeritem"> + <option>0</option> + <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL</flag> + <border>1</border> + <object class="wxToggleButton" name="m_togBtnOnOff"> + <tooltip>Begin receiving data.</tooltip> + <label>Start</label> + <checked>0</checked> + </object> + </object> + </object> + </object> <object class="sizeritem"> <option>0</option> <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</flag> @@ -281,7 +304,7 @@ <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL</flag> <border>1</border> <object class="wxToggleButton" name="m_togBtnSplit"> - <tooltip>Toggle Split mode.</tooltip> + <tooltip>Toggle split frequency mode.</tooltip> <label>Split</label> <checked>0</checked> </object> @@ -317,7 +340,7 @@ <flag>wxALL</flag> <border>1</border> <object class="wxToggleButton" name="m_togBtnALC"> - <tooltip>Toggle ALC Mode.</tooltip> + <tooltip>Toggle automatic level control mode.</tooltip> <label>ALC</label> <checked>0</checked> </object> @@ -335,6 +358,7 @@ <flag>wxALIGN_CENTER|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL</flag> <border>1</border> <object class="wxToggleButton" name="m_btnTogTX"> + <tooltip>Switch between Receive and Transmit</tooltip> <label>TX</label> <checked>0</checked> </object> @@ -445,7 +469,7 @@ </object> <object class="wxDialog" name="DlgAudio"> <style>wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</style> - <size>553,381</size> + <size>555,419</size> <title>Audio Options</title> <centered>1</centered> <object class="wxBoxSizer"> @@ -467,7 +491,7 @@ <flag>wxEXPAND</flag> <border>5</border> <object class="wxStaticBoxSizer"> - <orient>wxVERTICAL</orient> + <orient>wxHORIZONTAL</orient> <label>PortAudio</label> <object class="sizeritem"> <option>1</option> @@ -477,13 +501,17 @@ <orient>wxHORIZONTAL</orient> <object class="sizeritem"> <option>0</option> - <flag>wxEXPAND</flag> + <flag>wxALL</flag> <border>5</border> - <object class="wxBoxSizer"> - <orient>wxVERTICAL</orient> + <object class="wxGridSizer"> + <minsize>115,-1</minsize> + <rows>3</rows> + <cols>1</cols> + <vgap>0</vgap> + <hgap>0</hgap> <object class="sizeritem"> <option>1</option> - <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL</flag> + <flag>wxALIGN_CENTER_VERTICAL|wxALL</flag> <border>5</border> <object class="wxRadioButton" name="m_radioBtnPortAudio"> <style>wxRB_GROUP</style> @@ -491,15 +519,99 @@ <value>1</value> </object> </object> + <object class="sizeritem"> + <option>0</option> + <flag>wxEXPAND</flag> + <border>5</border> + <object class="wxGridSizer"> + <minsize>110,-1</minsize> + <rows>2</rows> + <cols>2</cols> + <vgap>0</vgap> + <hgap>0</hgap> + <object class="sizeritem"> + <option>1</option> + <flag>wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL|wxEXPAND</flag> + <border>5</border> + <object class="wxStaticText" name="m_staticText151"> + <style>wxALIGN_RIGHT</style> + <size>80,-1</size> + <font> + <size>7</size> + <family>default</family> + <style>normal</style> + <weight>normal</weight> + <underlined>0</underlined> + </font> + <label># Ch Out:</label> + <wrap>-1</wrap> + </object> + </object> + <object class="sizeritem"> + <option>1</option> + <flag>wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL</flag> + <border>5</border> + <object class="wxTextCtrl" name="m_textNumChOut"> + <style>wxTE_READONLY</style> + <size>30,-1</size> + <font> + <size>7</size> + <family>default</family> + <style>normal</style> + <weight>normal</weight> + <underlined>0</underlined> + </font> + <value></value> + <maxlength>0</maxlength> + </object> + </object> + <object class="sizeritem"> + <option>1</option> + <flag>wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL|wxEXPAND</flag> + <border>5</border> + <object class="wxStaticText" name="m_staticText141"> + <style>wxALIGN_RIGHT</style> + <size>80,-1</size> + <font> + <size>7</size> + <family>default</family> + <style>normal</style> + <weight>normal</weight> + <underlined>0</underlined> + </font> + <label># Ch In:</label> + <wrap>-1</wrap> + </object> + </object> + <object class="sizeritem"> + <option>0</option> + <flag>wxALL</flag> + <border>4</border> + <object class="wxTextCtrl" name="m_textNumChIn"> + <style>wxTE_READONLY</style> + <size>30,-1</size> + <font> + <size>7</size> + <family>default</family> + <style>normal</style> + <weight>normal</weight> + <underlined>0</underlined> + </font> + <value></value> + <maxlength>0</maxlength> + </object> + </object> + </object> + </object> </object> </object> <object class="sizeritem"> - <option>1</option> - <flag>wxEXPAND</flag> + <option>0</option> + <flag>wxALL|wxEXPAND</flag> <border>5</border> <object class="wxGridSizer"> <rows>4</rows> - <cols>1</cols> + <cols>2</cols> <vgap>0</vgap> <hgap>0</hgap> <object class="sizeritem"> @@ -507,85 +619,74 @@ <flag>wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL</flag> <border>5</border> <object class="wxStaticText" name="m_staticText14"> - <style>wxALIGN_RIGHT</style> + <style>wxALIGN_RIGHT|wxST_NO_AUTORESIZE</style> <label>Audio in (mic) -&gt; codec:</label> <wrap>-1</wrap> </object> </object> <object class="sizeritem"> - <option>0</option> - <flag>wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL</flag> + <option>1</option> + <flag>wxALL</flag> <border>5</border> - <object class="wxStaticText" name="m_staticText15"> - <style>wxALIGN_RIGHT</style> - <label>codec -&gt; Radio Tx: </label> - <wrap>-1</wrap> + <object class="wxComboBox" name="m_comboAudioCodec"> + <value>&lt;default&gt;</value> + <content /> </object> </object> <object class="sizeritem"> <option>0</option> - <flag>wxALIGN_RIGHT|wxALL</flag> + <flag>wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL</flag> <border>5</border> - <object class="wxStaticText" name="m_staticText16"> - <style>wxALIGN_RIGHT</style> - <label>Radio Rx -&gt; codec:</label> + <object class="wxStaticText" name="m_staticText15"> + <style>wxALIGN_RIGHT|wxST_NO_AUTORESIZE</style> + <label>codec -&gt; Radio Tx:</label> <wrap>-1</wrap> </object> </object> <object class="sizeritem"> - <option>0</option> - <flag>wxALIGN_RIGHT|wxALL</flag> + <option>1</option> + <flag>wxALL</flag> <border>5</border> - <object class="wxStaticText" name="m_staticText17"> - <style>wxALIGN_RIGHT</style> - <label>codec -&gt; Audio out (spkr):</label> - <wrap>-1</wrap> + <object class="wxComboBox" name="m_comboCodecTx"> + <value>&lt;default&gt;</value> + <content /> </object> </object> - </object> - </object> - <object class="sizeritem"> - <option>1</option> - <flag>wxEXPAND</flag> - <border>5</border> - <object class="wxGridSizer"> - <rows>4</rows> - <cols>1</cols> - <vgap>0</vgap> - <hgap>0</hgap> <object class="sizeritem"> <option>0</option> - <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</flag> + <flag>wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL</flag> <border>5</border> - <object class="wxComboBox" name="m_comboBox1"> - <value>Combo!</value> - <content /> + <object class="wxStaticText" name="m_staticText16"> + <style>wxALIGN_RIGHT|wxST_NO_AUTORESIZE</style> + <label>Radio Rx -&gt; codec:</label> + <wrap>-1</wrap> </object> </object> <object class="sizeritem"> - <option>0</option> - <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</flag> + <option>1</option> + <flag>wxALL</flag> <border>5</border> - <object class="wxComboBox" name="m_comboBox2"> - <value>Combo!</value> + <object class="wxComboBox" name="m_comboRadioRx"> + <value>&lt;default&gt;</value> <content /> </object> </object> <object class="sizeritem"> <option>0</option> - <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</flag> + <flag>wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL</flag> <border>5</border> - <object class="wxComboBox" name="m_comboBox11"> - <value>Combo!</value> - <content /> + <object class="wxStaticText" name="m_staticText17"> + <style>wxALIGN_RIGHT|wxST_NO_AUTORESIZE</style> + <label>codec -&gt; Audio out (spkr):</label> + <wrap>-1</wrap> </object> </object> <object class="sizeritem"> <option>0</option> - <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</flag> + <flag>wxALL</flag> <border>5</border> - <object class="wxComboBox" name="m_comboBox12"> - <value>Combo!</value> + <object class="wxComboBox" name="m_comboCodecSpkr"> + <value>&lt;default&gt;</value> <content /> </object> </object> @@ -613,7 +714,6 @@ <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL</flag> <border>5</border> <object class="wxRadioButton" name="m_radioBtnFileOnly"> - <style>wxRB_GROUP</style> <label>File Only</label> <value>0</value> </object> -- 2.25.1