26 struct __attribute__((packed)) Frame {
34 Frame(
int v = 0) { channel1 = channel2 = v; }
41 Frame(
int ch1,
int ch2) {
77 ESP_LOGD(
"VolumeControl",
"update_audio_data");
78 for (
int i = 0; i < frameCount; i++) {
79 int32_t pcmLeft = data[i].channel1;
80 int32_t pcmRight = data[i].channel2;
83 pcmRight = pcmLeft = (pcmLeft + pcmRight) / 2;
90 data[i].channel1 = pcmLeft;
91 data[i].channel2 = pcmRight;
139 int32_t result = value;
140 if (value < -32768) result = -32768;
141 if (value > 32767) result = 32767;
174 constexpr float base = 1.4f;
175 constexpr float bits = 12.0f;
176 constexpr float zero_ofs = pow(base, -bits);
177 constexpr float scale = pow(2.0f, bits);
178 float volumeFactorFloat =
179 (pow(base, volume * bits / 127.0f - bits) - zero_ofs) * scale /
216 float volumeFactorFloat = volume;
217 volumeFactorFloat = pow(2.0f, volumeFactorFloat * 12.0f / 127.0f);
Default implementation for handling of the volume of the audio data.
Definition A2DPVolumeControl.h:151
A2DPDefaultVolumeControl(int32_t limit)
Constructor with custom volume factor clipping limit.
Definition A2DPVolumeControl.h:163
void set_volume(uint8_t volume) override
Sets the volume using exponential curve calculation.
Definition A2DPVolumeControl.h:173
A2DPDefaultVolumeControl()=default
Default constructor.
The simplest possible implementation of a VolumeControl.
Definition A2DPVolumeControl.h:230
A2DPLinearVolumeControl()
Constructor that sets volumeFactorMax to 128 for linear scaling.
Definition A2DPVolumeControl.h:235
void set_volume(uint8_t volume) override
Sets the volume using direct linear mapping.
Definition A2DPVolumeControl.h:242
Keeps the audio data as is -> no volume control!
Definition A2DPVolumeControl.h:250
void set_volume(uint8_t volume) override
Override that does nothing - no volume setting.
Definition A2DPVolumeControl.h:275
A2DPNoVolumeControl(int32_t fixedVolume=0x1000)
Constructor with optional fixed volume setting.
Definition A2DPVolumeControl.h:257
void update_audio_data(Frame *data, uint16_t frameCount) override
Override that does nothing - no audio data modification.
Definition A2DPVolumeControl.h:269
Exponential volume control.
Definition A2DPVolumeControl.h:193
void set_volume(uint8_t volume) override
Sets the volume using simple exponential calculation.
Definition A2DPVolumeControl.h:215
A2DPSimpleExponentialVolumeControl()=default
Default constructor.
A2DPSimpleExponentialVolumeControl(int32_t limit)
Constructor with custom volume factor clipping limit.
Definition A2DPVolumeControl.h:205
Abstract class for handling of the volume of the audio data.
Definition A2DPVolumeControl.h:54
int32_t clip(int32_t value)
Clips audio sample value to prevent overflow.
Definition A2DPVolumeControl.h:138
virtual void set_volume(uint8_t volume)=0
Sets the volume level (pure virtual function)
void set_mono_downmix(bool enabled)
Enables or disables mono downmix.
Definition A2DPVolumeControl.h:118
int32_t get_volume_factor()
Gets the current volume factor.
Definition A2DPVolumeControl.h:100
virtual void update_audio_data(Frame *data, uint16_t frameCount)
Updates audio data with volume control and optional mono downmix.
Definition A2DPVolumeControl.h:75
bool is_volume_used
Flag indicating if volume control is enabled.
Definition A2DPVolumeControl.h:127
int32_t volumeFactorClippingLimit
Volume factor clipping limit (4095)
Definition A2DPVolumeControl.h:131
bool mono_downmix
Flag indicating if mono downmix is enabled.
Definition A2DPVolumeControl.h:128
virtual void update_audio_data(uint8_t *data, uint16_t byteCount)
Updates audio data with volume control and optional mono downmix.
Definition A2DPVolumeControl.h:66
A2DPVolumeControl()=default
Default constructor.
void set_enabled(bool enabled)
Enables or disables volume control.
Definition A2DPVolumeControl.h:112
int32_t volumeFactor
Current volume factor.
Definition A2DPVolumeControl.h:129
int32_t volumeFactorMax
Maximum volume factor (4096)
Definition A2DPVolumeControl.h:130
int32_t get_volume_factor_max()
Gets the maximum volume factor value.
Definition A2DPVolumeControl.h:106