-
Notifications
You must be signed in to change notification settings - Fork 276
Description
Hello,
thanks for rodio!
I've been playing with rodio in https://github.com/martinetd/fuurin and one thing that's been annoying me is that even with all sources paused, just having an OutputStream present consumes a non-negligible amount of CPU sending silence to alsa.
(for what it's worth I tried the pipewire output provided in RustAudio/cpal#938 and it's very slightly better, but sensibly the same)
With the current code, I see no other way around dropping the whole output stream which means dropping all the sinks I've opened first then the mixer and the stream itself, but I tried just exposing the _stream
and using outputstream.stream().pause()
and it reduces cpu to zero, so I think it's a much better approach to this problem.
Would you accept a patch such as this?
diff --git a/src/stream.rs b/src/stream.rs
index f6c8bcf550c0..2df5d7307b49 100644
--- a/src/stream.rs
+++ b/src/stream.rs
@@ -44,7 +44,7 @@ pub struct OutputStream {
config: OutputStreamConfig,
mixer: Mixer,
log_on_drop: bool,
- _stream: cpal::Stream,
+ stream: cpal::Stream,
}
impl OutputStream {
@@ -53,6 +53,11 @@ pub fn mixer(&self) -> &Mixer {
&self.mixer
}
+ /// Access the output stream's underlying cpal Stream.
+ pub fn stream(&self) -> &cpal::Stream {
+ &self.stream
+ }
+
/// Access the output stream's config.
pub fn config(&self) -> &OutputStreamConfig {
&self.config
@@ -487,7 +492,7 @@ fn open<E>(
Self::init_stream(device, config, source, error_callback).and_then(|stream| {
stream.play().map_err(StreamError::PlayStreamError)?;
Ok(Self {
- _stream: stream,
+ stream: stream,
mixer: controller,
config: *config,
log_on_drop: true,
Or would it be better to expose pause() and play() method directly that'd just call self.stream.pause()
/play()
?
I think allowing access to the stream is more flexible ultimately, but happy either way.
I'll open a PR once there's an agreement on which is better :)
Thanks!