-//=========================================================================\r
-// Name: AudioOptsDialog.cpp\r
-// Purpose: Implements simple wxWidgets application with GUI\r
-// created using wxFormBuilder.\r
-// Author:\r
-// Created:\r
-// Copyright:\r
-// License: wxWidgets license (www.wxwidgets.org)\r
-//\r
-// Notes: Note that all GUI creation code is implemented in\r
-// gui.cpp source file which is generated by wxFormBuilder.\r
-//=========================================================================\r
-#include "fdmdv2_main.h"\r
-#include "dlg_audiooptions.h"\r
-\r
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
-// AudioOptsDialog()\r
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
-AudioOptsDialog::AudioOptsDialog(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : wxDialog(parent, id, title, pos, size, style)\r
-{\r
- this->SetSizeHints(wxSize(650, 400), wxDefaultSize);\r
-\r
- m_isPaInitialized = false;\r
-\r
- if(!m_isPaInitialized)\r
- {\r
- if((pa_err = Pa_Initialize()) == paNoError)\r
- {\r
- m_isPaInitialized = true;\r
- }\r
- else\r
- {\r
- wxMessageBox(wxT("Port Audio failed to initialize"), wxT("Pa_Initialize"), wxOK);\r
- return;\r
- }\r
- }\r
-\r
- wxBoxSizer* mainSizer;\r
- mainSizer = new wxBoxSizer(wxVERTICAL);\r
- m_panel1 = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);\r
- wxBoxSizer* bSizer4;\r
- bSizer4 = new wxBoxSizer(wxVERTICAL);\r
- m_notebook1 = new wxNotebook(m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_BOTTOM);\r
- m_panelRx = new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);\r
- wxBoxSizer* bSizer20;\r
- bSizer20 = new wxBoxSizer(wxVERTICAL);\r
- wxGridSizer* gSizer4;\r
- gSizer4 = new wxGridSizer(2, 1, 0, 0);\r
- wxStaticBoxSizer* sbSizer2;\r
- sbSizer2 = new wxStaticBoxSizer(new wxStaticBox(m_panelRx, wxID_ANY, _("Rx Radio Device")), wxVERTICAL);\r
- m_listCtrlRxInDevices = new wxListCtrl(m_panelRx, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_VRULES);\r
- sbSizer2->Add(m_listCtrlRxInDevices, 1, wxALL|wxEXPAND, 1);\r
- wxBoxSizer* bSizer811;\r
- bSizer811 = new wxBoxSizer(wxHORIZONTAL);\r
- m_staticText51 = new wxStaticText(m_panelRx, wxID_ANY, _("Device:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText51->Wrap(-1);\r
- bSizer811->Add(m_staticText51, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);\r
- m_textCtrlRxIn = new wxTextCtrl(m_panelRx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);\r
- bSizer811->Add(m_textCtrlRxIn, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);\r
- m_staticText6 = new wxStaticText(m_panelRx, wxID_ANY, _("Sample Rate:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText6->Wrap(-1);\r
- bSizer811->Add(m_staticText6, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);\r
- m_cbSampleRateRxIn = new wxComboBox(m_panelRx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN);\r
- bSizer811->Add(m_cbSampleRateRxIn, 0, wxALL, 1);\r
- sbSizer2->Add(bSizer811, 0, wxEXPAND, 5);\r
- gSizer4->Add(sbSizer2, 1, wxEXPAND, 5);\r
- wxStaticBoxSizer* sbSizer3;\r
- sbSizer3 = new wxStaticBoxSizer(new wxStaticBox(m_panelRx, wxID_ANY, _("Rx Speaker Stream")), wxVERTICAL);\r
- m_listCtrlRxOutDevices = new wxListCtrl(m_panelRx, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_VRULES);\r
- sbSizer3->Add(m_listCtrlRxOutDevices, 1, wxALL|wxEXPAND, 1);\r
- wxBoxSizer* bSizer81;\r
- bSizer81 = new wxBoxSizer(wxHORIZONTAL);\r
- m_staticText9 = new wxStaticText(m_panelRx, wxID_ANY, _("Device:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText9->Wrap(-1);\r
- bSizer81->Add(m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);\r
- m_textCtrlRxOut = new wxTextCtrl(m_panelRx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);\r
- bSizer81->Add(m_textCtrlRxOut, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);\r
- m_staticText10 = new wxStaticText(m_panelRx, wxID_ANY, _("Sample Rate:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText10->Wrap(-1);\r
- bSizer81->Add(m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);\r
- m_cbSampleRateRxOut = new wxComboBox(m_panelRx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN);\r
- bSizer81->Add(m_cbSampleRateRxOut, 0, wxALIGN_CENTER_VERTICAL|wxALL, 1);\r
- sbSizer3->Add(bSizer81, 0, wxEXPAND, 2);\r
- gSizer4->Add(sbSizer3, 1, wxEXPAND, 2);\r
- bSizer20->Add(gSizer4, 1, wxEXPAND, 1);\r
- m_panelRx->SetSizer(bSizer20);\r
- m_panelRx->Layout();\r
- bSizer20->Fit(m_panelRx);\r
- m_notebook1->AddPage(m_panelRx, _("Receive"), true);\r
- m_panelTx = new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);\r
- wxBoxSizer* bSizer18;\r
- bSizer18 = new wxBoxSizer(wxVERTICAL);\r
- wxGridSizer* gSizer2;\r
- gSizer2 = new wxGridSizer(2, 1, 0, 0);\r
- wxStaticBoxSizer* sbSizer22;\r
- sbSizer22 = new wxStaticBoxSizer(new wxStaticBox(m_panelTx, wxID_ANY, _("Tx Microphone Stream")), wxVERTICAL);\r
- m_listCtrlTxInDevices = new wxListCtrl(m_panelTx, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_VRULES);\r
- sbSizer22->Add(m_listCtrlTxInDevices, 1, wxALL|wxEXPAND, 1);\r
- wxBoxSizer* bSizer83;\r
- bSizer83 = new wxBoxSizer(wxHORIZONTAL);\r
- m_staticText12 = new wxStaticText(m_panelTx, wxID_ANY, _("Device:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText12->Wrap(-1);\r
- bSizer83->Add(m_staticText12, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);\r
- m_textCtrlTxIn = new wxTextCtrl(m_panelTx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);\r
- bSizer83->Add(m_textCtrlTxIn, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);\r
- m_staticText11 = new wxStaticText(m_panelTx, wxID_ANY, _("Sample Rate:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText11->Wrap(-1);\r
- bSizer83->Add(m_staticText11, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);\r
- m_cbSampleRateTxIn = new wxComboBox(m_panelTx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN);\r
- bSizer83->Add(m_cbSampleRateTxIn, 0, wxALL, 1);\r
- sbSizer22->Add(bSizer83, 0, wxEXPAND, 2);\r
- gSizer2->Add(sbSizer22, 1, wxEXPAND, 5);\r
- wxStaticBoxSizer* sbSizer21;\r
- sbSizer21 = new wxStaticBoxSizer(new wxStaticBox(m_panelTx, wxID_ANY, _("Tx Radio Stream")), wxVERTICAL);\r
- m_listCtrlTxOutDevices = new wxListCtrl(m_panelTx, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_VRULES);\r
- sbSizer21->Add(m_listCtrlTxOutDevices, 1, wxALL|wxEXPAND, 2);\r
- wxBoxSizer* bSizer82;\r
- bSizer82 = new wxBoxSizer(wxHORIZONTAL);\r
- m_staticText81 = new wxStaticText(m_panelTx, wxID_ANY, _("Device:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText81->Wrap(-1);\r
- bSizer82->Add(m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);\r
- m_textCtrlTxOut = new wxTextCtrl(m_panelTx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);\r
- bSizer82->Add(m_textCtrlTxOut, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);\r
- m_staticText71 = new wxStaticText(m_panelTx, wxID_ANY, _("Sample Rate:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText71->Wrap(-1);\r
- bSizer82->Add(m_staticText71, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);\r
- m_cbSampleRateTxOut = new wxComboBox(m_panelTx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN);\r
- bSizer82->Add(m_cbSampleRateTxOut, 0, wxALL, 1);\r
- sbSizer21->Add(bSizer82, 0, wxEXPAND, 2);\r
- gSizer2->Add(sbSizer21, 1, wxEXPAND, 5);\r
- bSizer18->Add(gSizer2, 1, wxEXPAND, 1);\r
- m_panelTx->SetSizer(bSizer18);\r
- m_panelTx->Layout();\r
- bSizer18->Fit(m_panelTx);\r
- m_notebook1->AddPage(m_panelTx, _("Transmit"), false);\r
- m_panelAPI = new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);\r
- wxBoxSizer* bSizer12;\r
- bSizer12 = new wxBoxSizer(wxHORIZONTAL);\r
- wxGridSizer* gSizer31;\r
- gSizer31 = new wxGridSizer(2, 1, 0, 0);\r
- wxStaticBoxSizer* sbSizer1;\r
- sbSizer1 = new wxStaticBoxSizer(new wxStaticBox(m_panelAPI, wxID_ANY, _("PortAudio")), wxVERTICAL);\r
- wxGridSizer* gSizer3;\r
- gSizer3 = new wxGridSizer(4, 2, 0, 0);\r
- m_staticText7 = new wxStaticText(m_panelAPI, wxID_ANY, _("PortAudio Version String:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText7->Wrap(-1);\r
- gSizer3->Add(m_staticText7, 0, wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 1);\r
- wxBoxSizer* bSizer151;\r
- bSizer151 = new wxBoxSizer(wxVERTICAL);\r
- m_textStringVer = new wxTextCtrl(m_panelAPI, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY);\r
- bSizer151->Add(m_textStringVer, 0, wxALL|wxEXPAND, 1);\r
- gSizer3->Add(bSizer151, 1, wxEXPAND, 2);\r
- m_staticText8 = new wxStaticText(m_panelAPI, wxID_ANY, _("PortAudio Int Version:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText8->Wrap(-1);\r
- gSizer3->Add(m_staticText8, 0, wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 1);\r
- wxBoxSizer* bSizer13;\r
- bSizer13 = new wxBoxSizer(wxVERTICAL);\r
- m_textIntVer = new wxTextCtrl(m_panelAPI, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY);\r
- bSizer13->Add(m_textIntVer, 0, wxALL|wxALIGN_CENTER_VERTICAL, 1);\r
- gSizer3->Add(bSizer13, 1, wxEXPAND, 5);\r
- m_staticText5 = new wxStaticText(m_panelAPI, wxID_ANY, _("Device Count:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText5->Wrap(-1);\r
- gSizer3->Add(m_staticText5, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 1);\r
- wxBoxSizer* bSizer14;\r
- bSizer14 = new wxBoxSizer(wxVERTICAL);\r
- m_textCDevCount = new wxTextCtrl(m_panelAPI, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(45,-1), wxTE_READONLY);\r
- m_textCDevCount->SetMaxSize(wxSize(45,-1));\r
- bSizer14->Add(m_textCDevCount, 0, wxALIGN_CENTER_VERTICAL|wxALL, 1);\r
- gSizer3->Add(bSizer14, 1, wxEXPAND, 5);\r
- m_staticText4 = new wxStaticText(m_panelAPI, wxID_ANY, _("API Count:"), wxDefaultPosition, wxDefaultSize, 0);\r
- m_staticText4->Wrap(-1);\r
- gSizer3->Add(m_staticText4, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 1);\r
- wxBoxSizer* bSizer15;\r
- bSizer15 = new wxBoxSizer(wxVERTICAL);\r
- m_textAPICount = new wxTextCtrl(m_panelAPI, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(45,-1), wxTE_READONLY);\r
- m_textAPICount->SetMaxSize(wxSize(45,-1));\r
- bSizer15->Add(m_textAPICount, 0, wxALIGN_CENTER_VERTICAL|wxALL, 1);\r
- gSizer3->Add(bSizer15, 1, wxEXPAND, 5);\r
- sbSizer1->Add(gSizer3, 1, wxEXPAND, 2);\r
- gSizer31->Add(sbSizer1, 1, wxEXPAND, 2);\r
- wxStaticBoxSizer* sbSizer6;\r
- sbSizer6 = new wxStaticBoxSizer(new wxStaticBox(m_panelAPI, wxID_ANY, _("Other")), wxVERTICAL);\r
- gSizer31->Add(sbSizer6, 1, wxEXPAND, 5);\r
- bSizer12->Add(gSizer31, 1, wxEXPAND, 5);\r
- m_panelAPI->SetSizer(bSizer12);\r
- m_panelAPI->Layout();\r
- bSizer12->Fit(m_panelAPI);\r
- m_notebook1->AddPage(m_panelAPI, _("API Info"), false);\r
- bSizer4->Add(m_notebook1, 1, wxEXPAND | wxALL, 0);\r
- m_panel1->SetSizer(bSizer4);\r
- m_panel1->Layout();\r
- bSizer4->Fit(m_panel1);\r
- mainSizer->Add(m_panel1, 1, wxEXPAND | wxALL, 1);\r
- wxBoxSizer* bSizer6;\r
- bSizer6 = new wxBoxSizer(wxHORIZONTAL);\r
- m_btnRefresh = new wxButton(this, wxID_ANY, _("Refresh"), wxDefaultPosition, wxDefaultSize, 0);\r
- bSizer6->Add(m_btnRefresh, 0, wxALIGN_CENTER|wxALL, 2);\r
- m_sdbSizer1 = new wxStdDialogButtonSizer();\r
- m_sdbSizer1OK = new wxButton(this, wxID_OK);\r
- m_sdbSizer1->AddButton(m_sdbSizer1OK);\r
- m_sdbSizer1Apply = new wxButton(this, wxID_APPLY);\r
- m_sdbSizer1->AddButton(m_sdbSizer1Apply);\r
- m_sdbSizer1Cancel = new wxButton(this, wxID_CANCEL);\r
- m_sdbSizer1->AddButton(m_sdbSizer1Cancel);\r
- m_sdbSizer1->Realize();\r
- bSizer6->Add(m_sdbSizer1, 1, wxALIGN_CENTER_VERTICAL, 2);\r
- mainSizer->Add(bSizer6, 0, wxEXPAND, 2);\r
- this->SetSizer(mainSizer);\r
- this->Layout();\r
- this->Centre(wxBOTH);\r
-// this->Centre(wxBOTH);\r
-\r
- m_notebook1->SetSelection(0);\r
-\r
- showAPIInfo();\r
- m_RxInDevices.m_listDevices = m_listCtrlRxInDevices;\r
- m_RxInDevices.direction = AUDIO_IN;\r
- m_RxInDevices.m_textDevice = m_textCtrlRxIn;\r
- m_RxInDevices.m_cbSampleRate = m_cbSampleRateRxIn;\r
-\r
- m_RxOutDevices.m_listDevices = m_listCtrlRxOutDevices;\r
- m_RxOutDevices.direction = AUDIO_OUT;\r
- m_RxOutDevices.m_textDevice = m_textCtrlRxOut;\r
- m_RxOutDevices.m_cbSampleRate = m_cbSampleRateRxOut;\r
-\r
- m_TxInDevices.m_listDevices = m_listCtrlTxInDevices;\r
- m_TxInDevices.direction = AUDIO_IN;\r
- m_TxInDevices.m_textDevice = m_textCtrlTxIn;\r
- m_TxInDevices.m_cbSampleRate = m_cbSampleRateTxIn;\r
-\r
- m_TxOutDevices.m_listDevices = m_listCtrlTxOutDevices;\r
- m_TxOutDevices.direction = AUDIO_OUT;\r
- m_TxOutDevices.m_textDevice = m_textCtrlTxOut;\r
- m_TxOutDevices.m_cbSampleRate = m_cbSampleRateTxOut;\r
-\r
- populateParams(m_RxInDevices);\r
- populateParams(m_RxOutDevices);\r
- populateParams(m_TxInDevices);\r
- populateParams(m_TxOutDevices);\r
-\r
- m_listCtrlRxInDevices->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( AudioOptsDialog::OnRxInDeviceSelect ), NULL, this );\r
- m_listCtrlRxOutDevices->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( AudioOptsDialog::OnRxOutDeviceSelect ), NULL, this );\r
- m_listCtrlTxInDevices->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( AudioOptsDialog::OnTxInDeviceSelect ), NULL, this );\r
- m_listCtrlTxOutDevices->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( AudioOptsDialog::OnTxOutDeviceSelect ), NULL, this );\r
- m_btnRefresh->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AudioOptsDialog::OnRefreshClick ), NULL, this );\r
- m_sdbSizer1Apply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AudioOptsDialog::OnApplyAudioParameters ), NULL, this );\r
- m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AudioOptsDialog::OnCancelAudioParameters ), NULL, this );\r
- m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AudioOptsDialog::OnOkAudioParameters ), NULL, this );\r
-/*\r
- void OnClose( wxCloseEvent& event ) { event.Skip(); }\r
- void OnHibernate( wxActivateEvent& event ) { event.Skip(); }\r
- void OnIconize( wxIconizeEvent& event ) { event.Skip(); }\r
- void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); }\r
-*/\r
-// this->Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(AudioOptsDialog::OnClose));\r
- this->Connect(wxEVT_HIBERNATE, wxActivateEventHandler(AudioOptsDialog::OnHibernate));\r
- this->Connect(wxEVT_ICONIZE, wxIconizeEventHandler(AudioOptsDialog::OnIconize));\r
- this->Connect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(AudioOptsDialog::OnInitDialog));\r
-}\r
-\r
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
-// ~AudioOptsDialog()\r
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
-AudioOptsDialog::~AudioOptsDialog()\r
-{\r
- // Disconnect Events\r
- this->Disconnect(wxEVT_HIBERNATE, wxActivateEventHandler(AudioOptsDialog::OnHibernate));\r
- this->Disconnect(wxEVT_ICONIZE, wxIconizeEventHandler(AudioOptsDialog::OnIconize));\r
- this->Disconnect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(AudioOptsDialog::OnInitDialog));\r
-\r
- m_listCtrlRxInDevices->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(AudioOptsDialog::OnRxInDeviceSelect), NULL, this);\r
- m_listCtrlRxOutDevices->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(AudioOptsDialog::OnRxOutDeviceSelect), NULL, this);\r
- m_listCtrlTxInDevices->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(AudioOptsDialog::OnTxInDeviceSelect), NULL, this);\r
- m_listCtrlTxOutDevices->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(AudioOptsDialog::OnTxOutDeviceSelect), NULL, this);\r
- m_btnRefresh->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AudioOptsDialog::OnRefreshClick), NULL, this);\r
- m_sdbSizer1Apply->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AudioOptsDialog::OnApplyAudioParameters), NULL, this);\r
- m_sdbSizer1Cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AudioOptsDialog::OnCancelAudioParameters), NULL, this);\r
- m_sdbSizer1OK->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AudioOptsDialog::OnOkAudioParameters), NULL, this);\r
-}\r
-\r
+//=========================================================================
+// Name: AudioOptsDialog.cpp
+// Purpose: Implements simple wxWidgets application with GUI
+// created using wxFormBuilder.
+// Author:
+// Created:
+// Copyright:
+// License: wxWidgets license (www.wxwidgets.org)
+//
+// Notes: Note that all GUI creation code is implemented in
+// gui.cpp source file which is generated by wxFormBuilder.
+//=========================================================================
+#include "fdmdv2_main.h"
+#include "dlg_audiooptions.h"
+
+void AudioOptsDialog::Pa_Init(void)
+{
+ m_isPaInitialized = false;
+
+ if((pa_err = Pa_Initialize()) == paNoError)
+ {
+ m_isPaInitialized = true;
+ }
+ else
+ {
+ wxMessageBox(wxT("Port Audio failed to initialize"), wxT("Pa_Initialize"), wxOK);
+ return;
+ }
+}
+
+
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
+// AudioOptsDialog()
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
+AudioOptsDialog::AudioOptsDialog(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : wxDialog(parent, id, title, pos, size, style)
+{
+ this->SetSizeHints(wxSize(800, 400), wxDefaultSize);
+
+ Pa_Init();
+
+ wxBoxSizer* mainSizer;
+ mainSizer = new wxBoxSizer(wxVERTICAL);
+ m_panel1 = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ wxBoxSizer* bSizer4;
+ bSizer4 = new wxBoxSizer(wxVERTICAL);
+ m_notebook1 = new wxNotebook(m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_BOTTOM);
+ m_panelRx = new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ wxBoxSizer* bSizer20;
+ bSizer20 = new wxBoxSizer(wxVERTICAL);
+ wxGridSizer* gSizer4;
+ gSizer4 = new wxGridSizer(2, 1, 0, 0);
+ wxStaticBoxSizer* sbSizer2;
+ sbSizer2 = new wxStaticBoxSizer(new wxStaticBox(m_panelRx, wxID_ANY, _("From Radio")), wxVERTICAL);
+ m_listCtrlRxInDevices = new wxListCtrl(m_panelRx, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_VRULES);
+ sbSizer2->Add(m_listCtrlRxInDevices, 1, wxALL|wxEXPAND, 1);
+ wxBoxSizer* bSizer811;
+ bSizer811 = new wxBoxSizer(wxHORIZONTAL);
+ m_staticText51 = new wxStaticText(m_panelRx, wxID_ANY, _("Device:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText51->Wrap(-1);
+ bSizer811->Add(m_staticText51, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);
+ m_textCtrlRxIn = new wxTextCtrl(m_panelRx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
+ bSizer811->Add(m_textCtrlRxIn, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ m_staticText6 = new wxStaticText(m_panelRx, wxID_ANY, _("Sample Rate:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText6->Wrap(-1);
+ bSizer811->Add(m_staticText6, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);
+ m_cbSampleRateRxIn = new wxComboBox(m_panelRx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN);
+ bSizer811->Add(m_cbSampleRateRxIn, 0, wxALL, 1);
+ sbSizer2->Add(bSizer811, 0, wxEXPAND, 5);
+ gSizer4->Add(sbSizer2, 1, wxEXPAND, 5);
+ wxStaticBoxSizer* sbSizer3;
+ sbSizer3 = new wxStaticBoxSizer(new wxStaticBox(m_panelRx, wxID_ANY, _("To Speaker/Headphones")), wxVERTICAL);
+ m_listCtrlRxOutDevices = new wxListCtrl(m_panelRx, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_VRULES);
+ sbSizer3->Add(m_listCtrlRxOutDevices, 1, wxALL|wxEXPAND, 1);
+ wxBoxSizer* bSizer81;
+ bSizer81 = new wxBoxSizer(wxHORIZONTAL);
+ m_staticText9 = new wxStaticText(m_panelRx, wxID_ANY, _("Device:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText9->Wrap(-1);
+ bSizer81->Add(m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
+ m_textCtrlRxOut = new wxTextCtrl(m_panelRx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
+ bSizer81->Add(m_textCtrlRxOut, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ m_staticText10 = new wxStaticText(m_panelRx, wxID_ANY, _("Sample Rate:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText10->Wrap(-1);
+ bSizer81->Add(m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);
+ m_cbSampleRateRxOut = new wxComboBox(m_panelRx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN);
+ bSizer81->Add(m_cbSampleRateRxOut, 0, wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ sbSizer3->Add(bSizer81, 0, wxEXPAND, 2);
+ gSizer4->Add(sbSizer3, 1, wxEXPAND, 2);
+ bSizer20->Add(gSizer4, 1, wxEXPAND, 1);
+ m_panelRx->SetSizer(bSizer20);
+ m_panelRx->Layout();
+ bSizer20->Fit(m_panelRx);
+ m_notebook1->AddPage(m_panelRx, _("Receive"), true);
+ m_panelTx = new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ wxBoxSizer* bSizer18;
+ bSizer18 = new wxBoxSizer(wxVERTICAL);
+ wxGridSizer* gSizer2;
+ gSizer2 = new wxGridSizer(2, 1, 0, 0);
+ wxStaticBoxSizer* sbSizer22;
+ sbSizer22 = new wxStaticBoxSizer(new wxStaticBox(m_panelTx, wxID_ANY, _("From Microphone")), wxVERTICAL);
+ m_listCtrlTxInDevices = new wxListCtrl(m_panelTx, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_VRULES);
+ sbSizer22->Add(m_listCtrlTxInDevices, 1, wxALL|wxEXPAND, 1);
+ wxBoxSizer* bSizer83;
+ bSizer83 = new wxBoxSizer(wxHORIZONTAL);
+ m_staticText12 = new wxStaticText(m_panelTx, wxID_ANY, _("Device:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText12->Wrap(-1);
+ bSizer83->Add(m_staticText12, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);
+ m_textCtrlTxIn = new wxTextCtrl(m_panelTx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
+ bSizer83->Add(m_textCtrlTxIn, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ m_staticText11 = new wxStaticText(m_panelTx, wxID_ANY, _("Sample Rate:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText11->Wrap(-1);
+ bSizer83->Add(m_staticText11, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);
+ m_cbSampleRateTxIn = new wxComboBox(m_panelTx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN);
+ bSizer83->Add(m_cbSampleRateTxIn, 0, wxALL, 1);
+ sbSizer22->Add(bSizer83, 0, wxEXPAND, 2);
+ gSizer2->Add(sbSizer22, 1, wxEXPAND, 5);
+ wxStaticBoxSizer* sbSizer21;
+ sbSizer21 = new wxStaticBoxSizer(new wxStaticBox(m_panelTx, wxID_ANY, _("To Radio")), wxVERTICAL);
+ m_listCtrlTxOutDevices = new wxListCtrl(m_panelTx, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_VRULES);
+ sbSizer21->Add(m_listCtrlTxOutDevices, 1, wxALL|wxEXPAND, 2);
+ wxBoxSizer* bSizer82;
+ bSizer82 = new wxBoxSizer(wxHORIZONTAL);
+ m_staticText81 = new wxStaticText(m_panelTx, wxID_ANY, _("Device:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText81->Wrap(-1);
+ bSizer82->Add(m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
+ m_textCtrlTxOut = new wxTextCtrl(m_panelTx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
+ bSizer82->Add(m_textCtrlTxOut, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ m_staticText71 = new wxStaticText(m_panelTx, wxID_ANY, _("Sample Rate:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText71->Wrap(-1);
+ bSizer82->Add(m_staticText71, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5);
+ m_cbSampleRateTxOut = new wxComboBox(m_panelTx, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN);
+ bSizer82->Add(m_cbSampleRateTxOut, 0, wxALL, 1);
+ sbSizer21->Add(bSizer82, 0, wxEXPAND, 2);
+ gSizer2->Add(sbSizer21, 1, wxEXPAND, 5);
+ bSizer18->Add(gSizer2, 1, wxEXPAND, 1);
+ m_panelTx->SetSizer(bSizer18);
+ m_panelTx->Layout();
+ bSizer18->Fit(m_panelTx);
+ m_notebook1->AddPage(m_panelTx, _("Transmit"), false);
+ m_panelAPI = new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ wxBoxSizer* bSizer12;
+ bSizer12 = new wxBoxSizer(wxHORIZONTAL);
+ wxGridSizer* gSizer31;
+ gSizer31 = new wxGridSizer(2, 1, 0, 0);
+ wxStaticBoxSizer* sbSizer1;
+ sbSizer1 = new wxStaticBoxSizer(new wxStaticBox(m_panelAPI, wxID_ANY, _("PortAudio")), wxVERTICAL);
+ wxGridSizer* gSizer3;
+ gSizer3 = new wxGridSizer(4, 2, 0, 0);
+ m_staticText7 = new wxStaticText(m_panelAPI, wxID_ANY, _("PortAudio Version String:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText7->Wrap(-1);
+ gSizer3->Add(m_staticText7, 0, wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 1);
+ wxBoxSizer* bSizer151;
+ bSizer151 = new wxBoxSizer(wxVERTICAL);
+ m_textStringVer = new wxTextCtrl(m_panelAPI, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
+ bSizer151->Add(m_textStringVer, 0, wxALL|wxEXPAND, 1);
+ gSizer3->Add(bSizer151, 1, wxEXPAND, 2);
+ m_staticText8 = new wxStaticText(m_panelAPI, wxID_ANY, _("PortAudio Int Version:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText8->Wrap(-1);
+ gSizer3->Add(m_staticText8, 0, wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 1);
+ wxBoxSizer* bSizer13;
+ bSizer13 = new wxBoxSizer(wxVERTICAL);
+ m_textIntVer = new wxTextCtrl(m_panelAPI, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
+ bSizer13->Add(m_textIntVer, 0, wxALL|wxALIGN_CENTER_VERTICAL, 1);
+ gSizer3->Add(bSizer13, 1, wxEXPAND, 5);
+ m_staticText5 = new wxStaticText(m_panelAPI, wxID_ANY, _("Device Count:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText5->Wrap(-1);
+ gSizer3->Add(m_staticText5, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 1);
+ wxBoxSizer* bSizer14;
+ bSizer14 = new wxBoxSizer(wxVERTICAL);
+ m_textCDevCount = new wxTextCtrl(m_panelAPI, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(45,-1), wxTE_READONLY);
+ m_textCDevCount->SetMaxSize(wxSize(45,-1));
+ bSizer14->Add(m_textCDevCount, 0, wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ gSizer3->Add(bSizer14, 1, wxEXPAND, 5);
+ m_staticText4 = new wxStaticText(m_panelAPI, wxID_ANY, _("API Count:"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText4->Wrap(-1);
+ gSizer3->Add(m_staticText4, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 1);
+ wxBoxSizer* bSizer15;
+ bSizer15 = new wxBoxSizer(wxVERTICAL);
+ m_textAPICount = new wxTextCtrl(m_panelAPI, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(45,-1), wxTE_READONLY);
+ m_textAPICount->SetMaxSize(wxSize(45,-1));
+ bSizer15->Add(m_textAPICount, 0, wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ gSizer3->Add(bSizer15, 1, wxEXPAND, 5);
+ sbSizer1->Add(gSizer3, 1, wxEXPAND, 2);
+ gSizer31->Add(sbSizer1, 1, wxEXPAND, 2);
+ wxStaticBoxSizer* sbSizer6;
+ sbSizer6 = new wxStaticBoxSizer(new wxStaticBox(m_panelAPI, wxID_ANY, _("Other")), wxVERTICAL);
+ gSizer31->Add(sbSizer6, 1, wxEXPAND, 5);
+ bSizer12->Add(gSizer31, 1, wxEXPAND, 5);
+ m_panelAPI->SetSizer(bSizer12);
+ m_panelAPI->Layout();
+ bSizer12->Fit(m_panelAPI);
+ m_notebook1->AddPage(m_panelAPI, _("API Info"), false);
+ bSizer4->Add(m_notebook1, 1, wxEXPAND | wxALL, 0);
+ m_panel1->SetSizer(bSizer4);
+ m_panel1->Layout();
+ bSizer4->Fit(m_panel1);
+ mainSizer->Add(m_panel1, 1, wxEXPAND | wxALL, 1);
+ wxBoxSizer* bSizer6;
+ bSizer6 = new wxBoxSizer(wxHORIZONTAL);
+ m_btnRefresh = new wxButton(this, wxID_ANY, _("Refresh"), wxDefaultPosition, wxDefaultSize, 0);
+ bSizer6->Add(m_btnRefresh, 0, wxALIGN_CENTER|wxALL, 2);
+ m_sdbSizer1 = new wxStdDialogButtonSizer();
+ m_sdbSizer1OK = new wxButton(this, wxID_OK);
+ m_sdbSizer1->AddButton(m_sdbSizer1OK);
+ m_sdbSizer1Apply = new wxButton(this, wxID_APPLY);
+ m_sdbSizer1->AddButton(m_sdbSizer1Apply);
+ m_sdbSizer1Cancel = new wxButton(this, wxID_CANCEL);
+ m_sdbSizer1->AddButton(m_sdbSizer1Cancel);
+ m_sdbSizer1->Realize();
+ bSizer6->Add(m_sdbSizer1, 1, wxALIGN_CENTER_VERTICAL, 2);
+ mainSizer->Add(bSizer6, 0, wxEXPAND, 2);
+ this->SetSizer(mainSizer);
+ this->Layout();
+ this->Centre(wxBOTH);
+// this->Centre(wxBOTH);
+
+ m_notebook1->SetSelection(0);
+
+ showAPIInfo();
+ m_RxInDevices.m_listDevices = m_listCtrlRxInDevices;
+ m_RxInDevices.direction = AUDIO_IN;
+ m_RxInDevices.m_textDevice = m_textCtrlRxIn;
+ m_RxInDevices.m_cbSampleRate = m_cbSampleRateRxIn;
+
+ m_RxOutDevices.m_listDevices = m_listCtrlRxOutDevices;
+ m_RxOutDevices.direction = AUDIO_OUT;
+ m_RxOutDevices.m_textDevice = m_textCtrlRxOut;
+ m_RxOutDevices.m_cbSampleRate = m_cbSampleRateRxOut;
+
+ m_TxInDevices.m_listDevices = m_listCtrlTxInDevices;
+ m_TxInDevices.direction = AUDIO_IN;
+ m_TxInDevices.m_textDevice = m_textCtrlTxIn;
+ m_TxInDevices.m_cbSampleRate = m_cbSampleRateTxIn;
+
+ m_TxOutDevices.m_listDevices = m_listCtrlTxOutDevices;
+ m_TxOutDevices.direction = AUDIO_OUT;
+ m_TxOutDevices.m_textDevice = m_textCtrlTxOut;
+ m_TxOutDevices.m_cbSampleRate = m_cbSampleRateTxOut;
+
+ populateParams(m_RxInDevices);
+ populateParams(m_RxOutDevices);
+ populateParams(m_TxInDevices);
+ populateParams(m_TxOutDevices);
+
+ m_listCtrlRxInDevices->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( AudioOptsDialog::OnRxInDeviceSelect ), NULL, this );
+ m_listCtrlRxOutDevices->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( AudioOptsDialog::OnRxOutDeviceSelect ), NULL, this );
+ m_listCtrlTxInDevices->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( AudioOptsDialog::OnTxInDeviceSelect ), NULL, this );
+ m_listCtrlTxOutDevices->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( AudioOptsDialog::OnTxOutDeviceSelect ), NULL, this );
+ m_btnRefresh->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AudioOptsDialog::OnRefreshClick ), NULL, this );
+ m_sdbSizer1Apply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AudioOptsDialog::OnApplyAudioParameters ), NULL, this );
+ m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AudioOptsDialog::OnCancelAudioParameters ), NULL, this );
+ m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AudioOptsDialog::OnOkAudioParameters ), NULL, this );
+/*
+ void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ void OnHibernate( wxActivateEvent& event ) { event.Skip(); }
+ void OnIconize( wxIconizeEvent& event ) { event.Skip(); }
+ void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); }
+*/
+// this->Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(AudioOptsDialog::OnClose));
+ this->Connect(wxEVT_HIBERNATE, wxActivateEventHandler(AudioOptsDialog::OnHibernate));
+ this->Connect(wxEVT_ICONIZE, wxIconizeEventHandler(AudioOptsDialog::OnIconize));
+ this->Connect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(AudioOptsDialog::OnInitDialog));
+}
+
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
+// ~AudioOptsDialog()
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
+AudioOptsDialog::~AudioOptsDialog()
+{
+ Pa_Terminate();
+
+ // Disconnect Events
+ this->Disconnect(wxEVT_HIBERNATE, wxActivateEventHandler(AudioOptsDialog::OnHibernate));
+ this->Disconnect(wxEVT_ICONIZE, wxIconizeEventHandler(AudioOptsDialog::OnIconize));
+ this->Disconnect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(AudioOptsDialog::OnInitDialog));
+
+ m_listCtrlRxInDevices->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(AudioOptsDialog::OnRxInDeviceSelect), NULL, this);
+ m_listCtrlRxOutDevices->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(AudioOptsDialog::OnRxOutDeviceSelect), NULL, this);
+ m_listCtrlTxInDevices->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(AudioOptsDialog::OnTxInDeviceSelect), NULL, this);
+ m_listCtrlTxOutDevices->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler(AudioOptsDialog::OnTxOutDeviceSelect), NULL, this);
+ m_btnRefresh->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AudioOptsDialog::OnRefreshClick), NULL, this);
+ m_sdbSizer1Apply->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AudioOptsDialog::OnApplyAudioParameters), NULL, this);
+ m_sdbSizer1Cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AudioOptsDialog::OnCancelAudioParameters), NULL, this);
+ m_sdbSizer1OK->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AudioOptsDialog::OnOkAudioParameters), NULL, this);
+
+}
+
//-------------------------------------------------------------------------
// OnInitDialog()
//-------------------------------------------------------------------------
void AudioOptsDialog::OnInitDialog( wxInitDialogEvent& event )
{
ExchangeData(EXCHANGE_DATA_IN);
- //populateAudioInfo();
}
+// helper function to look up name of devNum, and if it exists write
+// name to textCtrl. Used to trap dissapearing devices.
+
+int AudioOptsDialog::setTextCtrlIfDevNumValid(wxTextCtrl *textCtrl, wxListCtrl *listCtrl, int devNum)
+{
+ if (devNum > listCtrl->GetItemCount()) {
+ textCtrl->SetValue("none");
+ return -1;
+ }
+ textCtrl->SetValue(listCtrl->GetItemText(devNum, 0));
+ return devNum;
+}
+
+
//-------------------------------------------------------------------------
// ExchangeData()
//-------------------------------------------------------------------------
-void AudioOptsDialog::ExchangeData(int inout)
+int AudioOptsDialog::ExchangeData(int inout)
{
- wxConfigBase *pConfig = wxConfigBase::Get();
if(inout == EXCHANGE_DATA_IN)
{
- m_textCtrlRxIn->SetValue(wxGetApp().m_strRxInAudio);
- m_textCtrlRxOut->SetValue(wxGetApp().m_strRxOutAudio);
- m_textCtrlTxIn->SetValue(wxGetApp().m_textVoiceInput);
- m_textCtrlTxOut->SetValue(wxGetApp().m_textVoiceOutput);
+ // Map sound card device numbers to tx/rx device numbers depending
+ // on number of sound cards in use
+
+ printf("EXCHANGE_DATA_IN:\n");
+ printf(" g_nSoundCards: %d\n", g_nSoundCards);
+ printf(" g_soundCard1InDeviceNum: %d\n", g_soundCard1InDeviceNum);
+ printf(" g_soundCard1OutDeviceNum: %d\n", g_soundCard1OutDeviceNum);
+ printf(" g_soundCard1SampleRate: %d\n", g_soundCard1SampleRate);
+ printf(" g_soundCard2InDeviceNum: %d\n", g_soundCard2InDeviceNum);
+ printf(" g_soundCard2OutDeviceNum: %d\n", g_soundCard2OutDeviceNum);
+ printf(" g_soundCard2SampleRate: %d\n", g_soundCard2SampleRate);
+
+ if (g_nSoundCards == 0) {
+ m_textCtrlRxIn ->SetValue("none"); rxInAudioDeviceNum = -1;
+ m_textCtrlRxOut->SetValue("none"); rxOutAudioDeviceNum = -1;
+ m_textCtrlTxIn ->SetValue("none"); txInAudioDeviceNum = -1;
+ m_textCtrlTxOut->SetValue("none"); txOutAudioDeviceNum = -1;
+ }
+
+ if (g_nSoundCards == 1) {
+ rxInAudioDeviceNum = setTextCtrlIfDevNumValid(m_textCtrlRxIn,
+ m_listCtrlRxInDevices,
+ g_soundCard1InDeviceNum);
+
+ rxOutAudioDeviceNum = setTextCtrlIfDevNumValid(m_textCtrlRxOut,
+ m_listCtrlRxOutDevices,
+ g_soundCard1OutDeviceNum);
+
+ if ((rxInAudioDeviceNum != -1) && (rxInAudioDeviceNum != -1)) {
+ m_cbSampleRateRxIn->SetValue(wxString::Format(wxT("%i"),g_soundCard1SampleRate));
+ m_cbSampleRateRxOut->SetValue(wxString::Format(wxT("%i"),g_soundCard1SampleRate));
+ }
+
+ m_textCtrlTxIn ->SetValue("none"); txInAudioDeviceNum = -1;
+ m_textCtrlTxOut->SetValue("none"); txOutAudioDeviceNum = -1;
+ }
+
+ if (g_nSoundCards == 2) {
+
+ rxInAudioDeviceNum = setTextCtrlIfDevNumValid(m_textCtrlRxIn,
+ m_listCtrlRxInDevices,
+ g_soundCard1InDeviceNum);
+
+ rxOutAudioDeviceNum = setTextCtrlIfDevNumValid(m_textCtrlRxOut,
+ m_listCtrlRxOutDevices,
+ g_soundCard2OutDeviceNum);
+
+ txInAudioDeviceNum = setTextCtrlIfDevNumValid(m_textCtrlTxIn,
+ m_listCtrlTxInDevices,
+ g_soundCard2InDeviceNum);
+
+ txOutAudioDeviceNum = setTextCtrlIfDevNumValid(m_textCtrlTxOut,
+ m_listCtrlTxOutDevices,
+ g_soundCard1OutDeviceNum);
+
+ if ((rxInAudioDeviceNum != -1) && (txOutAudioDeviceNum != -1)) {
+ m_cbSampleRateRxIn->SetValue(wxString::Format(wxT("%i"),g_soundCard1SampleRate));
+ m_cbSampleRateTxOut->SetValue(wxString::Format(wxT("%i"),g_soundCard1SampleRate));
+ }
+
+ if ((txInAudioDeviceNum != -1) && (rxOutAudioDeviceNum != -1)) {
+ m_cbSampleRateTxIn->SetValue(wxString::Format(wxT("%i"),g_soundCard2SampleRate));
+ m_cbSampleRateRxOut->SetValue(wxString::Format(wxT("%i"),g_soundCard2SampleRate));
+ }
+ }
+ printf(" rxInAudioDeviceNum: %d\n rxOutAudioDeviceNum: %d\n txInAudioDeviceNum: %d\n txOutAudioDeviceNum: %d\n",
+ rxInAudioDeviceNum, rxOutAudioDeviceNum, txInAudioDeviceNum, txOutAudioDeviceNum);
}
+
if(inout == EXCHANGE_DATA_OUT)
{
- wxGetApp().m_strRxInAudio = m_textCtrlRxIn->GetValue();
- wxGetApp().m_strRxOutAudio = m_textCtrlRxOut->GetValue();
- wxGetApp().m_textVoiceInput = m_textCtrlTxIn->GetValue();
- wxGetApp().m_textVoiceOutput = m_textCtrlTxOut->GetValue();
-
- pConfig->Write(wxT("/Audio/RxIn"), wxGetApp().m_strRxInAudio);
- pConfig->Write(wxT("/Audio/RxOut"), wxGetApp().m_strRxOutAudio);
- pConfig->Write(wxT("/Audio/TxIn"), wxGetApp().m_textVoiceInput);
- pConfig->Write(wxT("/Audio/TxOut"), wxGetApp().m_textVoiceOutput);
- pConfig->Write(wxT("/Audio/SampleRate"), wxGetApp().m_strSampleRate);
+ int valid_one_card_config = 0;
+ int valid_two_card_config = 0;
+ wxString sampleRate1, sampleRate2;
+
+ printf("EXCHANGE_DATA_OUT:\n");
+ printf(" rxInAudioDeviceNum: %d\n rxOutAudioDeviceNum: %d\n txInAudioDeviceNum: %d\n txOutAudioDeviceNum: %d\n",
+ rxInAudioDeviceNum, rxOutAudioDeviceNum, txInAudioDeviceNum, txOutAudioDeviceNum);
+
+ // ---------------------------------------------------------------
+ // check we have a valid 1 or 2 sound card configuration
+ // ---------------------------------------------------------------
+
+ // one sound card config, tx device numbers should be set to -1
+
+ if ((rxInAudioDeviceNum != -1) && (rxOutAudioDeviceNum != -1) &&
+ (txInAudioDeviceNum == -1) && (txOutAudioDeviceNum == -1)) {
+
+ valid_one_card_config = 1;
+
+ // in and out sample rate must be the same, as there is one callback
+
+ sampleRate1 = m_cbSampleRateRxIn->GetValue();
+ if (!sampleRate1.IsSameAs(m_cbSampleRateRxOut->GetValue())) {
+ wxMessageBox(wxT("With a single sound card the Sample Rate of "
+ "From Radio and To Speaker/Headphones must be the same."), wxT(""), wxOK);
+ return -1;
+ }
+ }
+
+ // two card configuration
+
+ if ((rxInAudioDeviceNum != -1) && (rxOutAudioDeviceNum != -1) &&
+ (txInAudioDeviceNum != -1) && (txOutAudioDeviceNum != -1)) {
+
+ valid_two_card_config = 1;
+
+ // Check we haven't doubled up on sound devices
+
+ if (rxInAudioDeviceNum == txInAudioDeviceNum) {
+ wxMessageBox(wxT("You must use different devices for From Radio and From Microphone"), wxT(""), wxOK);
+ return -1;
+ }
+
+ if (rxOutAudioDeviceNum == txOutAudioDeviceNum) {
+ wxMessageBox(wxT("You must use different devices for To Radio and To Speaker/Headphones"), wxT(""), wxOK);
+ return -1;
+ }
+
+ // Check sample rates for callback 1 devices are the same,
+ // as input and output are handled synchronously by one
+ // portaudio callback
+
+ sampleRate1 = m_cbSampleRateRxIn->GetValue();
+ if (!sampleRate1.IsSameAs(m_cbSampleRateTxOut->GetValue())) {
+ wxMessageBox(wxT("With two sound cards the Sample Rate "
+ "of From Radio and To Radio must be the same."), wxT(""), wxOK);
+ return -1;
+ }
+
+ // check sample rate for callback 2 devices is the same
+
+ sampleRate2 = m_cbSampleRateTxIn->GetValue();
+ if (!sampleRate2.IsSameAs(m_cbSampleRateRxOut->GetValue())) {
+ wxMessageBox(wxT("With two sound cards the Sample Rate of "
+ "From Microphone and To Speaker/Headphones must be the same."), wxT(""), wxOK);
+ return -1;
+ }
+
+ }
+
+ printf(" valid_one_card_config: %d valid_two_card_config: %d\n", valid_one_card_config, valid_two_card_config);
+
+ if (!valid_one_card_config && !valid_two_card_config) {
+ wxMessageBox(wxT("Invalid one or two sound card configuration"), wxT(""), wxOK);
+ return -1;
+ }
+
+ // ---------------------------------------------------------------
+ // Map Rx/TX device numbers to sound card device numbers used
+ // in callbacks. Portaudio uses one callback per sound card so
+ // we have to be soundcard oriented at run time rather than
+ // Tx/Rx oriented as in this dialog.
+ // ---------------------------------------------------------------
+
+ g_nSoundCards = 0;
+ g_soundCard1InDeviceNum = g_soundCard1OutDeviceNum = g_soundCard2InDeviceNum = g_soundCard2OutDeviceNum = -1;
+
+ if (valid_one_card_config) {
+
+ // Only callback 1 used
+
+ g_nSoundCards = 1;
+ g_soundCard1InDeviceNum = rxInAudioDeviceNum;
+ g_soundCard1OutDeviceNum = rxOutAudioDeviceNum;
+ g_soundCard1SampleRate = wxAtoi(sampleRate1);
+ }
+
+ if (valid_two_card_config) {
+ g_nSoundCards = 2;
+ g_soundCard1InDeviceNum = rxInAudioDeviceNum;
+ g_soundCard1OutDeviceNum = txOutAudioDeviceNum;
+ g_soundCard1SampleRate = wxAtoi(sampleRate1);
+ g_soundCard2InDeviceNum = txInAudioDeviceNum;
+ g_soundCard2OutDeviceNum = rxOutAudioDeviceNum;
+ g_soundCard2SampleRate = wxAtoi(sampleRate2);
+ }
+
+ printf(" g_nSoundCards: %d\n", g_nSoundCards);
+ printf(" g_soundCard1InDeviceNum: %d\n", g_soundCard1InDeviceNum);
+ printf(" g_soundCard1OutDeviceNum: %d\n", g_soundCard1OutDeviceNum);
+ printf(" g_soundCard1SampleRate: %d\n", g_soundCard1SampleRate);
+ printf(" g_soundCard2InDeviceNum: %d\n", g_soundCard2InDeviceNum);
+ printf(" g_soundCard2OutDeviceNum: %d\n", g_soundCard2OutDeviceNum);
+ printf(" g_soundCard2SampleRate: %d\n", g_soundCard2SampleRate);
+
+ wxConfigBase *pConfig = wxConfigBase::Get();
+ pConfig->Write(wxT("/Audio/soundCard1InDeviceNum"), g_soundCard1InDeviceNum);
+ pConfig->Write(wxT("/Audio/soundCard1OutDeviceNum"), g_soundCard1OutDeviceNum);
+ pConfig->Write(wxT("/Audio/soundCard1SampleRate"), g_soundCard1SampleRate );
+
+ pConfig->Write(wxT("/Audio/soundCard2InDeviceNum"), g_soundCard2InDeviceNum);
+ pConfig->Write(wxT("/Audio/soundCard2OutDeviceNum"), g_soundCard2OutDeviceNum);
+ pConfig->Write(wxT("/Audio/soundCard2SampleRate"), g_soundCard2SampleRate );
+
pConfig->Flush();
+ delete wxConfigBase::Set((wxConfigBase *) NULL);
}
- delete wxConfigBase::Set((wxConfigBase *) NULL);
+
+ return 0;
}
-\r
-/*\r
-//-------------------------------------------------------------------------\r
-// OnDeviceSelect()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::OnDeviceSelect(wxListEvent& event)\r
-{\r
- wxListItem info;\r
- long item;\r
- item = m_listCtrlRxInDevices->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);\r
- wxMessageBox(m_listCtrlRxInDevices->GetItemText(item, 2), wxT("Item"), wxOK);\r
-}\r
-*/\r
-\r
-//-------------------------------------------------------------------------\r
-// DisplaySupportedSampleRates()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::DisplaySupportedSampleRates(AudioInfoDisplay ai)\r
-{\r
- static double standardSampleRates[] =\r
- {\r
- 8000.0, 9600.0,\r
- 11025.0, 12000.0,\r
- 16000.0, 22050.0,\r
- 24000.0, 32000.0,\r
- 44100.0, 48000.0,\r
- 88200.0, 96000.0,\r
- 192000.0, -1 // negative terminated list\r
- };\r
- int i;\r
- //int printCount;\r
- //PaError err;\r
- wxString str;\r
-\r
- //printCount = 0;\r
- for(i = 0; standardSampleRates[i] > 0; i++)\r
- {\r
- str.Printf("%8.2f", standardSampleRates[i]);\r
- ai.m_cbSampleRate->AppendString(str);\r
-/*\r
- err = Pa_IsFormatSupported(ai.inputParameters, outputParameters, standardSampleRates[i]);\r
- if(err == paFormatIsSupported)\r
- {\r
- str.Printf("%8.2f", standardSampleRates[i]);\r
- ai.m_cbSampleRate->AppendString(str);\r
- }\r
-\r
- err = Pa_IsFormatSupported(ai->inputParameters, outputParameters, standardSampleRates[i]);\r
- if(err == paFormatIsSupported)\r
- {\r
- if(printCount == 0)\r
- {\r
- printf("\t%8.2f", standardSampleRates[i]);\r
- printCount = 1;\r
- }\r
- else if(printCount == 4)\r
- {\r
- printf(",\n\t%8.2f", standardSampleRates[i]);\r
- printCount = 1;\r
- }\r
- else\r
- {\r
- printf(", %8.2f", standardSampleRates[i]);\r
- ++printCount;\r
- }\r
- }\r
-*/\r
- }\r
- ai.m_cbSampleRate->SetSelection(9);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// GetAPIInfo()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::showAPIInfo()\r
-{\r
- wxString strval;\r
- int apiCount = 0;\r
- int numDevices = 0;\r
-\r
- strval = Pa_GetVersionText();\r
- m_textStringVer->SetValue(strval);\r
-\r
- numDevices = Pa_GetVersion();\r
- strval.Printf(wxT("%d"), numDevices);\r
- m_textIntVer->SetValue(strval);\r
-\r
- apiCount = Pa_GetHostApiCount();\r
- strval.Printf(wxT("%d"), apiCount);\r
- m_textAPICount->SetValue(strval);\r
-\r
- numDevices = Pa_GetDeviceCount();\r
- strval.Printf(wxT("%d"), numDevices);\r
- m_textCDevCount->SetValue(strval);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// populateParams()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::populateParams(AudioInfoDisplay ai)\r
-{\r
- const PaDeviceInfo *deviceInfo = NULL;\r
- int j = 0;\r
- wxListCtrl* ctrl = ai.m_listDevices;\r
- int in_out = ai.direction;\r
- long idx;\r
- bool defaultDisplayed = false;\r
- int numDevices;\r
- wxListItem listItem;\r
- wxString buf;\r
- int devn;\r
- int col = 0;\r
-\r
- numDevices = Pa_GetDeviceCount();\r
-\r
- if(ctrl->GetColumnCount() > 0)\r
- {\r
- ctrl->ClearAll();\r
- }\r
- listItem.SetAlign(wxLIST_FORMAT_CENTRE);\r
- listItem.SetText(wxT("Dflt"));\r
- idx = ctrl->InsertColumn(col, listItem);\r
- ctrl->SetColumnWidth(col++, 37);\r
-\r
- listItem.SetAlign(wxLIST_FORMAT_LEFT);\r
- listItem.SetText(wxT("Device"));\r
- idx = ctrl->InsertColumn(col, listItem);\r
- ctrl->SetColumnWidth(col++, 190);\r
-\r
- listItem.SetAlign(wxLIST_FORMAT_LEFT);\r
- listItem.SetText(wxT("API"));\r
- idx = ctrl->InsertColumn(col, listItem);\r
- ctrl->SetColumnWidth(col++, 190);\r
-\r
- if(in_out == AUDIO_IN)\r
- {\r
- listItem.SetAlign(wxLIST_FORMAT_CENTRE);\r
- listItem.SetText(wxT("# Inputs"));\r
- idx = ctrl->InsertColumn(col, listItem);\r
- ctrl->SetColumnWidth(col++, 75);\r
- }\r
- else if(in_out == AUDIO_OUT)\r
- {\r
- listItem.SetAlign(wxLIST_FORMAT_CENTRE);\r
- listItem.SetText(wxT("# Outputs"));\r
- idx = ctrl->InsertColumn(col, listItem);\r
- ctrl->SetColumnWidth(col++, 75);\r
- }\r
-\r
- listItem.SetAlign(wxLIST_FORMAT_CENTRE);\r
- listItem.SetText(wxT("Min Latency"));\r
- ctrl->InsertColumn(col, listItem);\r
- ctrl->SetColumnWidth(col++, 100);\r
-\r
- listItem.SetAlign(wxLIST_FORMAT_CENTRE);\r
- listItem.SetText(wxT("Max Latency"));\r
- ctrl->InsertColumn(col, listItem);\r
- ctrl->SetColumnWidth(col++, 100);\r
-\r
- for(devn = 0; devn < numDevices; devn++)\r
- {\r
- buf.Printf(wxT(""));\r
- deviceInfo = Pa_GetDeviceInfo(devn);\r
- if(in_out == AUDIO_IN)\r
- {\r
- if(deviceInfo->maxInputChannels > 0)\r
- {\r
- col = 0;\r
- defaultDisplayed = false;\r
- if(devn == Pa_GetDefaultInputDevice())\r
- {\r
- buf.Printf("->>");\r
- defaultDisplayed = true;\r
- }\r
- else if(devn == Pa_GetHostApiInfo(deviceInfo->hostApi)->defaultInputDevice)\r
- {\r
- buf.Printf("-->");\r
- defaultDisplayed = true;\r
- }\r
- else\r
- {\r
- buf.Printf("---");\r
- defaultDisplayed = false;\r
- }\r
- idx = ctrl->InsertItem(idx, buf);\r
- col++;\r
- buf.Printf(wxT("%s"), deviceInfo->name);\r
- ctrl->SetItem(idx, col++, buf);\r
- if(defaultDisplayed)\r
- {\r
- ai.m_textDevice->SetValue(buf);\r
- }\r
-\r
- buf.Printf(wxT("%s"), Pa_GetHostApiInfo(deviceInfo->hostApi)->name);\r
- ctrl->SetItem(idx, col++, buf);\r
-\r
- buf.Printf(wxT("%i"), deviceInfo->maxInputChannels);\r
- ctrl->SetItem(idx, col++, buf);\r
-\r
- buf.Printf(wxT("%8.4f"), deviceInfo->defaultLowInputLatency);\r
- ctrl->SetItem(idx, col++, buf);\r
-\r
- buf.Printf(wxT("%8.4f"), deviceInfo->defaultHighInputLatency);\r
- ctrl->SetItem(idx, col++, buf);\r
- }\r
- }\r
- else if(in_out == AUDIO_OUT)\r
- {\r
- col = 0;\r
- if(deviceInfo->maxOutputChannels > 0)\r
- {\r
- defaultDisplayed = false;\r
- if(devn == Pa_GetDefaultOutputDevice())\r
- {\r
- buf.Printf("<<-");\r
- defaultDisplayed = true;\r
- }\r
- else if(devn == Pa_GetHostApiInfo(deviceInfo->hostApi)->defaultOutputDevice)\r
- {\r
- buf.Printf("<--");\r
- defaultDisplayed = true;\r
- }\r
- else\r
- {\r
- buf.Printf("---");\r
- defaultDisplayed = false;\r
- }\r
- idx = ctrl->InsertItem(idx, buf);\r
- col++;\r
- buf.Printf(wxT("%s"), deviceInfo->name);\r
- ctrl->SetItem(idx, col++, buf);\r
- if(defaultDisplayed)\r
- {\r
- ai.m_textDevice->SetValue(buf);\r
- }\r
-\r
- buf.Printf(wxT("%s"), Pa_GetHostApiInfo(deviceInfo->hostApi)->name);\r
- ctrl->SetItem(idx, col++, buf);\r
-\r
- buf.Printf(wxT("%i"), deviceInfo->maxOutputChannels);\r
- ctrl->SetItem(idx, col++, buf);\r
-\r
- buf.Printf(wxT("%8.4f"), deviceInfo->defaultLowOutputLatency);\r
- ctrl->SetItem(idx, col++, buf);\r
-\r
- buf.Printf(wxT("%8.4f"), deviceInfo->defaultHighOutputLatency);\r
- ctrl->SetItem(idx, col++, buf);\r
- }\r
- }\r
- j++;\r
- }\r
- DisplaySupportedSampleRates(ai);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnRxInDeviceSelect()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::OnRxInDeviceSelect(wxListEvent& evt)\r
-{\r
- wxString str;\r
- int index = evt.GetIndex();\r
-\r
- str = m_listCtrlRxInDevices->GetItemText(index, 1);\r
- m_textCtrlRxIn->SetValue(str);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnRxOutDeviceSelect()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::OnRxOutDeviceSelect(wxListEvent& evt)\r
-{\r
- wxString str;\r
- int index = evt.GetIndex();\r
-\r
- str = m_listCtrlRxOutDevices->GetItemText(index, 1);\r
- m_textCtrlRxOut->SetValue(str);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnTxInDeviceSelect()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::OnTxInDeviceSelect(wxListEvent& evt)\r
-{\r
- wxString str;\r
- int index = evt.GetIndex();\r
-\r
- str = m_listCtrlTxInDevices->GetItemText(index, 1);\r
- m_textCtrlTxIn->SetValue(str);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnTxOutDeviceSelect()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::OnTxOutDeviceSelect(wxListEvent& evt)\r
-{\r
- wxString str;\r
- int index = evt.GetIndex();\r
-\r
- str = m_listCtrlTxOutDevices->GetItemText(index, 1);\r
- m_textCtrlTxOut->SetValue(str);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnRefreshClick()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::OnRefreshClick(wxCommandEvent& event)\r
-{\r
- m_notebook1->SetSelection(0);\r
- showAPIInfo();\r
- populateParams(m_RxInDevices);\r
- populateParams(m_RxOutDevices);\r
- populateParams(m_TxInDevices);\r
- populateParams(m_TxOutDevices);\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnApplyAudioParameters()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::OnApplyAudioParameters(wxCommandEvent& event)\r
-{\r
+
+/*
+//-------------------------------------------------------------------------
+// OnDeviceSelect()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::OnDeviceSelect(wxListEvent& event)
+{
+ wxListItem info;
+ long item;
+ item = m_listCtrlRxInDevices->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
+ wxMessageBox(m_listCtrlRxInDevices->GetItemText(item, 2), wxT("Item"), wxOK);
+}
+*/
+
+//-------------------------------------------------------------------------
+// DisplaySupportedSampleRates()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::DisplaySupportedSampleRates(AudioInfoDisplay ai)
+{
+ static double standardSampleRates[] =
+ {
+ 8000.0, 9600.0,
+ 11025.0, 12000.0,
+ 16000.0, 22050.0,
+ 24000.0, 32000.0,
+ 44100.0, 48000.0,
+ 88200.0, 96000.0,
+ 192000.0, -1 // negative terminated list
+ };
+ int i;
+ wxString str;
+
+ //printCount = 0;
+ for(i = 0; standardSampleRates[i] > 0; i++)
+ {
+ str.Printf("%6.0f", standardSampleRates[i]);
+ ai.m_cbSampleRate->AppendString(str);
+
+ }
+ ai.m_cbSampleRate->SetSelection(9);
+}
+
+//-------------------------------------------------------------------------
+// GetAPIInfo()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::showAPIInfo()
+{
+ wxString strval;
+ int apiVersion;
+ int apiCount = 0;
+ int numDevices = 0;
+
+ strval = Pa_GetVersionText();
+ m_textStringVer->SetValue(strval);
+
+ apiVersion = Pa_GetVersion();
+ strval.Printf(wxT("%d"), apiVersion);
+ m_textIntVer->SetValue(strval);
+
+ apiCount = Pa_GetHostApiCount();
+ strval.Printf(wxT("%d"), apiCount);
+ m_textAPICount->SetValue(strval);
+
+ numDevices = Pa_GetDeviceCount();
+ strval.Printf(wxT("%d"), numDevices);
+ m_textCDevCount->SetValue(strval);
+}
+
+//-------------------------------------------------------------------------
+// populateParams()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::populateParams(AudioInfoDisplay ai)
+{
+ const PaDeviceInfo *deviceInfo = NULL;
+ int j = 0;
+ wxListCtrl* ctrl = ai.m_listDevices;
+ int in_out = ai.direction;
+ long idx;
+ bool defaultDisplayed = false;
+ int numDevices;
+ wxListItem listItem;
+ wxString buf;
+ int devn;
+ int col = 0;
+
+ numDevices = Pa_GetDeviceCount();
+ printf("numDevices: %d\n", numDevices);
+
+ if(ctrl->GetColumnCount() > 0)
+ {
+ ctrl->ClearAll();
+ }
+
+ #ifdef DFT_COL
+ listItem.SetAlign(wxLIST_FORMAT_CENTRE);
+ listItem.SetText(wxT("Dflt"));
+ idx = ctrl->InsertColumn(col, listItem);
+ ctrl->SetColumnWidth(col++, 37);
+ #endif
+
+ listItem.SetAlign(wxLIST_FORMAT_LEFT);
+ listItem.SetText(wxT("Device"));
+ idx = ctrl->InsertColumn(col, listItem);
+ ctrl->SetColumnWidth(col++, 190);
+
+ listItem.SetAlign(wxLIST_FORMAT_LEFT);
+ listItem.SetText(wxT("API"));
+ idx = ctrl->InsertColumn(col, listItem);
+ ctrl->SetColumnWidth(col++, 190);
+
+ if(in_out == AUDIO_IN)
+ {
+ listItem.SetAlign(wxLIST_FORMAT_CENTRE);
+ listItem.SetText(wxT("Default Sample Rate"));
+ idx = ctrl->InsertColumn(col, listItem);
+ ctrl->SetColumnWidth(col++, 160);
+ }
+ else if(in_out == AUDIO_OUT)
+ {
+ listItem.SetAlign(wxLIST_FORMAT_CENTRE);
+ listItem.SetText(wxT("Default Sample Rate"));
+ idx = ctrl->InsertColumn(col, listItem);
+ ctrl->SetColumnWidth(col++, 160);
+ }
+
+ listItem.SetAlign(wxLIST_FORMAT_CENTRE);
+ listItem.SetText(wxT("Min Latency"));
+ ctrl->InsertColumn(col, listItem);
+ ctrl->SetColumnWidth(col++, 100);
+
+ listItem.SetAlign(wxLIST_FORMAT_CENTRE);
+ listItem.SetText(wxT("Max Latency"));
+ ctrl->InsertColumn(col, listItem);
+ ctrl->SetColumnWidth(col++, 100);
+
+ for(devn = 0; devn < numDevices; devn++)
+ {
+ buf.Printf(wxT(""));
+ deviceInfo = Pa_GetDeviceInfo(devn);
+ if(in_out == AUDIO_IN)
+ {
+ if(deviceInfo->maxInputChannels > 0)
+ {
+ col = 0;
+
+ #ifdef DFT_COL
+ defaultDisplayed = false;
+ if(devn == Pa_GetDefaultInputDevice())
+ {
+ buf.Printf("->>");
+ defaultDisplayed = true;
+ }
+ else if(devn == Pa_GetHostApiInfo(deviceInfo->hostApi)->defaultInputDevice)
+ {
+ buf.Printf("-->");
+ defaultDisplayed = true;
+ }
+ else
+ {
+ buf.Printf("---");
+ defaultDisplayed = false;
+ }
+ idx = ctrl->InsertItem(idx, buf);
+ col++;
+ #endif
+
+ buf.Printf(wxT("%s"), deviceInfo->name);
+ idx = ctrl->InsertItem(ctrl->GetItemCount(), buf);
+ col++;
+ if(defaultDisplayed)
+ {
+ ai.m_textDevice->SetValue(buf);
+ }
+
+ buf.Printf(wxT("%s"), Pa_GetHostApiInfo(deviceInfo->hostApi)->name);
+ ctrl->SetItem(idx, col++, buf);
+
+ buf.Printf(wxT("%6.0f"), deviceInfo->defaultSampleRate);
+ ctrl->SetItem(idx, col++, buf);
+
+ buf.Printf(wxT("%8.4f"), deviceInfo->defaultLowInputLatency);
+ ctrl->SetItem(idx, col++, buf);
+
+ buf.Printf(wxT("%8.4f"), deviceInfo->defaultHighInputLatency);
+ ctrl->SetItem(idx, col++, buf);
+ }
+ }
+ else if(in_out == AUDIO_OUT)
+ {
+ col = 0;
+ if(deviceInfo->maxOutputChannels > 0)
+ {
+ #ifdef DFT_COL
+ defaultDisplayed = false;
+ if(devn == Pa_GetDefaultOutputDevice())
+ {
+ buf.Printf("<<-");
+ defaultDisplayed = true;
+ }
+ else if(devn == Pa_GetHostApiInfo(deviceInfo->hostApi)->defaultOutputDevice)
+ {
+ buf.Printf("<--");
+ defaultDisplayed = true;
+ }
+ else
+ {
+ buf.Printf("---");
+ defaultDisplayed = false;
+ }
+ #endif
+
+ buf.Printf(wxT("%s"), deviceInfo->name);
+ idx = ctrl->InsertItem(ctrl->GetItemCount(), buf);
+ col++;
+ if(defaultDisplayed)
+ {
+ ai.m_textDevice->SetValue(buf);
+ }
+
+ buf.Printf(wxT("%s"), Pa_GetHostApiInfo(deviceInfo->hostApi)->name);
+ ctrl->SetItem(idx, col++, buf);
+
+ buf.Printf(wxT("%6.0f"), deviceInfo->defaultSampleRate);
+ ctrl->SetItem(idx, col++, buf);
+
+ buf.Printf(wxT("%8.4f"), deviceInfo->defaultLowOutputLatency);
+ ctrl->SetItem(idx, col++, buf);
+
+ buf.Printf(wxT("%8.4f"), deviceInfo->defaultHighOutputLatency);
+ ctrl->SetItem(idx, col++, buf);
+ }
+ }
+ j++;
+
+ }
+
+ // add "none" option at end
+
+ buf.Printf(wxT("%s"), "none");
+ idx = ctrl->InsertItem(ctrl->GetItemCount(), buf);
+
+ DisplaySupportedSampleRates(ai);
+}
+
+//-------------------------------------------------------------------------
+// OnRxInDeviceSelect()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::OnRxInDeviceSelect(wxListEvent& evt)
+{
+ wxString dev, sampleRate;
+ int index = evt.GetIndex();
+
+ dev = m_listCtrlRxInDevices->GetItemText(index, 0);
+ m_textCtrlRxIn->SetValue(dev);
+ if (dev.IsSameAs("none"))
+ rxInAudioDeviceNum = -1;
+ else {
+ rxInAudioDeviceNum = index;
+ sampleRate = m_listCtrlRxInDevices->GetItemText(index, 2);
+ m_cbSampleRateRxIn->SetValue(sampleRate);
+ }
+}
+
+//-------------------------------------------------------------------------
+// OnRxOutDeviceSelect()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::OnRxOutDeviceSelect(wxListEvent& evt)
+{
+ wxString dev, sampleRate;
+ int index = evt.GetIndex();
+
+ dev = m_listCtrlRxOutDevices->GetItemText(index, 0);
+ m_textCtrlRxOut->SetValue(dev);
+ if (dev.IsSameAs("none"))
+ rxOutAudioDeviceNum = -1;
+ else {
+ rxOutAudioDeviceNum = index;
+ sampleRate = m_listCtrlRxOutDevices->GetItemText(index, 2);
+ m_cbSampleRateRxOut->SetValue(sampleRate);
+ }
+}
+
+//-------------------------------------------------------------------------
+// OnTxInDeviceSelect()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::OnTxInDeviceSelect(wxListEvent& evt)
+{
+ wxString dev, sampleRate;
+ int index = evt.GetIndex();
+
+ dev = m_listCtrlTxInDevices->GetItemText(index, 0);
+ m_textCtrlTxIn->SetValue(dev);
+ if (dev.IsSameAs("none"))
+ txInAudioDeviceNum = -1;
+ else {
+ txInAudioDeviceNum = index;
+ sampleRate = m_listCtrlTxInDevices->GetItemText(index, 2);
+ m_cbSampleRateTxIn->SetValue(sampleRate);
+ }
+}
+
+//-------------------------------------------------------------------------
+// OnTxOutDeviceSelect()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::OnTxOutDeviceSelect(wxListEvent& evt)
+{
+ wxString dev, sampleRate;
+ int index = evt.GetIndex();
+
+ dev = m_listCtrlTxOutDevices->GetItemText(index, 0);
+ m_textCtrlTxOut->SetValue(dev);
+ if (dev.IsSameAs("none"))
+ txOutAudioDeviceNum = -1;
+ else {
+ txOutAudioDeviceNum = index;
+ sampleRate = m_listCtrlTxOutDevices->GetItemText(index, 2);
+ m_cbSampleRateTxOut->SetValue(sampleRate);
+ }
+}
+
+//-------------------------------------------------------------------------
+// OnRefreshClick()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::OnRefreshClick(wxCommandEvent& event)
+{
+ // restart portaudio, to re-sample available devices
+
+ Pa_Terminate();
+ Pa_Init();
+
+ m_notebook1->SetSelection(0);
+ showAPIInfo();
+ populateParams(m_RxInDevices);
+ populateParams(m_RxOutDevices);
+ populateParams(m_TxInDevices);
+ populateParams(m_TxOutDevices);
+
+ // some devices may have dissapeared, so possibily change sound
+ // card config
+
+ ExchangeData(EXCHANGE_DATA_IN);
+}
+
+//-------------------------------------------------------------------------
+// OnApplyAudioParameters()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::OnApplyAudioParameters(wxCommandEvent& event)
+{
ExchangeData(EXCHANGE_DATA_OUT);
- if(m_isPaInitialized)\r
- {\r
- if((pa_err = Pa_Terminate()) == paNoError)\r
- {\r
- m_isPaInitialized = false;\r
- }\r
- else\r
- {\r
- wxMessageBox(wxT("Port Audio failed to Terminate"), wxT("Pa_Terminate"), wxOK);\r
- }\r
- }\r
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnCancelAudioParameters()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::OnCancelAudioParameters(wxCommandEvent& event)\r
-{\r
- if(m_isPaInitialized)\r
- {\r
- if((pa_err = Pa_Terminate()) == paNoError)\r
- {\r
- m_isPaInitialized = false;\r
- }\r
- else\r
- {\r
- wxMessageBox(wxT("Port Audio failed to Terminate"), wxT("Pa_Terminate"), wxOK);\r
- }\r
- }\r
+ if(m_isPaInitialized)
+ {
+ if((pa_err = Pa_Terminate()) == paNoError)
+ {
+ m_isPaInitialized = false;
+ }
+ else
+ {
+ wxMessageBox(wxT("Port Audio failed to Terminate"), wxT("Pa_Terminate"), wxOK);
+ }
+ }
+}
+
+//-------------------------------------------------------------------------
+// OnCancelAudioParameters()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::OnCancelAudioParameters(wxCommandEvent& event)
+{
+ if(m_isPaInitialized)
+ {
+ if((pa_err = Pa_Terminate()) == paNoError)
+ {
+ m_isPaInitialized = false;
+ }
+ else
+ {
+ wxMessageBox(wxT("Port Audio failed to Terminate"), wxT("Pa_Terminate"), wxOK);
+ }
+ }
EndModal(wxCANCEL);
-}\r
-\r
-//-------------------------------------------------------------------------\r
-// OnOkAudioParameters()\r
-//-------------------------------------------------------------------------\r
-void AudioOptsDialog::OnOkAudioParameters(wxCommandEvent& event)\r
-{\r
- ExchangeData(EXCHANGE_DATA_OUT);
- if(m_isPaInitialized)\r
- {\r
- if((pa_err = Pa_Terminate()) == paNoError)\r
- {\r
- m_isPaInitialized = false;\r
- }\r
- else\r
- {\r
- wxMessageBox(wxT("Port Audio failed to Terminate"), wxT("Pa_Terminate"), wxOK);\r
- }\r
- }\r
- EndModal(wxOK);
-}\r
+}
+
+//-------------------------------------------------------------------------
+// OnOkAudioParameters()
+//-------------------------------------------------------------------------
+void AudioOptsDialog::OnOkAudioParameters(wxCommandEvent& event)
+{
+ int status = ExchangeData(EXCHANGE_DATA_OUT);
+
+ // We only accept OK if config sucessful
+
+ printf("status: %d m_isPaInitialized: %d\n", status, m_isPaInitialized);
+ if (status == 0) {
+ if(m_isPaInitialized)
+ {
+ if((pa_err = Pa_Terminate()) == paNoError)
+ {
+ printf("terminated OK\n");
+ m_isPaInitialized = false;
+ }
+ else
+ {
+ wxMessageBox(wxT("Port Audio failed to Terminate"), wxT("Pa_Terminate"), wxOK);
+ }
+ }
+ EndModal(wxOK);
+ }
+
+}