1
0
Fork 0
mirror of https://github.com/librespot-org/librespot.git synced 2025-10-05 10:49:40 +02:00

Add support for S32 output format

While at it, add a small tweak when converting "silent" samples
from float to integer. This ensures 0.0 converts to 0 and vice
versa.
This commit is contained in:
Roderick van Domburg 2021-03-13 23:43:24 +01:00
parent a4ef174fd0
commit 5f26a745d7
10 changed files with 81 additions and 18 deletions

View file

@ -14,6 +14,10 @@ pub enum PortAudioSink<'a> {
Option<portaudio_rs::stream::Stream<'a, f32, f32>>,
StreamParameters<f32>,
),
S32(
Option<portaudio_rs::stream::Stream<'a, i32, i32>>,
StreamParameters<i32>,
),
S16(
Option<portaudio_rs::stream::Stream<'a, i16, i16>>,
StreamParameters<i16>,
@ -70,19 +74,20 @@ impl<'a> Open for PortAudioSink<'a> {
};
macro_rules! open_sink {
($sink: expr, $data: expr) => {{
($sink: expr, $type: ty) => {{
let params = StreamParameters {
device: device_idx,
channel_count: NUM_CHANNELS as u32,
suggested_latency: latency,
data: $data,
data: 0.0 as $type,
};
$sink(None, params)
}};
}
match format {
AudioFormat::F32 => open_sink!(PortAudioSink::F32, 0.0),
AudioFormat::S16 => open_sink!(PortAudioSink::S16, 0),
AudioFormat::F32 => open_sink!(PortAudioSink::F32, f32),
AudioFormat::S32 => open_sink!(PortAudioSink::S32, i32),
AudioFormat::S16 => open_sink!(PortAudioSink::S16, i16),
}
}
}
@ -109,6 +114,7 @@ impl<'a> Sink for PortAudioSink<'a> {
}
match self {
PortAudioSink::F32(stream, parameters) => start_sink!(stream, parameters),
PortAudioSink::S32(stream, parameters) => start_sink!(stream, parameters),
PortAudioSink::S16(stream, parameters) => start_sink!(stream, parameters),
};
@ -124,6 +130,7 @@ impl<'a> Sink for PortAudioSink<'a> {
}
match self {
PortAudioSink::F32(stream, _parameters) => stop_sink!(stream),
PortAudioSink::S32(stream, _parameters) => stop_sink!(stream),
PortAudioSink::S16(stream, _parameters) => stop_sink!(stream),
};
@ -141,6 +148,10 @@ impl<'a> Sink for PortAudioSink<'a> {
let samples = packet.samples();
write_sink!(stream, &samples)
}
PortAudioSink::S32(stream, _parameters) => {
let samples_s32: Vec<i32> = AudioPacket::f32_to_s32(packet.samples());
write_sink!(stream, &samples_s32)
}
PortAudioSink::S16(stream, _parameters) => {
let samples_s16: Vec<i16> = AudioPacket::f32_to_s16(packet.samples());
write_sink!(stream, &samples_s16)