Rename volume attack -> smoothness
This commit is contained in:
parent
9b3afc9865
commit
bc1bbcb306
6 changed files with 53 additions and 53 deletions
|
|
@ -1,30 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <psemek/audio/constants.hpp>
|
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
namespace psemek::audio
|
|
||||||
{
|
|
||||||
|
|
||||||
inline float attack_to_multiplier(float attack)
|
|
||||||
{
|
|
||||||
if (attack == 0.f)
|
|
||||||
return 1.f;
|
|
||||||
return - std::expm1(- inv_frequency / attack);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float multiplier_to_attack(float multiplier)
|
|
||||||
{
|
|
||||||
if (multiplier == 1.f)
|
|
||||||
return 0.f;
|
|
||||||
|
|
||||||
return - inv_frequency / std::log1p(- multiplier);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void attack_update(float & value, float target_value, float multiplier)
|
|
||||||
{
|
|
||||||
value += (target_value - value) * multiplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -11,10 +11,10 @@ namespace psemek::audio
|
||||||
virtual float gain() const = 0;
|
virtual float gain() const = 0;
|
||||||
virtual float gain(float value) = 0;
|
virtual float gain(float value) = 0;
|
||||||
|
|
||||||
virtual float attack() const = 0;
|
virtual float smoothness() const = 0;
|
||||||
virtual float attack(float value) = 0;
|
virtual float smoothness(float value) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::shared_ptr<volume_control> volume(stream_ptr stream, float gain = 1.f, float attack = 0.f);
|
std::shared_ptr<volume_control> volume(stream_ptr stream, float gain = 1.f, float smoothness = 0.f);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,19 +9,19 @@ namespace psemek::audio
|
||||||
|
|
||||||
struct volume_base
|
struct volume_base
|
||||||
{
|
{
|
||||||
volume_base(float gain, float attack);
|
volume_base(float gain, float smoothness);
|
||||||
|
|
||||||
float gain() const { return gain_.load(); }
|
float gain() const { return gain_.load(); }
|
||||||
float gain(float value) { return gain_.exchange(value); }
|
float gain(float value) { return gain_.exchange(value); }
|
||||||
|
|
||||||
float attack() const;
|
float smoothness() const;
|
||||||
float attack(float value);
|
float smoothness(float value);
|
||||||
|
|
||||||
void apply(float * data, std::size_t sample_count);
|
void apply(float * data, std::size_t sample_count);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::atomic<float> gain_;
|
std::atomic<float> gain_;
|
||||||
std::atomic<float> attack_multiplier_;
|
std::atomic<float> smoothness_multiplier_;
|
||||||
float real_gain_;
|
float real_gain_;
|
||||||
float last_sample_src_[2];
|
float last_sample_src_[2];
|
||||||
float last_sample_tgt_[2];
|
float last_sample_tgt_[2];
|
||||||
|
|
|
||||||
30
libs/audio/include/psemek/audio/smooth.hpp
Normal file
30
libs/audio/include/psemek/audio/smooth.hpp
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <psemek/audio/constants.hpp>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace psemek::audio
|
||||||
|
{
|
||||||
|
|
||||||
|
inline float smoothness_to_multiplier(float smoothness)
|
||||||
|
{
|
||||||
|
if (smoothness == 0.f)
|
||||||
|
return 1.f;
|
||||||
|
return - std::expm1(- inv_frequency / smoothness);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float multiplier_to_smoothness(float multiplier)
|
||||||
|
{
|
||||||
|
if (multiplier == 1.f)
|
||||||
|
return 0.f;
|
||||||
|
|
||||||
|
return - inv_frequency / std::log1p(- multiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void smooth_update(float & value, float target_value, float smoothness_multiplier)
|
||||||
|
{
|
||||||
|
value += (target_value - value) * smoothness_multiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -10,16 +10,16 @@ namespace psemek::audio
|
||||||
struct volume_control_impl
|
struct volume_control_impl
|
||||||
: volume_control
|
: volume_control
|
||||||
{
|
{
|
||||||
volume_control_impl(stream_ptr stream, float gain, float attack)
|
volume_control_impl(stream_ptr stream, float gain, float smoothness)
|
||||||
: base_(gain, attack)
|
: base_(gain, smoothness)
|
||||||
, stream_(std::move(stream))
|
, stream_(std::move(stream))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
float gain() const override { return base_.gain(); }
|
float gain() const override { return base_.gain(); }
|
||||||
float gain(float value) override { return base_.gain(value); }
|
float gain(float value) override { return base_.gain(value); }
|
||||||
|
|
||||||
float attack() const override { return base_.attack(); }
|
float smoothness() const override { return base_.smoothness(); }
|
||||||
float attack(float value) override { return base_.attack(value); }
|
float smoothness(float value) override { return base_.smoothness(value); }
|
||||||
|
|
||||||
std::size_t read(float * data, std::size_t sample_count) override
|
std::size_t read(float * data, std::size_t sample_count) override
|
||||||
{
|
{
|
||||||
|
|
@ -35,9 +35,9 @@ namespace psemek::audio
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<volume_control> volume(stream_ptr stream, float gain, float attack)
|
std::shared_ptr<volume_control> volume(stream_ptr stream, float gain, float smoothness)
|
||||||
{
|
{
|
||||||
return std::make_shared<volume_control_impl>(std::move(stream), gain, attack);
|
return std::make_shared<volume_control_impl>(std::move(stream), gain, smoothness);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,35 @@
|
||||||
#include <psemek/audio/effect/volume_base.hpp>
|
#include <psemek/audio/effect/volume_base.hpp>
|
||||||
#include <psemek/audio/constants.hpp>
|
#include <psemek/audio/constants.hpp>
|
||||||
#include <psemek/audio/attack.hpp>
|
#include <psemek/audio/smooth.hpp>
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
namespace psemek::audio
|
namespace psemek::audio
|
||||||
{
|
{
|
||||||
|
|
||||||
volume_base::volume_base(float gain, float attack)
|
volume_base::volume_base(float gain, float smoothness)
|
||||||
: gain_{gain}
|
: gain_{gain}
|
||||||
, attack_multiplier_{attack_to_multiplier(attack)}
|
, smoothness_multiplier_{smoothness_to_multiplier(smoothness)}
|
||||||
, real_gain_{gain}
|
, real_gain_{gain}
|
||||||
, last_sample_src_{0.f, 0.f}
|
, last_sample_src_{0.f, 0.f}
|
||||||
, last_sample_tgt_{0.f, 0.f}
|
, last_sample_tgt_{0.f, 0.f}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
float volume_base::attack() const
|
float volume_base::smoothness() const
|
||||||
{
|
{
|
||||||
return multiplier_to_attack(attack_multiplier_.load());
|
return multiplier_to_smoothness(smoothness_multiplier_.load());
|
||||||
}
|
}
|
||||||
|
|
||||||
float volume_base::attack(float value)
|
float volume_base::smoothness(float value)
|
||||||
{
|
{
|
||||||
auto old = attack_multiplier_.exchange(attack_to_multiplier(value));
|
auto old = smoothness_multiplier_.exchange(smoothness_to_multiplier(value));
|
||||||
return multiplier_to_attack(old);
|
return multiplier_to_smoothness(old);
|
||||||
}
|
}
|
||||||
|
|
||||||
void volume_base::apply(float * data, std::size_t sample_count)
|
void volume_base::apply(float * data, std::size_t sample_count)
|
||||||
{
|
{
|
||||||
float gain = gain_.load();
|
float gain = gain_.load();
|
||||||
float attack_multiplier = attack_multiplier_.load();
|
float smoothness_multiplier = smoothness_multiplier_.load();
|
||||||
|
|
||||||
auto apply_impl = [this](float & target, float & last_src, float & last_tgt)
|
auto apply_impl = [this](float & target, float & last_src, float & last_tgt)
|
||||||
{
|
{
|
||||||
|
|
@ -45,7 +45,7 @@ namespace psemek::audio
|
||||||
apply_impl(*p++, last_sample_src_[0], last_sample_tgt_[0]);
|
apply_impl(*p++, last_sample_src_[0], last_sample_tgt_[0]);
|
||||||
apply_impl(*p++, last_sample_src_[1], last_sample_tgt_[1]);
|
apply_impl(*p++, last_sample_src_[1], last_sample_tgt_[1]);
|
||||||
|
|
||||||
attack_update(real_gain_, gain, attack_multiplier);
|
smooth_update(real_gain_, gain, smoothness_multiplier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue