
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
83 lines
2 KiB
Rust
83 lines
2 KiB
Rust
use assets::SoundRegistry;
|
|
use derive_more::{Deref, DerefMut};
|
|
use gpui::{App, AssetSource, BorrowAppContext, Global};
|
|
use rodio::{OutputStream, OutputStreamBuilder};
|
|
use util::ResultExt;
|
|
|
|
mod assets;
|
|
|
|
pub fn init(source: impl AssetSource, cx: &mut App) {
|
|
SoundRegistry::set_global(source, cx);
|
|
cx.set_global(GlobalAudio(Audio::new()));
|
|
}
|
|
|
|
pub enum Sound {
|
|
Joined,
|
|
Leave,
|
|
Mute,
|
|
Unmute,
|
|
StartScreenshare,
|
|
StopScreenshare,
|
|
AgentDone,
|
|
}
|
|
|
|
impl Sound {
|
|
fn file(&self) -> &'static str {
|
|
match self {
|
|
Self::Joined => "joined_call",
|
|
Self::Leave => "leave_call",
|
|
Self::Mute => "mute",
|
|
Self::Unmute => "unmute",
|
|
Self::StartScreenshare => "start_screenshare",
|
|
Self::StopScreenshare => "stop_screenshare",
|
|
Self::AgentDone => "agent_done",
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Default)]
|
|
pub struct Audio {
|
|
output_handle: Option<OutputStream>,
|
|
}
|
|
|
|
#[derive(Deref, DerefMut)]
|
|
struct GlobalAudio(Audio);
|
|
|
|
impl Global for GlobalAudio {}
|
|
|
|
impl Audio {
|
|
pub fn new() -> Self {
|
|
Self::default()
|
|
}
|
|
|
|
fn ensure_output_exists(&mut self) -> Option<&OutputStream> {
|
|
if self.output_handle.is_none() {
|
|
self.output_handle = OutputStreamBuilder::open_default_stream().log_err();
|
|
}
|
|
|
|
self.output_handle.as_ref()
|
|
}
|
|
|
|
pub fn play_sound(sound: Sound, cx: &mut App) {
|
|
if !cx.has_global::<GlobalAudio>() {
|
|
return;
|
|
}
|
|
|
|
cx.update_global::<GlobalAudio, _>(|this, cx| {
|
|
let output_handle = this.ensure_output_exists()?;
|
|
let source = SoundRegistry::global(cx).get(sound.file()).log_err()?;
|
|
output_handle.mixer().add(source);
|
|
Some(())
|
|
});
|
|
}
|
|
|
|
pub fn end_call(cx: &mut App) {
|
|
if !cx.has_global::<GlobalAudio>() {
|
|
return;
|
|
}
|
|
|
|
cx.update_global::<GlobalAudio, _>(|this, _| {
|
|
this.output_handle.take();
|
|
});
|
|
}
|
|
}
|