Skip to content

Commit 19f635f

Browse files
committed
perf: inline functions in the audio hot path
1 parent 9f37808 commit 19f635f

12 files changed

Lines changed: 18 additions & 5 deletions

File tree

playback/src/audio_backend/alsa.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ impl Sink for AlsaSink {
452452
}
453453

454454
impl SinkAsBytes for AlsaSink {
455+
#[inline]
455456
fn write_bytes(&mut self, data: &[u8]) -> SinkResult<()> {
456457
let mut start_index = 0;
457458
let data_len = data.len();

playback/src/audio_backend/gstreamer.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ impl Drop for GstreamerSink {
171171
}
172172

173173
impl SinkAsBytes for GstreamerSink {
174+
#[inline]
174175
fn write_bytes(&mut self, data: &[u8]) -> SinkResult<()> {
175176
if let Some(async_error) = &*self.async_error.lock() {
176177
return Err(SinkError::OnWrite(async_error.to_string()));

playback/src/audio_backend/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ fn mk_sink<S: Sink + Open + 'static>(device: Option<String>, format: AudioFormat
4646
// reuse code for various backends
4747
macro_rules! sink_as_bytes {
4848
() => {
49+
#[inline]
4950
fn write(&mut self, packet: AudioPacket, converter: &mut Converter) -> SinkResult<()> {
5051
use crate::convert::i24;
5152
use zerocopy::IntoBytes;

playback/src/audio_backend/pipe.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ impl Sink for StdoutSink {
9696
}
9797

9898
impl SinkAsBytes for StdoutSink {
99+
#[inline]
99100
fn write_bytes(&mut self, data: &[u8]) -> SinkResult<()> {
100101
self.output
101102
.as_deref_mut()

playback/src/audio_backend/pulseaudio.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ impl Sink for PulseAudioSink {
137137
}
138138

139139
impl SinkAsBytes for PulseAudioSink {
140+
#[inline]
140141
fn write_bytes(&mut self, data: &[u8]) -> SinkResult<()> {
141142
let sink = self.sink.as_mut().ok_or(PulseError::NotConnected)?;
142143

playback/src/audio_backend/subprocess.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ impl Sink for SubprocessSink {
139139
}
140140

141141
impl SinkAsBytes for SubprocessSink {
142+
#[inline]
142143
fn write_bytes(&mut self, data: &[u8]) -> SinkResult<()> {
143144
// We get one attempted restart per write.
144145
// We don't want to get stuck in a restart loop.

playback/src/convert.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ impl Converter {
4242
const SHIFT_S24: u8 = 23; // 24-bit: 2^23 = 8388608
4343
const SHIFT_S32: u8 = 31; // 32-bit: 2^31 = 2147483648
4444

45-
4645
/// Additional bit shifts needed to scale from 16-bit to higher bit depths.
4746
/// These are the differences between the base shift amounts above.
4847
const SHIFT_16_TO_24: u8 = Self::SHIFT_S24 - Self::SHIFT_S16; // 23 - 15 = 8
@@ -52,12 +51,12 @@ impl Converter {
5251
const SCALE_S24: f64 = (1_u64 << Self::SHIFT_S24) as f64;
5352

5453
/// Scale audio samples with optimal dithering strategy for Spotify's 16-bit source material.
55-
///
54+
///
5655
/// Since Spotify audio is always 16-bit depth, this function:
5756
/// 1. When dithering: applies noise at 16-bit level, preserves fractional precision,
5857
/// then scales to target format and rounds once at the end
5958
/// 2. When not dithering: scales directly from normalized float to target format
60-
///
59+
///
6160
/// The `shift` parameter specifies how many extra bits to shift beyond
6261
/// the base 16-bit scaling (0 for 16-bit, 8 for 24-bit, 16 for 32-bit).
6362
#[inline]
@@ -85,11 +84,11 @@ impl Converter {
8584
#[inline]
8685
pub fn clamping_scale_s24(&mut self, sample: f64) -> f64 {
8786
let int_value = self.scale(sample, Self::SHIFT_16_TO_24);
88-
87+
8988
// In two's complement, there are more negative than positive values.
9089
let min = -Self::SCALE_S24;
9190
let max = Self::SCALE_S24 - 1.0;
92-
91+
9392
int_value.clamp(min, max)
9493
}
9594

playback/src/decoder/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,23 @@ pub enum AudioPacket {
3636
}
3737

3838
impl AudioPacket {
39+
#[inline]
3940
pub fn samples(&self) -> AudioPacketResult<&[f64]> {
4041
match self {
4142
AudioPacket::Samples(s) => Ok(s),
4243
AudioPacket::Raw(_) => Err(AudioPacketError::Raw),
4344
}
4445
}
4546

47+
#[inline]
4648
pub fn raw(&self) -> AudioPacketResult<&[u8]> {
4749
match self {
4850
AudioPacket::Raw(d) => Ok(d),
4951
AudioPacket::Samples(_) => Err(AudioPacketError::Samples),
5052
}
5153
}
5254

55+
#[inline]
5356
pub fn is_empty(&self) -> bool {
5457
match self {
5558
AudioPacket::Samples(s) => s.is_empty(),

playback/src/decoder/symphonia_decoder.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ impl SymphoniaDecoder {
131131
}
132132
}
133133

134+
#[inline]
134135
fn ts_to_ms(&self, ts: u64) -> u32 {
135136
match self.decoder.codec_params().time_base {
136137
Some(time_base) => {

playback/src/mixer/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub trait VolumeGetter {
2525
}
2626

2727
impl VolumeGetter for NoOpVolume {
28+
#[inline]
2829
fn attenuation_factor(&self) -> f64 {
2930
1.0
3031
}

0 commit comments

Comments
 (0)