Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::signal::HeadphoneCrossfeedT< SampleType > Class Template Reference

Mixes a delayed, low-pass-filtered copy of each channel into the opposite ear. More...

#include <headphone_crossfeed.hpp>

Public Member Functions

 HeadphoneCrossfeedT () noexcept
bool prepare (double sample_rate) noexcept
double sample_rate () const noexcept
void set_enabled (bool enabled) noexcept
bool enabled () const noexcept
void set_amount (double amount01) noexcept
 Normalized crossfeed amount.
double amount () const noexcept
double crossfeed_gain () const noexcept
void set_delay_ms (double delay_ms) noexcept
 Interaural delay in milliseconds, clamped to [0, 1].
double delay_ms () const noexcept
double delay_samples () const noexcept
void set_cutoff_hz (double cutoff_hz) noexcept
 Crossfeed low-pass cutoff.
double cutoff_hz () const noexcept
int tail_samples () const noexcept
 The one-pole feed decays asymptotically whenever crossfeed is active.
void reset () noexcept
void process_sample (SampleType input_left, SampleType input_right, SampleType &output_left, SampleType &output_right) noexcept
void process_block (const SampleType *input_left, const SampleType *input_right, SampleType *output_left, SampleType *output_right, std::size_t sample_count) noexcept

Static Public Member Functions

static constexpr int latency_samples () noexcept
 Exact zero algorithmic latency: only the opposite-channel contribution is delayed; the direct paths are not delayed.

Static Public Attributes

static constexpr double kMinimumSampleRate = 1000.0
static constexpr double kMaximumSampleRate = 768000.0
static constexpr double kMaximumDelayMs = 1.0
static constexpr double kMaximumCrossfeedGain = 0.35

Detailed Description

template<typename SampleType = float>
class pulp::signal::HeadphoneCrossfeedT< SampleType >

Mixes a delayed, low-pass-filtered copy of each channel into the opposite ear.

The topology is a stable feed-forward path: there is no feedback and the one-pole filter coefficient is always in [0, 1).

prepare() and setters belong on the control thread. process_sample(), process_block(), and reset() are bounded, lock-free, and allocation-free.

Constructor & Destructor Documentation

◆ HeadphoneCrossfeedT()

template<typename SampleType = float>
pulp::signal::HeadphoneCrossfeedT< SampleType >::HeadphoneCrossfeedT ( )
inlinenoexcept

Member Function Documentation

◆ amount()

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::amount ( ) const
inlinenoexcept

◆ crossfeed_gain()

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::crossfeed_gain ( ) const
inlinenoexcept

◆ cutoff_hz()

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::cutoff_hz ( ) const
inlinenoexcept

◆ delay_ms()

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::delay_ms ( ) const
inlinenoexcept

◆ delay_samples()

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::delay_samples ( ) const
inlinenoexcept

◆ enabled()

template<typename SampleType = float>
bool pulp::signal::HeadphoneCrossfeedT< SampleType >::enabled ( ) const
inlinenoexcept

◆ latency_samples()

template<typename SampleType = float>
constexpr int pulp::signal::HeadphoneCrossfeedT< SampleType >::latency_samples ( )
inlinestaticconstexprnoexcept

Exact zero algorithmic latency: only the opposite-channel contribution is delayed; the direct paths are not delayed.

◆ prepare()

template<typename SampleType = float>
bool pulp::signal::HeadphoneCrossfeedT< SampleType >::prepare ( double sample_rate)
inlinenoexcept

◆ process_block()

template<typename SampleType = float>
void pulp::signal::HeadphoneCrossfeedT< SampleType >::process_block ( const SampleType * input_left,
const SampleType * input_right,
SampleType * output_left,
SampleType * output_right,
std::size_t sample_count )
inlinenoexcept

◆ process_sample()

template<typename SampleType = float>
void pulp::signal::HeadphoneCrossfeedT< SampleType >::process_sample ( SampleType input_left,
SampleType input_right,
SampleType & output_left,
SampleType & output_right )
inlinenoexcept

◆ reset()

template<typename SampleType = float>
void pulp::signal::HeadphoneCrossfeedT< SampleType >::reset ( )
inlinenoexcept

◆ sample_rate()

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::sample_rate ( ) const
inlinenoexcept

◆ set_amount()

template<typename SampleType = float>
void pulp::signal::HeadphoneCrossfeedT< SampleType >::set_amount ( double amount01)
inlinenoexcept

Normalized crossfeed amount.

At one, the opposite-channel feed is kMaximumCrossfeedGain before unity-at-DC normalization.

◆ set_cutoff_hz()

template<typename SampleType = float>
void pulp::signal::HeadphoneCrossfeedT< SampleType >::set_cutoff_hz ( double cutoff_hz)
inlinenoexcept

Crossfeed low-pass cutoff.

The requested value is clamped to [100, 20000] Hz and the effective value to 45% of sample rate.

◆ set_delay_ms()

template<typename SampleType = float>
void pulp::signal::HeadphoneCrossfeedT< SampleType >::set_delay_ms ( double delay_ms)
inlinenoexcept

Interaural delay in milliseconds, clamped to [0, 1].

◆ set_enabled()

template<typename SampleType = float>
void pulp::signal::HeadphoneCrossfeedT< SampleType >::set_enabled ( bool enabled)
inlinenoexcept

◆ tail_samples()

template<typename SampleType = float>
int pulp::signal::HeadphoneCrossfeedT< SampleType >::tail_samples ( ) const
inlinenoexcept

The one-pole feed decays asymptotically whenever crossfeed is active.

Member Data Documentation

◆ kMaximumCrossfeedGain

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::kMaximumCrossfeedGain = 0.35
staticconstexpr

◆ kMaximumDelayMs

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::kMaximumDelayMs = 1.0
staticconstexpr

◆ kMaximumSampleRate

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::kMaximumSampleRate = 768000.0
staticconstexpr

◆ kMinimumSampleRate

template<typename SampleType = float>
double pulp::signal::HeadphoneCrossfeedT< SampleType >::kMinimumSampleRate = 1000.0
staticconstexpr

The documentation for this class was generated from the following file: