Skip to content

Volume & EQ

All setter methods are synchronous SOAP calls that update the internal state cache on success.

MethodSignatureDescription
set_volumeset_volume(volume: u8)Absolute volume (0–100)
set_relative_volumeset_relative_volume(adjustment: i8)Relative adjustment, returns new level
set_muteset_mute(muted: bool)Mute or unmute
use sonos_sdk::prelude::*;
fn main() -> Result<(), SdkError> {
let sonos = SonosSystem::new()?;
let speaker = sonos.speaker("Kitchen").unwrap();
// Set absolute volume
speaker.set_volume(40)?;
// Adjust relative to current
let result = speaker.set_relative_volume(5)?;
println!("New volume: {}", result.new_volume);
// Mute
speaker.set_mute(true)?;
Ok(())
}
MethodSignatureRangeDescription
set_bassset_bass(level: i8)-10 to +10Bass EQ
set_trebleset_treble(level: i8)-10 to +10Treble EQ
set_loudnessset_loudness(enabled: bool)Loudness compensation
speaker.set_bass(5)?;
speaker.set_treble(-3)?;
speaker.set_loudness(true)?;

Loudness boosts bass and treble at low volumes to compensate for human hearing characteristics.

let bass = speaker.bass.fetch()?;
let treble = speaker.treble.fetch()?;
let loudness = speaker.loudness.fetch()?;
println!("Bass: {}, Treble: {}, Loudness: {}", bass, treble, loudness);

Group volume adjusts all members proportionally. Controlled via the group handle:

MethodSignatureDescription
set_volumeset_volume(volume: u16)Absolute group volume (0–100)
set_relative_volumeset_relative_volume(adjustment: i16)Relative adjustment, returns new level
set_muteset_mute(muted: bool)Mute/unmute entire group
snapshot_volumesnapshot_volume()Save current levels for restore
let group = sonos.speaker("Living Room").unwrap().group().unwrap();
// Absolute
group.set_volume(40)?;
// Relative
let result = group.set_relative_volume(-5)?;
println!("New group volume: {}", result.new_volume);
// Mute all
group.set_mute(true)?;

Capture current group volume levels before a temporary change (e.g., an announcement):

let group = sonos.speaker("Living Room").unwrap().group().unwrap();
// Save current state
group.snapshot_volume()?;
// Temporarily lower for announcement
group.set_volume(20)?;
// Firmware restores after snapshot

All volume and EQ properties support the reactive watch() pattern:

for event in sonos.iter() {
let volume = speaker.volume.watch()?;
let mute = speaker.mute.watch()?;
let bass = speaker.bass.watch()?;
let treble = speaker.treble.watch()?;
let loudness = speaker.loudness.watch()?;
println!("Vol: {:?}, Mute: {:?}, Bass: {:?}, Treble: {:?}, Loudness: {:?}",
volume.value(), mute.value(), bass.value(), treble.value(), loudness.value());
}

Group volume is also watchable:

let group = sonos.speaker("Living Room").unwrap().group().unwrap();
for event in sonos.iter() {
let vol = group.volume.watch()?;
let mute = group.mute.watch()?;
println!("Group vol: {:?}, mute: {:?}", vol.value(), mute.value());
}