From c9f1a2b33586116b14b2da572eaecad1f7e6825b Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 26 Feb 2020 18:47:55 +0100 Subject: [PATCH] Make it possible to get and set EQ parameters from the theme. --- nageru/mainwindow.cpp | 25 +++++++++++++++++++++ nageru/mainwindow.h | 4 ++++ nageru/theme.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) diff --git a/nageru/mainwindow.cpp b/nageru/mainwindow.cpp index c369f28..20f8e50 100644 --- a/nageru/mainwindow.cpp +++ b/nageru/mainwindow.cpp @@ -1182,6 +1182,19 @@ void MainWindow::set_treble(unsigned bus_idx, float value) set_relative_value_if_exists(bus_idx, &Ui::AudioExpandedView::treble_knob, value); } +void MainWindow::set_eq_absolute(unsigned bus_idx, EQBand eq_band, float value_db) +{ + if (eq_band == EQ_BAND_TREBLE) { + set_db_value_if_exists(bus_idx, &Ui::AudioExpandedView::treble_knob, value_db); + } else if (eq_band == EQ_BAND_MID) { + set_db_value_if_exists(bus_idx, &Ui::AudioExpandedView::mid_knob, value_db); + } else if (eq_band == EQ_BAND_BASS) { + set_db_value_if_exists(bus_idx, &Ui::AudioExpandedView::bass_knob, value_db); + } else { + assert(false); + } +} + void MainWindow::set_mid(unsigned bus_idx, float value) { set_relative_value_if_exists(bus_idx, &Ui::AudioExpandedView::mid_knob, value); @@ -1433,6 +1446,18 @@ void MainWindow::set_relative_value_if_exists(unsigned bus_idx, T *(Ui_AudioExpa } } +void MainWindow::set_db_value_if_exists(unsigned bus_idx, QDial *(Ui_AudioExpandedView::*control), float value_db) +{ + post_to_main_thread([this, bus_idx, control, value_db]{ + if (global_audio_mixer != nullptr && + global_audio_mixer->get_mapping_mode() == AudioMixer::MappingMode::MULTICHANNEL && + bus_idx < audio_expanded_views.size()) { + int value = lrintf(value_db * 10.0f); + (audio_expanded_views[bus_idx]->*control)->setValue(value); + } + }); +} + template void MainWindow::click_button_if_exists(unsigned bus_idx, T *(Ui_AudioExpandedView::*control)) { diff --git a/nageru/mainwindow.h b/nageru/mainwindow.h index 7d6b42a..d5a3624 100644 --- a/nageru/mainwindow.h +++ b/nageru/mainwindow.h @@ -14,6 +14,7 @@ #include "midi_mapper.h" #include "mixer.h" +class QDial; class QEvent; class QObject; class QResizeEvent; @@ -84,6 +85,7 @@ public slots: void set_treble(unsigned bus_idx, float value) override; void set_mid(unsigned bus_idx, float value) override; void set_bass(unsigned bus_idx, float value) override; + void set_eq_absolute(unsigned bus_idx, EQBand eq_band, float value_db); void set_gain(unsigned bus_idx, float value) override; void set_compressor_threshold(unsigned bus_idx, float value) override; void set_fader(unsigned bus_idx, float value) override; @@ -160,6 +162,8 @@ private: template void set_relative_value_if_exists(unsigned bus_idx, T *Ui_AudioExpandedView::*control, float value); + void set_db_value_if_exists(unsigned bus_idx, QDial *Ui_AudioExpandedView::*control, float value_db); + template void click_button_if_exists(unsigned bus_idx, T *Ui_AudioExpandedView::*control); diff --git a/nageru/theme.cpp b/nageru/theme.cpp index ade4e8f..71d6000 100644 --- a/nageru/theme.cpp +++ b/nageru/theme.cpp @@ -1412,6 +1412,52 @@ int Nageru_set_audio_bus_mute(lua_State *L) return 0; } +int Nageru_get_audio_bus_eq_level_db(lua_State *L) +{ + if (global_audio_mixer == nullptr) { + // The audio mixer isn't set up until we know how many FFmpeg inputs we have. + luaL_error(L, "Audio functions can not be called before the theme is done initializing."); + } + + int bus_index = luaL_checknumber(L, 1); + int band = luaL_checknumber(L, 2); + if (bus_index < 0 || size_t(bus_index) >= global_audio_mixer->num_buses()) { + // Doesn't fix the race, but fixes other out-of-bounds. + print_warning(L, "Theme called get_audio_bus_eq_level_db() on nonexistent bus %d; returning 0.0.\n", bus_index); + lua_pushnumber(L, 0.0); + } else if (band != EQ_BAND_BASS && band != EQ_BAND_MID && band != EQ_BAND_TREBLE) { + print_warning(L, "Theme called get_audio_bus_eq_level_db() on nonexistent band; returning 0.0.\n", bus_index); + lua_pushnumber(L, 0.0); + } else { + lua_pushnumber(L, global_audio_mixer->get_eq(bus_index, EQBand(band))); + } + return 1; +} + +int Nageru_set_audio_bus_eq_level_db(lua_State *L) +{ + if (global_audio_mixer == nullptr || global_mainwindow == nullptr) { + // The audio mixer isn't set up until we know how many FFmpeg inputs we have. + luaL_error(L, "Audio functions can not be called before the theme is done initializing."); + } + + int bus_index = luaL_checknumber(L, 1); + int band = luaL_checknumber(L, 2); + if (bus_index < 0 || size_t(bus_index) >= global_audio_mixer->num_buses()) { + // Doesn't fix the race, but fixes other out-of-bounds. + print_warning(L, "Theme called set_audio_bus_eq_level_db() on nonexistent bus %d; ignoring.\n", bus_index); + return 0; + } else if (band != EQ_BAND_BASS && band != EQ_BAND_MID && band != EQ_BAND_TREBLE) { + print_warning(L, "Theme called set_audio_bus_eq_level_db() on nonexistent band; returning 0.0.\n", bus_index); + return 0; + } + double level_db = luaL_checknumber(L, 3); + + // Go through the UI, so that it gets updated. + global_mainwindow->set_eq_absolute(bus_index, EQBand(band), level_db); + return 0; +} + Theme::Theme(const string &filename, const vector &search_dirs, ResourcePool *resource_pool, unsigned num_cards) : resource_pool(resource_pool), num_cards(num_cards), signal_to_card_mapping(global_flags.default_stream_mapping) { @@ -1538,6 +1584,9 @@ void Theme::register_globals() { "VIDEO_FORMAT_YCBCR", bmusb::PixelFormat_8BitYCbCrPlanar }, { "CHECKABLE", MenuEntry::CHECKABLE }, { "CHECKED", MenuEntry::CHECKED }, + { "EQ_BAND_BASS", EQ_BAND_BASS }, + { "EQ_BAND_MID", EQ_BAND_MID }, + { "EQ_BAND_TREBLE", EQ_BAND_TREBLE }, }; const vector> str_constants = { { "THEME_PATH", theme_path }, @@ -1568,6 +1617,8 @@ void Theme::register_globals() { "get_audio_bus_name", Nageru_get_audio_bus_name }, { "get_audio_bus_fader_level_db", Nageru_get_audio_bus_fader_level_db }, { "set_audio_bus_fader_level_db", Nageru_set_audio_bus_fader_level_db }, + { "get_audio_bus_eq_level_db", Nageru_get_audio_bus_eq_level_db }, + { "set_audio_bus_eq_level_db", Nageru_set_audio_bus_eq_level_db }, { "get_audio_bus_mute", Nageru_get_audio_bus_mute }, { "set_audio_bus_mute", Nageru_set_audio_bus_mute }, -- 2.39.2