]> git.sesse.net Git - nageru/commitdiff
Make it possible to get and set EQ parameters from the theme.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 26 Feb 2020 17:47:55 +0000 (18:47 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 26 Feb 2020 17:48:23 +0000 (18:48 +0100)
nageru/mainwindow.cpp
nageru/mainwindow.h
nageru/theme.cpp

index c369f28993452aea9d610834b32b0c8c4eb19a73..20f8e50dbc6ec189310b20e6b7337d19b826062d 100644 (file)
@@ -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<class T>
 void MainWindow::click_button_if_exists(unsigned bus_idx, T *(Ui_AudioExpandedView::*control))
 {
index 7d6b42a9a5f8258c06bdf3dddef7bb694b1cd64a..d5a36245573cc58a51354ef0d6152779ec09c4e9 100644 (file)
@@ -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<class T>
        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<class T>
        void click_button_if_exists(unsigned bus_idx, T *Ui_AudioExpandedView::*control);
 
index ade4e8fd2dc7f8f6359c9bea8acf05e5e7ccf748..71d6000439cbf61a9533d0185fbd3437c91d5a8f 100644 (file)
@@ -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<string> &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<pair<string, string>> 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 },