Deluge Firmware
1.3.0
Build date: 2026.08.23
Toggle main menu visibility
Loading...
Searching...
No Matches
reverse.h
1
/*
2
* Copyright (c) 2014-2023 Synthstrom Audible Limited
3
*
4
* This file is part of The Synthstrom Audible Deluge Firmware.
5
*
6
* The Synthstrom Audible Deluge Firmware is free software: you can redistribute it and/or modify it under the
7
* terms of the GNU General Public License as published by the Free Software Foundation,
8
* either version 3 of the License, or (at your option) any later version.
9
*
10
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
11
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
* See the GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License along with this program.
15
* If not, see <https://www.gnu.org/licenses/>.
16
*/
17
#pragma once
18
#include "gui/menu_item/horizontal_menu.h"
19
#include "gui/menu_item/toggle.h"
20
#include "gui/ui/sound_editor.h"
21
#include "gui/views/audio_clip_view.h"
22
#include "model/clip/audio_clip.h"
23
#include "model/model_stack.h"
24
#include "model/sample/sample.h"
25
#include "model/song/song.h"
26
#include "playback/playback_handler.h"
27
28
namespace
deluge::gui::menu_item::audio_clip {
29
30
using namespace
hid::display;
31
32
class
Reverse
final :
public
Toggle
{
33
public
:
34
using
Toggle::Toggle;
35
36
void
readCurrentValue
()
override
{ this->setValue(getCurrentAudioClip()->sampleControls.reversed); }
37
void
writeCurrentValue()
override
{
38
auto
* clip = getCurrentAudioClip();
39
bool
active = (playbackHandler.isEitherClockActive() && currentSong->isClipActive(clip) && clip->voiceSample);
40
41
clip->unassignVoiceSample(
false
);
42
43
clip->sampleControls.reversed = this->getValue();
44
45
if
(clip->sampleHolder.audioFile !=
nullptr
) {
46
if
(clip->sampleControls.isCurrentlyReversed()) {
47
uint64_t lengthInSamples = (
static_cast<
Sample
*
>
(clip->sampleHolder.audioFile))->lengthInSamples;
48
if
(clip->sampleHolder.endPos > lengthInSamples) {
49
clip->sampleHolder.endPos = lengthInSamples;
50
}
51
}
52
53
clip->sampleHolder.claimClusterReasons(clip->sampleControls.isCurrentlyReversed());
54
55
if
(active) {
56
char
modelStackMemory[MODEL_STACK_MAX_SIZE];
57
ModelStackWithTimelineCounter
* modelStack =
58
currentSong->setupModelStackWithCurrentClip(modelStackMemory);
59
60
clip->resumePlayback(modelStack,
true
);
61
}
62
63
uiNeedsRendering(&audioClipView, 0xFFFFFFFF, 0);
64
}
65
}
66
67
void
renderInHorizontalMenu(
const
SlotPosition& slot)
override
{
68
const
bool
reversed = getValue();
69
OLED::main.drawIconCentered(OLED::directionIcon, slot.start_x, slot.width,
70
slot.start_y + kHorizontalMenuSlotYOffset, reversed);
71
}
72
73
void
getColumnLabel(StringBuf& label)
override
{ label.append(l10n::get(l10n::String::STRING_FOR_PLAY)); }
74
75
void
getNotificationValue
(
StringBuf
& valueBuf)
override
{
76
valueBuf.append(l10n::get(getValue() ? l10n::String::STRING_FOR_ON : l10n::String::STRING_FOR_OFF));
77
}
78
79
void
selectEncoderAction
(int32_t offset)
override
{
80
if
(parent !=
nullptr
&& parent->renderingStyle() == Submenu::RenderingStyle::HORIZONTAL) {
81
// reverse direction
82
offset *= -1;
83
}
84
Toggle::selectEncoderAction
(offset);
85
}
86
};
87
}
// namespace deluge::gui::menu_item::audio_clip
ModelStackWithTimelineCounter
Definition
model_stack.h:129
Sample
Definition
sample.h:50
StringBuf
Definition
d_stringbuf.h:16
deluge::gui::menu_item::Toggle
Definition
toggle.h:8
deluge::gui::menu_item::Toggle::selectEncoderAction
void selectEncoderAction(int32_t offset) override
Handle select encoder movement.
Definition
toggle.cpp:14
deluge::gui::menu_item::audio_clip::Reverse
Definition
reverse.h:32
deluge::gui::menu_item::audio_clip::Reverse::getNotificationValue
void getNotificationValue(StringBuf &valueBuf) override
Get the parameter value string to show in the popup.
Definition
reverse.h:75
deluge::gui::menu_item::audio_clip::Reverse::selectEncoderAction
void selectEncoderAction(int32_t offset) override
Handle select encoder movement.
Definition
reverse.h:79
deluge::gui::menu_item::audio_clip::Reverse::readCurrentValue
void readCurrentValue() override
Like readValueAgain, but does not redraw.
Definition
reverse.h:36