Deluge Firmware 1.3.0
Build date: 2026.10.14
Loading...
Searching...
No Matches
voice_usage.h
1/*
2 * Copyright (c) 2026 Deluge Community Firmware contributors
3 *
4 * This file is part of The Synthstrom Audible Deluge Firmware.
5 */
6#pragma once
7
8#include "gui/menu_item/horizontal_menu.h"
9#include "gui/menu_item/integer.h"
10#include "gui/ui_timer_manager.h"
11#include "model/song/song.h"
12#include "processing/engines/audio_engine.h"
13
14#include <algorithm>
15#include <cstdint>
16#include <limits>
17
18namespace deluge::gui::menu_item::cpu {
19
20class VoiceUsage final : public HorizontalMenu {
21public:
22 class VoiceCount final : public Integer {
23 public:
24 enum class Kind { LIVE, AVERAGE, MAXIMUM };
25
26 VoiceCount(VoiceUsage& usage, Kind kind, l10n::String name, l10n::String columnLabel)
27 : Integer(name), usage_(usage), kind_(kind), column_label_(columnLabel) {}
28
29 void beginSession(MenuItem*) override {
30 usage_.sample();
31 Integer::beginSession(nullptr);
32 usage_.startTimer();
33 }
34
35 ActionResult timerCallback() override { return usage_.timerCallback(); }
36 void selectEncoderAction(int32_t) override {}
37 bool selectEncoderActionIsPermitted() override { return false; }
38
39 void getColumnLabel(StringBuf& label) override { label.append(l10n::getView(column_label_)); }
40
41 void readCurrentValue() override { setValue(metricValue()); }
42
43 private:
44 int32_t metricValue() const {
45 switch (kind_) {
46 case Kind::LIVE:
47 return usage_.live_voice_count_;
48 case Kind::AVERAGE:
49 return usage_.averageVoiceCount();
50 case Kind::MAXIMUM:
51 return usage_.maximum_voice_count_;
52 }
53 return 0;
54 }
55
56 [[nodiscard]] int32_t getMaxValue() const override { return std::numeric_limits<int32_t>::max(); }
57 [[nodiscard]] deluge::gui::menu_item::RenderingStyle getRenderingStyle() const override {
58 return deluge::gui::menu_item::RenderingStyle::NUMBER;
59 }
60
61 VoiceUsage& usage_;
62 Kind kind_;
63 l10n::String column_label_;
64 };
65
66 VoiceUsage(l10n::String name, l10n::String title)
67 : HorizontalMenu(name, title, {&live_, &average_, &maximum_}, HorizontalMenu::Layout::FIXED),
68 live_(*this, VoiceCount::Kind::LIVE, l10n::String::STRING_FOR_LIVE_VOICE_COUNT,
69 l10n::String::STRING_FOR_LIVE),
70 average_(*this, VoiceCount::Kind::AVERAGE, l10n::String::STRING_FOR_AVERAGE_VOICE_COUNT,
71 l10n::String::STRING_FOR_AVG),
72 maximum_(*this, VoiceCount::Kind::MAXIMUM, l10n::String::STRING_FOR_MAXIMUM_VOICE_COUNT,
73 l10n::String::STRING_FOR_MAX) {}
74
75 void beginSession(MenuItem* navigatedBackwardFrom) override {
76 total_voice_count_ = 0;
77 sample_count_ = 0;
78 maximum_voice_count_ = 0;
79 sample();
80 HorizontalMenu::beginSession(navigatedBackwardFrom);
81 startTimer();
82 }
83
84 ActionResult timerCallback() override {
85 sample();
86 if (renderingStyle() == RenderingStyle::HORIZONTAL) {
87 renderUIsForOled();
88 }
89 else {
90 getCurrentItem()->readValueAgain();
91 }
92 startTimer();
93 return ActionResult::DEALT_WITH;
94 }
95
96private:
97 static constexpr uint32_t kRefreshIntervalMs = 500;
98
99 void startTimer() { uiTimerManager.setTimer(TimerName::UI_SPECIFIC, kRefreshIntervalMs); }
100
101 void sample() {
102 live_voice_count_ =
103 AudioEngine::getNumVoices() + (currentSong != nullptr ? currentSong->countAudioVoices() : 0);
104 total_voice_count_ += live_voice_count_;
105 ++sample_count_;
106 maximum_voice_count_ = std::max(maximum_voice_count_, live_voice_count_);
107 }
108
109 int32_t averageVoiceCount() const {
110 return sample_count_ == 0 ? 0 : static_cast<int32_t>(total_voice_count_ / sample_count_);
111 }
112
113 int32_t live_voice_count_{0};
114 int32_t maximum_voice_count_{0};
115 uint64_t total_voice_count_{0};
116 uint32_t sample_count_{0};
117
118 VoiceCount live_;
119 VoiceCount average_;
120 VoiceCount maximum_;
121};
122
123} // namespace deluge::gui::menu_item::cpu
deluge::l10n::String title
Can get overridden by getTitle(). Actual max num chars for OLED display is 14.
Definition menu_item.h:222
const deluge::l10n::String name
Default name for use on OLED for deluge::gui::menu_item::Submenu s.
Definition menu_item.h:253
virtual void beginSession(MenuItem *navigatedBackwardFrom=nullptr)
Begin an editing session with this menu item.
Definition menu_item.h:123
Definition d_stringbuf.h:16
void beginSession(MenuItem *navigatedBackwardFrom) override
Begin an editing session with this menu item.
Definition horizontal_menu.cpp:40
Definition integer.h:24
void selectEncoderAction(int32_t) override
Handle select encoder movement.
Definition voice_usage.h:36
ActionResult timerCallback() override
Handle a TimerName::UI_SPECIFIC event.
Definition voice_usage.h:35
void readCurrentValue() override
Like readValueAgain, but does not redraw.
Definition voice_usage.h:41
void beginSession(MenuItem *) override
Begin an editing session with this menu item.
Definition voice_usage.h:29
void beginSession(MenuItem *navigatedBackwardFrom) override
Begin an editing session with this menu item.
Definition voice_usage.h:75
ActionResult timerCallback() override
Handle a TimerName::UI_SPECIFIC event.
Definition voice_usage.h:84