2011-07-22 13 views
24

He estado buscando un ejemplo simple de código C para configurar el volumen maestro de la mezcladora ALSA, pero no pude encontrar nada simple para esta operación supuestamente común.Establecer el volumen maestro ALSA desde el código C

No estoy totalmente familiarizado con ALSA, por lo que hacer mi propio ejemplo mínimo llevará tiempo. Me alegraría si alguien pudiera proporcionar uno.

Respuesta

37

Lo siguiente me funciona. El volumen del parámetro se debe dar en el rango [0, 100]. ¡Cuidado, no hay manejo de errores!

void SetAlsaMasterVolume(long volume) 
{ 
    long min, max; 
    snd_mixer_t *handle; 
    snd_mixer_selem_id_t *sid; 
    const char *card = "default"; 
    const char *selem_name = "Master"; 

    snd_mixer_open(&handle, 0); 
    snd_mixer_attach(handle, card); 
    snd_mixer_selem_register(handle, NULL, NULL); 
    snd_mixer_load(handle); 

    snd_mixer_selem_id_alloca(&sid); 
    snd_mixer_selem_id_set_index(sid, 0); 
    snd_mixer_selem_id_set_name(sid, selem_name); 
    snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid); 

    snd_mixer_selem_get_playback_volume_range(elem, &min, &max); 
    snd_mixer_selem_set_playback_volume_all(elem, volume * max/100); 

    snd_mixer_close(handle); 
} 
+2

¿Qué archivo de encabezado son estos? –

+2

@JonathanHenson: #include . Creo que puede haber uno que incluya menos, quizás #include . – trenki

+0

gracias! eso es lo que necesitaba. –

0

También intento configurar el volumen de un dispositivo alsa desde un programa c. Puedo configurar el volumen pero solo en porcentaje de dB. Primero obtengo el rango del volumen y obtengo un valor mínimo de 0 y un valor máximo de 67. Cuando trato de usar la función snd_mixer_selem_ask_playback_dB_vol para obtener un valor que no sea dB, siempre obtengo 67 para el valor mínimo y máximo. ¿Alguien tiene el mismo problema y hay una solución?

long value = 0, min_vol=0, max_vol=0; 
    snd_mixer_selem_get_playback_volume_range(elem, &min, &max); 
    cout << "MIN == " << min << endl; // = 0 
    cout << "MAX == " << max << endl; // = 76 
    if (snd_mixer_selem_ask_playback_dB_vol(elem, min,1, &min_vol) != 0) 
    cout << "ERROR" << endl; 
    cout << "min_vol == " << min_vol <<endl; // = 76 
    if (snd_mixer_selem_ask_playback_dB_vol(elem, max,1, &max_vol) != 0) 
    cout << "ERROR" << endl; 
    cout << "max_vol == " << max_vol <<endl; // = 76 
Cuestiones relacionadas