fix: Device-Discovery und Sidetone gegen echte Hardware korrigiert

- PID-Filter in find_and_open(), damit nicht die Harpoon-Maus statt
  dem HS80 geöffnet wird
- ALSA Sidetone: Card-Suche über Sidetone-Control statt Kartenname
  (war abgeschnitten zu "Gamin")
- Verbose-Flag (-v) für Debug-Output der Init-Sequenz
This commit is contained in:
2026-03-27 22:10:40 +01:00
parent c5f8625345
commit 812d14b81a
5 changed files with 111 additions and 37 deletions
+13 -22
View File
@@ -5,21 +5,19 @@ use alsa::mixer::{Mixer, SelemChannelId, SelemId};
use crate::error::Result;
const CARD_NAME: &str = "Gaming";
const SIDETONE_VOLUME: &str = "Sidetone Playback Volume";
const SIDETONE_SWITCH: &str = "Sidetone Playback Switch";
const SIDETONE_CONTROL: &str = "Sidetone";
/// Findet die ALSA-Card-Nummer für die Corsair Gaming Soundkarte.
/// Findet die ALSA-Card mit einem Sidetone-Control.
///
/// Sucht nach der Karte, die ein "Sidetone" Control hat,
/// statt sich auf den Kartennamen zu verlassen (der kann abgeschnitten sein).
fn find_card() -> Result<String> {
// ALSA-Cards durchiterieren
for card_idx in 0..32 {
let name = format!("hw:{card_idx}");
if let Ok(ctl) = alsa::Ctl::new(&name, false) {
if let Ok(info) = ctl.card_info() {
let card_name = info.get_name().unwrap_or_default();
if card_name.contains(CARD_NAME) {
return Ok(name);
}
for card in alsa::card::Iter::new().flatten() {
let name = format!("hw:{}", card.get_index());
if let Ok(mixer) = Mixer::new(&name, false) {
let selem_id = SelemId::new(SIDETONE_CONTROL, 0);
if mixer.find_selem(&selem_id).is_some() {
return Ok(name);
}
}
}
@@ -31,7 +29,7 @@ pub fn get_level() -> Result<i64> {
let card = find_card()?;
let mixer = Mixer::new(&card, false)?;
let selem_id = SelemId::new(SIDETONE_VOLUME, 0);
let selem_id = SelemId::new(SIDETONE_CONTROL, 0);
let selem = mixer
.find_selem(&selem_id)
.ok_or(crate::error::CorsairError::DeviceNotFound)?;
@@ -46,19 +44,12 @@ pub fn set_level(level: i64) -> Result<()> {
let mixer = Mixer::new(&card, false)?;
// Volume setzen
let volume_id = SelemId::new(SIDETONE_VOLUME, 0);
let volume_id = SelemId::new(SIDETONE_CONTROL, 0);
let volume_elem = mixer
.find_selem(&volume_id)
.ok_or(crate::error::CorsairError::DeviceNotFound)?;
volume_elem.set_playback_volume_all(level)?;
// Switch aktivieren falls Level > 0
let switch_id = SelemId::new(SIDETONE_SWITCH, 0);
if let Some(switch_elem) = mixer.find_selem(&switch_id) {
let enabled = if level > 0 { 1 } else { 0 };
let _ = switch_elem.set_playback_switch_all(enabled);
}
Ok(())
}