summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibAudio/Sample.h18
1 files changed, 11 insertions, 7 deletions
diff --git a/Userland/Libraries/LibAudio/Sample.h b/Userland/Libraries/LibAudio/Sample.h
index 23faf6244a..50e3c84907 100644
--- a/Userland/Libraries/LibAudio/Sample.h
+++ b/Userland/Libraries/LibAudio/Sample.h
@@ -90,18 +90,22 @@ struct Sample {
return new_frame;
}
- ALWAYS_INLINE Sample& log_pan(double const pan)
+ // Constant power panning
+ ALWAYS_INLINE Sample& pan(double const position)
{
- left *= linear_to_log(min(pan * -1 + 1.0, 1.0));
- right *= linear_to_log(min(pan + 1.0, 1.0));
+ double const pi_over_2 = AK::Pi<double> * 0.5;
+ double const root_over_2 = AK::sqrt(2.0) * 0.5;
+ double const angle = position * pi_over_2 * 0.5;
+ left *= root_over_2 * (AK::cos(angle) - AK::sin(angle));
+ right *= root_over_2 * (AK::cos(angle) + AK::sin(angle));
return *this;
}
- ALWAYS_INLINE Sample log_pan(double const pan) const
+ ALWAYS_INLINE Sample panned(double const position) const
{
- Sample new_frame { left, right };
- new_frame.log_pan(pan);
- return new_frame;
+ Sample new_sample { left, right };
+ new_sample.pan(position);
+ return new_sample;
}
constexpr Sample& operator*=(double const mult)