Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Expose Squeezelite virtual device and persist ports

Keep the always-present 'squeezelite' virtual device during client
cleanup so users can select the output before any client connects. Also
map
the 'squeezelite' service to the Speaker icon in the UI.

+22 -6
+2
crates/server/src/handlers/devices.rs
··· 74 74 let slim_port = settings.squeezelite_port.unwrap_or(3483); 75 75 let http_port = settings.squeezelite_http_port.unwrap_or(9999); 76 76 settings.audio_output = Some("squeezelite".to_string()); 77 + settings.squeezelite_port = Some(slim_port); 78 + settings.squeezelite_http_port = Some(http_port); 77 79 pcm::squeezelite_set_slim_port(slim_port); 78 80 pcm::squeezelite_set_http_port(http_port); 79 81 pcm::switch_sink(pcm::PCM_SINK_SQUEEZELITE);
+19 -5
crates/server/src/scan.rs
··· 10 10 time::Duration, 11 11 }; 12 12 13 - /// Returns the always-present virtual output devices (built-in SDL and 14 - /// Snapcast/FIFO). Squeezelite clients are discovered dynamically via Slim 15 - /// Protocol HELO tracking, not listed here. 13 + /// Returns the always-present virtual output devices (built-in SDL, 14 + /// Snapcast/FIFO, and Squeezelite). Squeezelite clients discovered via Slim 15 + /// Protocol HELO are listed separately alongside this entry. 16 16 pub fn virtual_devices() -> Vec<Device> { 17 17 vec![ 18 18 Device { ··· 35 35 port: 0, 36 36 service: "fifo".to_string(), 37 37 app: "fifo".to_string(), 38 + is_cast_device: false, 39 + is_source_device: false, 40 + ..Default::default() 41 + }, 42 + Device { 43 + id: "squeezelite".to_string(), 44 + name: "Squeezelite".to_string(), 45 + host: "localhost".to_string(), 46 + ip: "127.0.0.1".to_string(), 47 + port: 3483, 48 + service: "squeezelite".to_string(), 49 + app: "squeezelite".to_string(), 38 50 is_cast_device: false, 39 51 is_source_device: false, 40 52 ..Default::default() ··· 181 193 } 182 194 } 183 195 184 - // Remove clients that have disconnected. 196 + // Remove clients that have disconnected, but keep the always-present 197 + // virtual "squeezelite" entry so users can select the output before 198 + // any client has connected. 185 199 devs.retain(|d| { 186 - if d.service != "squeezelite" { 200 + if d.service != "squeezelite" || d.id == "squeezelite" { 187 201 return true; 188 202 } 189 203 connected.iter().any(|c| c.id == d.id)
+1 -1
gpui/src/ui/components/device_picker.rs
··· 12 12 match device.service.as_str() { 13 13 "chromecast" => Icons::Chromecast, 14 14 "airplay" => Icons::Airplay, 15 - "snapcast" => Icons::Speaker, 15 + "snapcast" | "squeezelite" => Icons::Speaker, 16 16 _ => { 17 17 if device.is_current_device { 18 18 Icons::Device