bSizer30->Add(lpcpfs, 0, wxALL, 0);
+ // Speex pre-processor --------------------------------------------------
+
+ wxStaticBoxSizer* sbSizer_speexpp;
+ wxStaticBox *sb_speexpp = new wxStaticBox(this, wxID_ANY, _("Speex Mic Audio Pre-Processor"));
+ sbSizer_speexpp = new wxStaticBoxSizer(sb_speexpp, wxVERTICAL);
+
+ m_ckboxSpeexpp = new wxCheckBox(this, wxID_ANY, _("Enable"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
+ sb_speexpp->SetToolTip(_("Enable noise supression, dereverberation, AGC of mic signal"));
+ sbSizer_speexpp->Add(m_ckboxSpeexpp, wxALIGN_LEFT, 2);
+
+ bSizer30->Add(sbSizer_speexpp, 0, wxALL, 0);
+
// EQ Filters -----------------------------------------------------------
wxStaticBoxSizer* eqMicInSizer = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, _("Mic In Equaliser")), wxVERTICAL);
m_codec2LPCPostFilterGamma->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnGammaScroll), NULL, this);
m_LPCPostFilterDefault->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FilterDlg::OnLPCPostFilterDefault), NULL, this);
+ m_ckboxSpeexpp->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(FilterDlg::OnSpeexppEnable), NULL, this);
+
m_MicInBass.sliderFreq->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInBassFreqScroll), NULL, this);
m_MicInBass.sliderGain->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInBassGainScroll), NULL, this);
m_MicInTreble.sliderFreq->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInTrebleFreqScroll), NULL, this);
m_beta = wxGetApp().m_codec2LPCPostFilterBeta; setBeta();
m_gamma = wxGetApp().m_codec2LPCPostFilterGamma; setGamma();
+ // Speex Pre-Processor
+
+ m_ckboxSpeexpp->SetValue(wxGetApp().m_speexpp_enable);
+
// Mic In Equaliser
m_MicInBass.freqHz = wxGetApp().m_MicInBassFreqHz;
wxGetApp().m_codec2LPCPostFilterBeta = m_beta;
wxGetApp().m_codec2LPCPostFilterGamma = m_gamma;
+ // Speex Pre-Processor
+
+ wxGetApp().m_speexpp_enable = m_ckboxSpeexpp->GetValue();
+
// Mic In Equaliser
wxGetApp().m_MicInBassFreqHz = m_MicInBass.freqHz;
pConfig->Write(wxT("/Filter/codec2LPCPostFilterBeta"), (int)(m_beta*100.0));
pConfig->Write(wxT("/Filter/codec2LPCPostFilterGamma"), (int)(m_gamma*100.0));
+ pConfig->Write(wxT("/Filter/speexpp_enable"), wxGetApp().m_speexpp_enable);
+
pConfig->Write(wxT("/Filter/MicInBassFreqHz"), (int)m_MicInBass.freqHz);
pConfig->Write(wxT("/Filter/MicInBassGaindB"), (int)(10.0*m_MicInBass.gaindB));
pConfig->Write(wxT("/Filter/MicInTrebleFreqHz"), (int)m_MicInTreble.freqHz);
// immediately change enable flags rather using ExchangeData() so we can switch on and off at run time
+void FilterDlg::OnSpeexppEnable(wxScrollEvent& event) {
+ wxGetApp().m_speexpp_enable = m_ckboxSpeexpp->GetValue();
+}
+
void FilterDlg::OnMicInEnable(wxScrollEvent& event) {
wxGetApp().m_MicInEQEnable = m_MicInEnable->GetValue();
}
public:
FilterDlg( wxWindow* parent, bool running, bool *newMicInFilter, bool *newSpkOutFilter,
wxWindowID id = wxID_ANY, const wxString& title = _("Filter"),
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 800, 600 ),
+ const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 800, 630 ),
long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~FilterDlg();
void OnEnable(wxScrollEvent& event);
void OnBassBoost(wxScrollEvent& event);
+ void OnSpeexppEnable(wxScrollEvent& event);
+
void OnMicInBassFreqScroll(wxScrollEvent& event) { sliderToFreq(&m_MicInBass, true); }
void OnMicInBassGainScroll(wxScrollEvent& event) { sliderToGain(&m_MicInBass, true); }
void OnMicInTrebleFreqScroll(wxScrollEvent& event) { sliderToFreq(&m_MicInTreble, true); }
wxStaticText* m_staticTextGamma;
wxButton* m_LPCPostFilterDefault;
+ wxCheckBox* m_ckboxSpeexpp;
+
wxStdDialogButtonSizer* m_sdbSizer5;
wxButton* m_sdbSizer5OK;
wxButton* m_sdbSizer5Cancel;
wxMutex g_mutexProtectingCallbackData;
+// Speex pre-processor states
+
+SpeexPreprocessState *g_speex_st;
+
// WxWidgets - initialize the application
IMPLEMENT_APP(MainApp);
wxGetApp().m_codec2LPCPostFilterBeta = (float)pConfig->Read(wxT("/Filter/codec2LPCPostFilterBeta"), CODEC2_LPC_PF_BETA*100)/100.0;
//printf("main(): m_codec2LPCPostFilterBeta: %f\n", wxGetApp().m_codec2LPCPostFilterBeta);
+ wxGetApp().m_speexpp_enable = pConfig->Read(wxT("/Filter/speexpp_enable"), t);
+
wxGetApp().m_MicInBassFreqHz = (float)pConfig->Read(wxT("/Filter/MicInBassFreqHz"), 1);
wxGetApp().m_MicInBassGaindB = (float)pConfig->Read(wxT("/Filter/MicInBassGaindB"), (long)0)/10.0;
wxGetApp().m_MicInTrebleFreqHz = (float)pConfig->Read(wxT("/Filter/MicInTrebleFreqHz"), 1);
optionsDlg = new OptionsDlg(NULL);
m_schedule_restore = false;
+
+ // Init Speex pre-processor states
+ // by inspecting Speex source it seems that only denoiser is on be default
+
+ g_speex_st = speex_preprocess_state_init(2*N8, FS);
+
}
//-------------------------------------------------------------------------
}
g_mutexProtectingCallbackData.Unlock();
+ // Optional Speex pre-perocessor
+
+ if (wxGetApp().m_speexpp_enable) {
+ speex_preprocess_run(g_speex_st, in8k_short);
+ }
+
// Optional Mic In EQ Filtering, need mutex as filter can change at run time
+
g_mutexProtectingCallbackData.Lock();
if (cbData->micInEQEnable) {
sox_biquad_filter(cbData->sbqMicInBass, in8k_short, in8k_short, nout);