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
+33 -12
+33 -12
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)| {
let is_default = default_device_name.as_ref().map(|d| d == &name).unwrap_or(false); match device.name() {
Ok(name) => {
let is_default = default_device_name.as_ref().map(|d| d == &name).unwrap_or(false);
// CRITICAL: Use CPAL device name as both name and description // Get detailed device info for logging
// This ensures the name we save is the exact name CPAL can find later let configs_info = device.supported_output_configs()
PipewireSink { .ok()
name: name.clone(), .map(|configs| {
description: name, // CPAL names are already user-friendly in PipeWire let config_strs: Vec<String> = configs
volume: None, // Volume not available via CPAL .take(3) // Just first 3 configs for brevity
is_default, .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
// This ensures the name we save is the exact name CPAL can find later
Some(PipewireSink {
name: name.clone(),
description: name, // CPAL names are already user-friendly in PipeWire
volume: None, // Volume not available via CPAL
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)
} }