diff --git a/src/audiolayerwidget.cpp b/src/audiolayerwidget.cpp index 3c81f6c..c3b1f86 100644 --- a/src/audiolayerwidget.cpp +++ b/src/audiolayerwidget.cpp @@ -72,6 +72,7 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer): layout->addLayout(status); m_filterBank = new FilterBankWidget(this); + connect(m_filterBank, SIGNAL(setBypass(bool)), this, SLOT(setBypass(bool))); layout->addWidget(m_filterBank); QVBoxLayout *volumeBox = new QVBoxLayout; @@ -111,6 +112,12 @@ void AudioLayerWidget::pitchChanged(int value) emit(uiSliderChanged(m_layer, Slider::Pitch, value)); } +void AudioLayerWidget::setBypass(bool value) +{ + emit(uiSliderChanged(m_layer, Slider::Bypass, value)); +} + + void AudioLayerWidget::toggleSuspendResume() { switch (m_status) { diff --git a/src/audiolayerwidget.h b/src/audiolayerwidget.h index 32bd7c7..f3ba1e4 100644 --- a/src/audiolayerwidget.h +++ b/src/audiolayerwidget.h @@ -53,6 +53,7 @@ private slots: void volumeChanged(int vol); void panChanged(int pan); void pitchChanged(int pitch); + void setBypass(bool value); signals: void uiPlaybackChanged(int layer, Status s); diff --git a/src/defines.h b/src/defines.h index 23d3322..0c78cd9 100644 --- a/src/defines.h +++ b/src/defines.h @@ -64,6 +64,7 @@ enum Slider Volume, Pan, Pitch, + Bypass }; #include diff --git a/src/filterbankwidget.cpp b/src/filterbankwidget.cpp index c07453a..e3e9790 100644 --- a/src/filterbankwidget.cpp +++ b/src/filterbankwidget.cpp @@ -22,8 +22,13 @@ FilterBankWidget::FilterBankWidget(QWidget *parent) fb[i]->setObjectName(name); fb[i]->setToolTip(name); } + QVBoxLayout *master = new QVBoxLayout; fb[0]->setRange(0, 500); - layout->insertWidget(0, fb[0]); + m_bypass = new QCheckBox; + connect(m_bypass, SIGNAL(stateChanged(int)), this, SLOT(bypassChanged(int))); + master->addWidget(m_bypass); + master->addWidget(fb[0]); + layout->addLayout(master); for (int i = 1; i < 13;) { QVBoxLayout *filterLayout= new QVBoxLayout; for (int j = i; j < i + 3; j++) { @@ -79,3 +84,11 @@ void FilterBankWidget::setValue(int filter, int value) } fb[filter]->setValue(result); } + +void FilterBankWidget::bypassChanged(int value) +{ + if (value == 0) + emit setBypass(false); + else + emit setBypass(true); +} diff --git a/src/filterbankwidget.h b/src/filterbankwidget.h index 07f2e9b..bb36ef2 100644 --- a/src/filterbankwidget.h +++ b/src/filterbankwidget.h @@ -3,6 +3,7 @@ #include #include +#include #include "clickabledoublespinbox.h" @@ -12,11 +13,14 @@ class FilterBankWidget : public QWidget public: explicit FilterBankWidget(QWidget *parent = nullptr); ClickableDoubleSpinBox *fb[13]; + QCheckBox *m_bypass; void setValue(int filter, int value); +private slots: + void bypassChanged(int value); signals: - + void setBypass(bool value); }; #endif // FILTERBANKWIDGET_H diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index 0c42e86..2916007 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -249,6 +249,8 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value) case Slider::Pitch: m_mae.pitchChanged(layer, value); break; + case Slider::Bypass: + m_mae.setBypass(m_dmxSettings.at(layer).audioDevice, layer, value); } } diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index 6bdeb2d..adce7ac 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -65,6 +65,13 @@ ma_result MiniAudioEngine::createFilterBank(int id, uint layer) ma_node *endpoint = ma_engine_get_endpoint(&m_engine[id]); filterBank *fb = &m_filterBank[id][layer]; + ma_splitter_node_config splitterConfig = ma_splitter_node_config_init(CHANNELS); + result = ma_splitter_node_init(ng, &splitterConfig, NULL, &fb->input); + if (result != MA_SUCCESS) { + cout << "ERROR " << result << ": Failed to initialize input node." << endl; + return result; + } + fb->hpfConfig = ma_hpf_node_config_init(CHANNELS, SAMPLE_RATE, 16, FILTER_ORDER); result = ma_hpf_node_init(ng, &fb->hpfConfig, NULL, &fb->hpf); if (result != MA_SUCCESS) { @@ -100,13 +107,23 @@ ma_result MiniAudioEngine::createFilterBank(int id, uint layer) return result; } - ma_splitter_node_config splitterConfig = ma_splitter_node_config_init(CHANNELS); result = ma_splitter_node_init(ng, &splitterConfig, NULL, &fb->output); if (result != MA_SUCCESS) { cout << "ERROR " << result << ": Failed to initialize output node." << endl; return result; } + result = ma_node_attach_output_bus(&fb->input, 0, &fb->hpf, 0); + if (result != MA_SUCCESS) { + cout << "ERROR " << result << ": Failed to attach input node." << endl; + return result; + } + result = ma_node_attach_output_bus(&fb->input, 1, &fb->output, 0); + if (result != MA_SUCCESS) { + cout << "ERROR " << result << ": Failed to attach high pass pass filter node." << endl; + return result; + } + ma_node_set_output_bus_volume(&fb->input, 1, 0.0f); result = ma_node_attach_output_bus(&fb->hpf, 0, &fb->loshelf, 0); if (result != MA_SUCCESS) { cout << "ERROR " << result << ": Failed to attach high pass pass filter node." << endl; @@ -256,7 +273,7 @@ ma_result MiniAudioEngine::loadMedia(int layer, char *file, uint audioDevice) cout << "Error " << result << ": Failed to load file " << file << endl; return result; } - result = ma_node_attach_output_bus(&m_currentSound[layer], 0, &m_filterBank[audioDevice][layer].hpf, 0); + result = ma_node_attach_output_bus(&m_currentSound[layer], 0, &m_filterBank[audioDevice][layer].input, 0); if (result != MA_SUCCESS) { cout << "Error " << result << ": Failed to attach output bus " << audioDevice << endl; //return result; @@ -526,3 +543,17 @@ ma_result MiniAudioEngine::filterParamChanged(int layer, int audioDevice, int ch } return (result); } + +bool MiniAudioEngine::setBypass(int audioDevice, int layer, bool bypass) +{ + filterBank *fb = &m_filterBank[audioDevice][layer]; + + if (bypass) { + ma_node_set_output_bus_volume(&fb->input, 1, 1.0f); + ma_node_set_output_bus_volume(&fb->input, 0, 0.0f); + } else { + ma_node_set_output_bus_volume(&fb->input, 1, 0.0f); + ma_node_set_output_bus_volume(&fb->input, 0, 1.0f); + } + +} diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h index 332c1bf..b55311b 100644 --- a/src/miniaudioengine.h +++ b/src/miniaudioengine.h @@ -19,6 +19,7 @@ using namespace std; typedef struct { + ma_splitter_node input; ma_hpf_node hpf; ma_hpf_node_config hpfConfig; ma_loshelf_node loshelf; @@ -43,6 +44,7 @@ public: bool startEngine(uint layersQty); bool startDevice(uint *id, uint nb); static void audioDataCallback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount); + bool setBypass(int audioDevice, int layer, bool bypass); protected: ma_result loadMedia(int layer, char *media, uint audioDevice);