Deluge Firmware
1.3.0
Build date: 2026.10.14
Toggle main menu visibility
Loading...
Searching...
No Matches
volume_param_gain.h
1
#pragma once
2
#include <algorithm>
3
#include <cstdint>
4
#include <limits>
5
16
18
constexpr
int32_t kVolumeParamUnityPos = 536870912;
20
constexpr
int32_t kVolumeParamMaxPos = 1073741823;
21
22
struct
VolumeParamGain
{
24
int32_t
param
;
27
int32_t
remainingGainPos
;
28
};
29
31
constexpr
int32_t volumeParamToGainPos(int32_t volumeParam) {
32
return
(volumeParam >> 2) + kVolumeParamUnityPos;
33
}
34
37
constexpr
VolumeParamGain
applyGainToVolumeParam(int32_t volumeParam, int32_t gainPos) {
38
int64_t pos =
static_cast<
int64_t
>
(volumeParamToGainPos(volumeParam));
39
int64_t scaledPos = (pos *
static_cast<
int64_t
>
(gainPos)) >> 29;
40
41
if
(scaledPos > kVolumeParamMaxPos) {
42
// Saturated. Report how much gain we actually delivered so the caller can carry the rest elsewhere.
43
int64_t remaining = (scaledPos << 29) / kVolumeParamMaxPos;
44
return
{std::numeric_limits<int32_t>::max(),
45
static_cast<
int32_t
>
(std::min<int64_t>(remaining, std::numeric_limits<int32_t>::max()))};
46
}
47
48
int64_t param = (scaledPos - kVolumeParamUnityPos) << 2;
49
param = std::clamp<int64_t>(param, std::numeric_limits<int32_t>::min(), std::numeric_limits<int32_t>::max());
50
return
{
static_cast<
int32_t
>
(param), kVolumeParamUnityPos};
51
}
VolumeParamGain
Definition
volume_param_gain.h:22
VolumeParamGain::param
int32_t param
The new param value, saturated into int32_t.
Definition
volume_param_gain.h:24
VolumeParamGain::remainingGainPos
int32_t remainingGainPos
Definition
volume_param_gain.h:27