Deluge Firmware 1.3.0
Build date: 2026.10.14
Loading...
Searching...
No Matches
volume_param_gain.h
1#pragma once
2#include <algorithm>
3#include <cstdint>
4#include <limits>
5
16
18constexpr int32_t kVolumeParamUnityPos = 536870912;
20constexpr int32_t kVolumeParamMaxPos = 1073741823;
21
24 int32_t param;
28};
29
31constexpr int32_t volumeParamToGainPos(int32_t volumeParam) {
32 return (volumeParam >> 2) + kVolumeParamUnityPos;
33}
34
37constexpr 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}
Definition volume_param_gain.h:22
int32_t param
The new param value, saturated into int32_t.
Definition volume_param_gain.h:24
int32_t remainingGainPos
Definition volume_param_gain.h:27