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);
}
}
+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))
{
#include "midi_mapper.h"
#include "mixer.h"
+class QDial;
class QEvent;
class QObject;
class QResizeEvent;
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;
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);
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)
{
{ "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 },
{ "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 },