Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
settings_panel.hpp
Go to the documentation of this file.
1#pragma once
2
9#include <pulp/view/view.hpp>
10#include <pulp/view/widgets.hpp>
12
13#include <atomic>
14#include <functional>
15#include <string>
16#include <string_view>
17#include <vector>
18
19namespace pulp::format {
20
23 std::function<void(const StandaloneConfig&)> on_config_apply;
24 std::function<void(const TestSignalConfig&)> on_test_signal_changed;
25 std::function<void(const std::string& path)> on_file_load;
26 std::function<void(bool play, bool loop)> on_file_transport;
27};
28
30
34class SettingsPanel : public view::View {
35public:
37
38 void set_callbacks(SettingsPanelCallbacks cb) { callbacks_ = std::move(cb); }
39
42
45
47 void set_input_meter_bridge(view::AudioBridge* bridge) { input_bridge_ = bridge; }
48 void set_output_meter_bridge(view::AudioBridge* bridge) { output_bridge_ = bridge; }
49
52 void add_section(std::string title, std::unique_ptr<view::View> view);
53
55 [[nodiscard]] int tab_count() const;
56 [[nodiscard]] int active_tab() const {
57 return tab_panel_ ? tab_panel_->active_tab() : -1;
58 }
59
62 void set_active_tab(int index) {
63 if (tab_panel_) tab_panel_->set_active_tab(index);
64 }
65 bool set_active_tab(std::string_view title) {
66 return tab_panel_ ? tab_panel_->set_active_tab(title) : false;
67 }
68
70 void poll();
71
78 [[nodiscard]] static int preferred_height();
79
80private:
81 void build_audio_tab();
82 void build_midi_tab();
83 void rebuild_device_lists();
84 void rebuild_midi_list();
85 void rebuild_rate_and_buffer_lists();
86 void apply_config();
87 void update_latency_label();
88 [[nodiscard]] int current_output_device_index() const;
89 [[nodiscard]] int current_sample_rate_index() const;
90 [[nodiscard]] int current_buffer_size_index() const;
91
92 SettingsPanelCallbacks callbacks_;
93 audio::AudioSystem* audio_sys_ = nullptr;
94 midi::MidiSystem* midi_sys_ = nullptr;
95 view::AudioBridge* input_bridge_ = nullptr;
96 view::AudioBridge* output_bridge_ = nullptr;
97
98 StandaloneConfig current_config_;
99
100 // Tab panel
101 view::TabPanel* tab_panel_ = nullptr;
102
103 // Audio tab widgets
104 view::ComboBox* output_device_combo_ = nullptr;
105 view::Label* input_device_label_ = nullptr;
106 view::ComboBox* input_device_combo_ = nullptr;
107 view::ComboBox* sample_rate_combo_ = nullptr;
108 view::ComboBox* buffer_size_combo_ = nullptr;
109 view::Label* latency_label_ = nullptr;
110 view::MultiMeter* input_meter_ = nullptr;
111 view::MultiMeter* output_meter_ = nullptr;
112 view::Toggle* test_tone_toggle_ = nullptr;
113 view::ComboBox* tone_freq_combo_ = nullptr;
114 view::ComboBox* signal_type_combo_ = nullptr; // Sine / Noise
115
116 // MIDI tab widgets
117 view::ListBox* midi_list_ = nullptr;
118
119 // Updates tab, when the app can update itself (owned by tab_panel_).
120 AppUpdatesSettingsView* updates_view_ = nullptr;
121 int updates_poll_count_ = 0;
122
123 // Cached device info for mapping combo indices to IDs
124 std::vector<audio::DeviceInfo> output_devices_;
125 std::vector<audio::DeviceInfo> input_devices_;
126 std::vector<midi::MidiPortInfo> midi_ports_;
127 std::vector<double> available_rates_;
128 std::vector<int> available_buffers_;
129
130 // Hotplug flags (set from OS thread, read from UI poll)
131 std::atomic<bool> devices_changed_{false};
132 std::atomic<bool> midi_changed_{false};
133};
134
135} // namespace pulp::format
Definition device.hpp:149
Definition audio_bridge.hpp:122
Definition app_updates_settings_view.hpp:33
void add_section(std::string title, std::unique_ptr< view::View > view)
Append a plugin-contributed settings tab after the host-owned Audio/MIDI tabs.
void set_callbacks(SettingsPanelCallbacks cb)
Definition settings_panel.hpp:38
int tab_count() const
Number of tabs currently in the panel (Audio + MIDI + any added sections).
void poll()
Call periodically (~30 Hz) from idle/timer to refresh meters and hotplug.
void set_output_meter_bridge(view::AudioBridge *bridge)
Definition settings_panel.hpp:48
void set_active_tab(int index)
Select a host or plugin-contributed tab.
Definition settings_panel.hpp:62
void set_current_config(const StandaloneConfig &cfg)
Set the current running config (to pre-select current values).
static int preferred_height()
Natural (uncompressed) height the panel needs so its Audio tab — the tallest tab, shown first — lays ...
bool set_active_tab(std::string_view title)
Definition settings_panel.hpp:65
void set_input_meter_bridge(view::AudioBridge *bridge)
Provide an AudioBridge for input level metering.
Definition settings_panel.hpp:47
int active_tab() const
Definition settings_panel.hpp:56
void bind_systems(audio::AudioSystem *audio_sys, midi::MidiSystem *midi_sys)
Bind audio/MIDI systems for enumeration and hotplug listening.
Definition device.hpp:52
Drop-down selector for enumerated parameters.
Definition ui_components.hpp:43
Definition widgets.hpp:56
Scrollable list of selectable items.
Definition ui_components.hpp:637
Definition visualizers.hpp:65
Tabbed container that shows one child at a time.
Definition ui_components.hpp:356
Definition widgets.hpp:2036
Definition view.hpp:73
What the product grants a device: the quota table indexed by capability tier and live thermal state.
Definition aax_editor.hpp:31
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
Callbacks from SettingsPanel to the standalone host.
Definition settings_panel.hpp:22
std::function< void(bool play, bool loop)> on_file_transport
Definition settings_panel.hpp:26
std::function< void(const TestSignalConfig &)> on_test_signal_changed
Definition settings_panel.hpp:24
std::function< void(const StandaloneConfig &)> on_config_apply
Definition settings_panel.hpp:23
std::function< void(const std::string &path)> on_file_load
Definition settings_panel.hpp:25
Definition standalone.hpp:45
Definition test_signal.hpp:16
Additional UI components: ComboBox, Tooltip, ProgressBar, CallOutBox, TabPanel, ListBox,...
Source-compatible spelling of <pulp/dataplane/audio_bridge.hpp>.