alsa-programmierung unter linux



  • Ich habe Probleme, die gegenwärtige Lautstärke auszulesen.

    snd_ctl_elem_value_get_integer()
    

    gibt immer 0 zurück, es sei denn ich habe gerade eine neue Lautstärke mit

    snd_ctl_elem_value_set_integer()
    

    gesetzt und hctl noch nicht geschlossen.

    Ich brauch aber die Lautstärke bevor ich irgendwas setze, um beim Programmstart einer Mixer-Anwendung die Regler-Stellung entsprechend festzulegen.

    Hat jemand einen Tip?



  • Hat niemand hier Erfahrung mit Alsa?
    Um die Lautstärke des PCM Kanals zu ändern würde man so vorgehen:

    int volume = 80;
    
    snd_hctl_t *hctl;
    snd_ctl_elem_id_t *id;
    snd_ctl_elem_value_t *control;
    snd_hctl_elem_t *elem;
    
    snd_hctl_open(&hctl, "hw:0", 0);
    snd_hctl_load(hctl);
    
    snd_ctl_elem_id_alloca(&id);
    snd_ctl_elem_value_alloca(&control);
    
    snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
    snd_ctl_elem_id_set_name(id, "PCM Playback Volume");
    elem = snd_hctl_find_elem(hctl, id);
    
    snd_ctl_elem_value_set_id(control, id);
    
    snd_ctl_elem_value_set_integer(control, 0, volume);
    snd_ctl_elem_value_set_integer(control, 1, volume);
    
    snd_hctl_elem_write(elem, control);
    
    snd_hctl_close(hctl);
    

    Das funktioniert auch einwandfrei.

    Analog stell ich mir vor, Lautstärke auf diese Art auszulesen:

    snd_hctl_t *hctl;
    snd_ctl_elem_id_t *id;
    snd_ctl_elem_value_t *control;
    snd_hctl_elem_t *elem;
    
    snd_hctl_open(&hctl, "hw:0", 0);
    snd_hctl_load(hctl);
    
    snd_ctl_elem_id_alloca(&id);
    snd_ctl_elem_value_alloca(&control);
    
    snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
    snd_ctl_elem_id_set_name(id, "PCM Playback Volume");
    elem = snd_hctl_find_elem(hctl, id);
    
    snd_ctl_elem_value_set_id(control, id);
    
    int volume = snd_ctl_elem_value_get_integer(control, 0);
    
    snd_hctl_close(hctl);
    

    Aber warum ist beim Lesen die Lautstärke immer 0? Tut snd_ctl_elem_value_get_integer() nicht was ich glaube?



  • nööö 😃


Anmelden zum Antworten