Add detailed logging for CPAL device enumeration

Logs now show:
- Device index
- Device name
- Is default
- Supported configs (channels/sample rates)

This helps identify devices when pretty names aren't clear.
This commit is contained in:
vicrodh committed 2026-01-17 12:03:13 -06:00
1 parent 1f13370073
commit cb696aca60
1 file changed
+26 -5
+26 -5
View File
@@ -576,24 +576,45 @@ pub fn get_pipewire_sinks() -> Result<Vec<PipewireSink>, String> {
let sinks: Vec<PipewireSink> = host let sinks: Vec<PipewireSink> = host
.output_devices() .output_devices()
.map_err(|e| format!("Failed to enumerate devices: {}", e))? .map_err(|e| format!("Failed to enumerate devices: {}", e))?
.filter_map(|device| { .enumerate()
device.name().ok().map(|name| { .filter_map(|(idx, device)| {
match device.name() {
Ok(name) => {
let is_default = default_device_name.as_ref().map(|d| d == &name).unwrap_or(false); let is_default = default_device_name.as_ref().map(|d| d == &name).unwrap_or(false);
// Get detailed device info for logging
let configs_info = device.supported_output_configs()
.ok()
.map(|configs| {
let config_strs: Vec<String> = configs
.take(3) // Just first 3 configs for brevity
.map(|c| format!("{}ch/{}Hz", c.channels(), c.max_sample_rate().0))
.collect();
config_strs.join(", ")
})
.unwrap_or_else(|| "no configs".to_string());
log::info!(" [{}] Device: '{}' (default: {}) - Configs: {}",
idx, name, is_default, configs_info);
// CRITICAL: Use CPAL device name as both name and description // CRITICAL: Use CPAL device name as both name and description
// This ensures the name we save is the exact name CPAL can find later // This ensures the name we save is the exact name CPAL can find later
PipewireSink { Some(PipewireSink {
name: name.clone(), name: name.clone(),
description: name, // CPAL names are already user-friendly in PipeWire description: name, // CPAL names are already user-friendly in PipeWire
volume: None, // Volume not available via CPAL volume: None, // Volume not available via CPAL
is_default, is_default,
}
}) })
}
Err(e) => {
log::warn!(" [{}] Failed to get device name: {}", idx, e);
None
}
}
}) })
.collect(); .collect();
log::info!("Found {} audio output devices via CPAL", sinks.len()); log::info!("Found {} audio output devices via CPAL", sinks.len());
log::info!("Devices: {:?}", sinks.iter().map(|s| &s.name).collect::<Vec<_>>());
Ok(sinks) Ok(sinks)
} }