Skip to content

Commit f09be48

Browse files
committed
Sink: pass ownership of the packet on write()
Prevent a copy if the implementation needs to keep the data around.
1 parent b1bdf1d commit f09be48

7 files changed

Lines changed: 17 additions & 16 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313
- [playback] `alsa`: Improve `--device ?` functionality for the alsa backend.
1414
- [contrib] Hardened security of the systemd service units
1515
- [main] Verbose logging mode (`-v`, `--verbose`) now logs all parsed environment variables and command line arguments (credentials are redacted).
16+
- [playback] `Sink`: `write()` now receives ownership of the packet (breaking).
1617

1718
### Added
1819
- [cache] Add `disable-credential-cache` flag (breaking).

playback/src/audio_backend/jackaudio.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ impl Open for JackSink {
6666
}
6767

6868
impl Sink for JackSink {
69-
fn write(&mut self, packet: &AudioPacket, converter: &mut Converter) -> SinkResult<()> {
69+
fn write(&mut self, packet: AudioPacket, converter: &mut Converter) -> SinkResult<()> {
7070
let samples = packet
7171
.samples()
7272
.map_err(|e| SinkError::OnWrite(e.to_string()))?;

playback/src/audio_backend/mod.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub trait Sink {
2828
fn stop(&mut self) -> SinkResult<()> {
2929
Ok(())
3030
}
31-
fn write(&mut self, packet: &AudioPacket, converter: &mut Converter) -> SinkResult<()>;
31+
fn write(&mut self, packet: AudioPacket, converter: &mut Converter) -> SinkResult<()>;
3232
}
3333

3434
pub type SinkBuilder = fn(Option<String>, AudioFormat) -> Box<dyn Sink>;
@@ -44,34 +44,34 @@ fn mk_sink<S: Sink + Open + 'static>(device: Option<String>, format: AudioFormat
4444
// reuse code for various backends
4545
macro_rules! sink_as_bytes {
4646
() => {
47-
fn write(&mut self, packet: &AudioPacket, converter: &mut Converter) -> SinkResult<()> {
47+
fn write(&mut self, packet: AudioPacket, converter: &mut Converter) -> SinkResult<()> {
4848
use crate::convert::i24;
4949
use zerocopy::AsBytes;
5050
match packet {
5151
AudioPacket::Samples(samples) => match self.format {
5252
AudioFormat::F64 => self.write_bytes(samples.as_bytes()),
5353
AudioFormat::F32 => {
54-
let samples_f32: &[f32] = &converter.f64_to_f32(samples);
54+
let samples_f32: &[f32] = &converter.f64_to_f32(&samples);
5555
self.write_bytes(samples_f32.as_bytes())
5656
}
5757
AudioFormat::S32 => {
58-
let samples_s32: &[i32] = &converter.f64_to_s32(samples);
58+
let samples_s32: &[i32] = &converter.f64_to_s32(&samples);
5959
self.write_bytes(samples_s32.as_bytes())
6060
}
6161
AudioFormat::S24 => {
62-
let samples_s24: &[i32] = &converter.f64_to_s24(samples);
62+
let samples_s24: &[i32] = &converter.f64_to_s24(&samples);
6363
self.write_bytes(samples_s24.as_bytes())
6464
}
6565
AudioFormat::S24_3 => {
66-
let samples_s24_3: &[i24] = &converter.f64_to_s24_3(samples);
66+
let samples_s24_3: &[i24] = &converter.f64_to_s24_3(&samples);
6767
self.write_bytes(samples_s24_3.as_bytes())
6868
}
6969
AudioFormat::S16 => {
70-
let samples_s16: &[i16] = &converter.f64_to_s16(samples);
70+
let samples_s16: &[i16] = &converter.f64_to_s16(&samples);
7171
self.write_bytes(samples_s16.as_bytes())
7272
}
7373
},
74-
AudioPacket::OggData(samples) => self.write_bytes(samples),
74+
AudioPacket::OggData(samples) => self.write_bytes(&samples),
7575
}
7676
}
7777
};

playback/src/audio_backend/portaudio.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ impl<'a> Sink for PortAudioSink<'a> {
140140
Ok(())
141141
}
142142

143-
fn write(&mut self, packet: &AudioPacket, converter: &mut Converter) -> SinkResult<()> {
143+
fn write(&mut self, packet: AudioPacket, converter: &mut Converter) -> SinkResult<()> {
144144
macro_rules! write_sink {
145145
(ref mut $stream: expr, $samples: expr) => {
146146
$stream.as_mut().unwrap().write($samples)
@@ -153,15 +153,15 @@ impl<'a> Sink for PortAudioSink<'a> {
153153

154154
let result = match self {
155155
Self::F32(stream, _parameters) => {
156-
let samples_f32: &[f32] = &converter.f64_to_f32(samples);
156+
let samples_f32: &[f32] = &converter.f64_to_f32(&samples);
157157
write_sink!(ref mut stream, samples_f32)
158158
}
159159
Self::S32(stream, _parameters) => {
160-
let samples_s32: &[i32] = &converter.f64_to_s32(samples);
160+
let samples_s32: &[i32] = &converter.f64_to_s32(&samples);
161161
write_sink!(ref mut stream, samples_s32)
162162
}
163163
Self::S16(stream, _parameters) => {
164-
let samples_s16: &[i16] = &converter.f64_to_s16(samples);
164+
let samples_s16: &[i16] = &converter.f64_to_s16(&samples);
165165
write_sink!(ref mut stream, samples_s16)
166166
}
167167
};

playback/src/audio_backend/rodio.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ pub fn open(host: cpal::Host, device: Option<String>, format: AudioFormat) -> Ro
189189
}
190190

191191
impl Sink for RodioSink {
192-
fn write(&mut self, packet: &AudioPacket, converter: &mut Converter) -> SinkResult<()> {
192+
fn write(&mut self, packet: AudioPacket, converter: &mut Converter) -> SinkResult<()> {
193193
let samples = packet
194194
.samples()
195195
.map_err(|e| RodioError::Samples(e.to_string()))?;

playback/src/audio_backend/sdl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ impl Sink for SdlSink {
8282
Ok(())
8383
}
8484

85-
fn write(&mut self, packet: &AudioPacket, converter: &mut Converter) -> SinkResult<()> {
85+
fn write(&mut self, packet: AudioPacket, converter: &mut Converter) -> SinkResult<()> {
8686
macro_rules! drain_sink {
8787
($queue: expr, $size: expr) => {{
8888
// sleep and wait for sdl thread to drain the queue a bit

playback/src/player.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1384,7 +1384,7 @@ impl PlayerInternal {
13841384
}
13851385
}
13861386

1387-
if let Err(e) = self.sink.write(&packet, &mut self.converter) {
1387+
if let Err(e) = self.sink.write(packet, &mut self.converter) {
13881388
error!("{}", e);
13891389
exit(1);
13901390
}

0 commit comments

Comments
 (0)