Upgrade rodio to 0.21 (#34368)

Hi all,

We just released [Rodio
0.21](https://github.com/RustAudio/rodio/blob/master/CHANGELOG.md)
🥳 with quite some breaking changes. This should take care
of those for zed. I tested it by hopping in and out some of the zed
channels, sound seems to still work.

Given zed uses tracing I also took the liberty of enabling the tracing
feature for rodio.

edit:
We changed the default wav decoder from hound to symphonia. The latter
has a slightly more restrictive license however that should be no issue
here (as the audio crate uses the GPL)

Release Notes:

- N/A
This commit is contained in:
David Kleingeld 2025-07-29 22:24:34 +02:00 committed by GitHub
parent 3973142324
commit 1501ae0013
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 85 additions and 117 deletions

171
Cargo.lock generated
View file

@ -3684,17 +3684,6 @@ dependencies = [
"libm", "libm",
] ]
[[package]]
name = "coreaudio-rs"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace"
dependencies = [
"bitflags 1.3.2",
"core-foundation-sys",
"coreaudio-sys",
]
[[package]] [[package]]
name = "coreaudio-rs" name = "coreaudio-rs"
version = "0.12.1" version = "0.12.1"
@ -3752,29 +3741,6 @@ dependencies = [
"unicode-segmentation", "unicode-segmentation",
] ]
[[package]]
name = "cpal"
version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779"
dependencies = [
"alsa",
"core-foundation-sys",
"coreaudio-rs 0.11.3",
"dasp_sample",
"jni",
"js-sys",
"libc",
"mach2",
"ndk 0.8.0",
"ndk-context",
"oboe",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"windows 0.54.0",
]
[[package]] [[package]]
name = "cpal" name = "cpal"
version = "0.16.0" version = "0.16.0"
@ -3788,7 +3754,7 @@ dependencies = [
"js-sys", "js-sys",
"libc", "libc",
"mach2", "mach2",
"ndk 0.9.0", "ndk",
"ndk-context", "ndk-context",
"num-derive", "num-derive",
"num-traits", "num-traits",
@ -5367,6 +5333,12 @@ dependencies = [
"zune-inflate", "zune-inflate",
] ]
[[package]]
name = "extended"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365"
[[package]] [[package]]
name = "extension" name = "extension"
version = "0.1.0" version = "0.1.0"
@ -7742,12 +7714,6 @@ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.59.0",
] ]
[[package]]
name = "hound"
version = "3.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f"
[[package]] [[package]]
name = "html5ever" name = "html5ever"
version = "0.27.0" version = "0.27.0"
@ -9595,7 +9561,7 @@ dependencies = [
"core-foundation 0.10.0", "core-foundation 0.10.0",
"core-video", "core-video",
"coreaudio-rs 0.12.1", "coreaudio-rs 0.12.1",
"cpal 0.16.0", "cpal",
"futures 0.3.31", "futures 0.3.31",
"gpui", "gpui",
"gpui_tokio", "gpui_tokio",
@ -10366,20 +10332,6 @@ dependencies = [
"workspace-hack", "workspace-hack",
] ]
[[package]]
name = "ndk"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7"
dependencies = [
"bitflags 2.9.0",
"jni-sys",
"log",
"ndk-sys 0.5.0+25.2.9519653",
"num_enum",
"thiserror 1.0.69",
]
[[package]] [[package]]
name = "ndk" name = "ndk"
version = "0.9.0" version = "0.9.0"
@ -10389,7 +10341,7 @@ dependencies = [
"bitflags 2.9.0", "bitflags 2.9.0",
"jni-sys", "jni-sys",
"log", "log",
"ndk-sys 0.6.0+11769913", "ndk-sys",
"num_enum", "num_enum",
"thiserror 1.0.69", "thiserror 1.0.69",
] ]
@ -10400,15 +10352,6 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
[[package]]
name = "ndk-sys"
version = "0.5.0+25.2.9519653"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691"
dependencies = [
"jni-sys",
]
[[package]] [[package]]
name = "ndk-sys" name = "ndk-sys"
version = "0.6.0+11769913" version = "0.6.0+11769913"
@ -10978,29 +10921,6 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "oboe"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb"
dependencies = [
"jni",
"ndk 0.8.0",
"ndk-context",
"num-derive",
"num-traits",
"oboe-sys",
]
[[package]]
name = "oboe-sys"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d"
dependencies = [
"cc",
]
[[package]] [[package]]
name = "ollama" name = "ollama"
version = "0.1.0" version = "0.1.0"
@ -13780,12 +13700,15 @@ dependencies = [
[[package]] [[package]]
name = "rodio" name = "rodio"
version = "0.20.1" version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7ceb6607dd738c99bc8cb28eff249b7cd5c8ec88b9db96c0608c1480d140fb1" checksum = "e40ecf59e742e03336be6a3d53755e789fd05a059fa22dfa0ed624722319e183"
dependencies = [ dependencies = [
"cpal 0.15.3", "cpal",
"hound", "dasp_sample",
"num-rational",
"symphonia",
"tracing",
] ]
[[package]] [[package]]
@ -15806,6 +15729,66 @@ dependencies = [
"zeno", "zeno",
] ]
[[package]]
name = "symphonia"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9"
dependencies = [
"lazy_static",
"symphonia-codec-pcm",
"symphonia-core",
"symphonia-format-riff",
"symphonia-metadata",
]
[[package]]
name = "symphonia-codec-pcm"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f395a67057c2ebc5e84d7bb1be71cce1a7ba99f64e0f0f0e303a03f79116f89b"
dependencies = [
"log",
"symphonia-core",
]
[[package]]
name = "symphonia-core"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3"
dependencies = [
"arrayvec",
"bitflags 1.3.2",
"bytemuck",
"lazy_static",
"log",
]
[[package]]
name = "symphonia-format-riff"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f7be232f962f937f4b7115cbe62c330929345434c834359425e043bfd15f50"
dependencies = [
"extended",
"log",
"symphonia-core",
"symphonia-metadata",
]
[[package]]
name = "symphonia-metadata"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c"
dependencies = [
"encoding_rs",
"lazy_static",
"log",
"symphonia-core",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.109" version = "1.0.109"
@ -19693,14 +19676,12 @@ dependencies = [
"cc", "cc",
"chrono", "chrono",
"cipher", "cipher",
"clang-sys",
"clap", "clap",
"clap_builder", "clap_builder",
"codespan-reporting 0.12.0", "codespan-reporting 0.12.0",
"concurrent-queue", "concurrent-queue",
"core-foundation 0.9.4", "core-foundation 0.9.4",
"core-foundation-sys", "core-foundation-sys",
"coreaudio-sys",
"cranelift-codegen", "cranelift-codegen",
"crc32fast", "crc32fast",
"crossbeam-epoch", "crossbeam-epoch",

View file

@ -18,6 +18,6 @@ collections.workspace = true
derive_more.workspace = true derive_more.workspace = true
gpui.workspace = true gpui.workspace = true
parking_lot.workspace = true parking_lot.workspace = true
rodio = { version = "0.20.0", default-features = false, features = ["wav"] } rodio = { version = "0.21.1", default-features = false, features = ["wav", "playback", "tracing"] }
util.workspace = true util.workspace = true
workspace-hack.workspace = true workspace-hack.workspace = true

View file

@ -3,12 +3,9 @@ use std::{io::Cursor, sync::Arc};
use anyhow::{Context as _, Result}; use anyhow::{Context as _, Result};
use collections::HashMap; use collections::HashMap;
use gpui::{App, AssetSource, Global}; use gpui::{App, AssetSource, Global};
use rodio::{ use rodio::{Decoder, Source, source::Buffered};
Decoder, Source,
source::{Buffered, SamplesConverter},
};
type Sound = Buffered<SamplesConverter<Decoder<Cursor<Vec<u8>>>, f32>>; type Sound = Buffered<Decoder<Cursor<Vec<u8>>>>;
pub struct SoundRegistry { pub struct SoundRegistry {
cache: Arc<parking_lot::Mutex<HashMap<String, Sound>>>, cache: Arc<parking_lot::Mutex<HashMap<String, Sound>>>,
@ -48,7 +45,7 @@ impl SoundRegistry {
.with_context(|| format!("No asset available for path {path}"))?? .with_context(|| format!("No asset available for path {path}"))??
.into_owned(); .into_owned();
let cursor = Cursor::new(bytes); let cursor = Cursor::new(bytes);
let source = Decoder::new(cursor)?.convert_samples::<f32>().buffered(); let source = Decoder::new(cursor)?.buffered();
self.cache.lock().insert(name.to_string(), source.clone()); self.cache.lock().insert(name.to_string(), source.clone());

View file

@ -1,7 +1,7 @@
use assets::SoundRegistry; use assets::SoundRegistry;
use derive_more::{Deref, DerefMut}; use derive_more::{Deref, DerefMut};
use gpui::{App, AssetSource, BorrowAppContext, Global}; use gpui::{App, AssetSource, BorrowAppContext, Global};
use rodio::{OutputStream, OutputStreamHandle}; use rodio::{OutputStream, OutputStreamBuilder};
use util::ResultExt; use util::ResultExt;
mod assets; mod assets;
@ -37,8 +37,7 @@ impl Sound {
#[derive(Default)] #[derive(Default)]
pub struct Audio { pub struct Audio {
_output_stream: Option<OutputStream>, output_handle: Option<OutputStream>,
output_handle: Option<OutputStreamHandle>,
} }
#[derive(Deref, DerefMut)] #[derive(Deref, DerefMut)]
@ -51,11 +50,9 @@ impl Audio {
Self::default() Self::default()
} }
fn ensure_output_exists(&mut self) -> Option<&OutputStreamHandle> { fn ensure_output_exists(&mut self) -> Option<&OutputStream> {
if self.output_handle.is_none() { if self.output_handle.is_none() {
let (_output_stream, output_handle) = OutputStream::try_default().log_err().unzip(); self.output_handle = OutputStreamBuilder::open_default_stream().log_err();
self.output_handle = output_handle;
self._output_stream = _output_stream;
} }
self.output_handle.as_ref() self.output_handle.as_ref()
@ -69,7 +66,7 @@ impl Audio {
cx.update_global::<GlobalAudio, _>(|this, cx| { cx.update_global::<GlobalAudio, _>(|this, cx| {
let output_handle = this.ensure_output_exists()?; let output_handle = this.ensure_output_exists()?;
let source = SoundRegistry::global(cx).get(sound.file()).log_err()?; let source = SoundRegistry::global(cx).get(sound.file()).log_err()?;
output_handle.play_raw(source).log_err()?; output_handle.mixer().add(source);
Some(()) Some(())
}); });
} }
@ -80,7 +77,6 @@ impl Audio {
} }
cx.update_global::<GlobalAudio, _>(|this, _| { cx.update_global::<GlobalAudio, _>(|this, _| {
this._output_stream.take();
this.output_handle.take(); this.output_handle.take();
}); });
} }

View file

@ -284,7 +284,6 @@ winnow = { version = "0.7", features = ["simd"] }
codespan-reporting = { version = "0.12" } codespan-reporting = { version = "0.12" }
core-foundation = { version = "0.9" } core-foundation = { version = "0.9" }
core-foundation-sys = { version = "0.8" } core-foundation-sys = { version = "0.8" }
coreaudio-sys = { version = "0.2", default-features = false, features = ["audio_toolbox", "audio_unit", "core_audio", "core_midi", "open_al"] }
foldhash = { version = "0.1", default-features = false, features = ["std"] } foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] } gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
@ -310,11 +309,9 @@ tokio-stream = { version = "0.1", features = ["fs"] }
tower = { version = "0.5", default-features = false, features = ["timeout", "util"] } tower = { version = "0.5", default-features = false, features = ["timeout", "util"] }
[target.x86_64-apple-darwin.build-dependencies] [target.x86_64-apple-darwin.build-dependencies]
clang-sys = { version = "1", default-features = false, features = ["clang_11_0", "runtime"] }
codespan-reporting = { version = "0.12" } codespan-reporting = { version = "0.12" }
core-foundation = { version = "0.9" } core-foundation = { version = "0.9" }
core-foundation-sys = { version = "0.8" } core-foundation-sys = { version = "0.8" }
coreaudio-sys = { version = "0.2", default-features = false, features = ["audio_toolbox", "audio_unit", "core_audio", "core_midi", "open_al"] }
foldhash = { version = "0.1", default-features = false, features = ["std"] } foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] } gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
@ -344,7 +341,6 @@ tower = { version = "0.5", default-features = false, features = ["timeout", "uti
codespan-reporting = { version = "0.12" } codespan-reporting = { version = "0.12" }
core-foundation = { version = "0.9" } core-foundation = { version = "0.9" }
core-foundation-sys = { version = "0.8" } core-foundation-sys = { version = "0.8" }
coreaudio-sys = { version = "0.2", default-features = false, features = ["audio_toolbox", "audio_unit", "core_audio", "core_midi", "open_al"] }
foldhash = { version = "0.1", default-features = false, features = ["std"] } foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] } gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
@ -370,11 +366,9 @@ tokio-stream = { version = "0.1", features = ["fs"] }
tower = { version = "0.5", default-features = false, features = ["timeout", "util"] } tower = { version = "0.5", default-features = false, features = ["timeout", "util"] }
[target.aarch64-apple-darwin.build-dependencies] [target.aarch64-apple-darwin.build-dependencies]
clang-sys = { version = "1", default-features = false, features = ["clang_11_0", "runtime"] }
codespan-reporting = { version = "0.12" } codespan-reporting = { version = "0.12" }
core-foundation = { version = "0.9" } core-foundation = { version = "0.9" }
core-foundation-sys = { version = "0.8" } core-foundation-sys = { version = "0.8" }
coreaudio-sys = { version = "0.2", default-features = false, features = ["audio_toolbox", "audio_unit", "core_audio", "core_midi", "open_al"] }
foldhash = { version = "0.1", default-features = false, features = ["std"] } foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] } getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] } gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }