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:
+13
-22
@@ -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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user