static void change_enum_to_percent(struct control *control, int value) { unsigned int i; unsigned int index; unsigned int new_index; int items; int err; i = ffs(control->enum_channel_bits) - 1; err = snd_mixer_selem_get_enum_item(control->elem, i, &index); if (err < 0) return; new_index = index; if (value == 0) { new_index = 0; } else if (value == 100) { items = snd_mixer_selem_get_enum_items(control->elem); if (items < 1) return; new_index = items - 1; } if (new_index == index) return; for (i = 0; i <= SND_MIXER_SCHN_LAST; ++i) if (control->enum_channel_bits & (1 << i)) snd_mixer_selem_set_enum_item(control->elem, i, new_index); }
static void change_enum_relative(struct control *control, int delta) { int items; unsigned int i; unsigned int index; int new_index; int err; items = snd_mixer_selem_get_enum_items(control->elem); if (items < 1) return; err = snd_mixer_selem_get_enum_item(control->elem, 0, &index); if (err < 0) return; new_index = (int)index + delta; if (new_index < 0) new_index = 0; else if (new_index >= items) new_index = items - 1; if (new_index == index) return; for (i = 0; i <= SND_MIXER_SCHN_LAST; ++i) if (control->enum_channel_bits & (1 << i)) snd_mixer_selem_set_enum_item(control->elem, i, new_index); }
void gst_alsa_mixer_set_option (GstAlsaMixer * mixer, GstMixerOptions * opts, gchar * value) { gint idx = -1, n = 0; GList *item; GstAlsaMixerOptions *alsa_opts = GST_ALSA_MIXER_OPTIONS (opts); g_return_if_fail (mixer->handle != NULL); for (item = opts->values; item != NULL; item = item->next, n++) { if (!strcmp (item->data, value)) { idx = n; break; } } if (idx == -1) return; snd_mixer_selem_set_enum_item (alsa_opts->element, 0, idx); }
void lamixer_enumbox_changed(GtkObject *enumswitch, snd_mixer_elem_t *elem) { snd_mixer_selem_set_enum_item(elem, SND_MIXER_SCHN_FRONT_LEFT, gtk_combo_box_get_active(GTK_COMBO_BOX(enumswitch))); }
/* Controls the alsamixer atributes of GCW device */ void mixer_control(int mode, long *volume, long *min, long *max) { snd_mixer_t *handle; snd_mixer_selem_id_t *sid; snd_mixer_elem_t *elem; snd_mixer_selem_channel_id_t channel = SND_MIXER_SCHN_FRONT_LEFT; snd_mixer_open(&handle, 0); snd_mixer_attach(handle, "default"); 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); if (mode == VOLUME_GET || mode == VOLUME_SET) { snd_mixer_selem_id_set_name(sid, "Headphone"); elem = snd_mixer_find_selem(handle, sid); if (mode == VOLUME_GET) { snd_mixer_selem_get_playback_volume(elem, channel, volume); snd_mixer_selem_get_playback_volume_range(elem, min, max); } else if (mode == VOLUME_SET) { printf("GCW: Volume set to %ld\n", *volume); snd_mixer_selem_set_playback_volume_all(elem, *volume); } /* adjust volume to Bypass too */ snd_mixer_selem_id_set_name(sid, "Line In Bypass"); elem = snd_mixer_find_selem(handle, sid); if (mode == VOLUME_SET) { printf("Line in Bypass: Volume set to %ld\n", *volume); snd_mixer_selem_set_playback_volume_all(elem, *volume); } } else if (mode == HEADPHONE_TURN_ON || mode == HEADPHONE_TURN_OFF) { snd_mixer_selem_id_set_name(sid, "Headphone Source"); elem = snd_mixer_find_selem(handle, sid); if (mode == HEADPHONE_TURN_ON) { printf("Headphone Source: Line In\n"); snd_mixer_selem_set_enum_item(elem, channel, 1); } else if (mode == HEADPHONE_TURN_OFF) { printf("Headphone Source: PCM\n"); snd_mixer_selem_set_enum_item(elem, channel, 0); } } else if (mode == SPEAKER_TURN_ON || mode == SPEAKER_TURN_OFF) { snd_mixer_selem_id_set_name(sid, "Speakers"); elem = snd_mixer_find_selem(handle, sid); if (mode == SPEAKER_TURN_ON) { printf("Speaker turned on\n"); snd_mixer_selem_set_playback_switch_all(elem, 1); } else if (mode == SPEAKER_TURN_OFF) { printf("Speaker turned off\n"); snd_mixer_selem_set_playback_switch_all(elem, 0); } snd_mixer_selem_id_set_name(sid, "Line Out Source"); elem = snd_mixer_find_selem(handle, sid); if (mode == SPEAKER_TURN_ON) { printf("Line Out Source turned on\n"); snd_mixer_selem_set_enum_item(elem, channel, 1); } else if (mode == SPEAKER_TURN_OFF) { printf("Line Out Source turned off\n"); snd_mixer_selem_set_enum_item(elem, channel, 0); } } else if (mode == BYPASS_VERIFICATION) { // volume here means that the radio is running in background or not *volume = 0; unsigned int setting = 0; snd_mixer_selem_id_set_name(sid, "Headphone Source"); elem = snd_mixer_find_selem(handle, sid); snd_mixer_selem_get_enum_item(elem, channel, &setting); // the headphone is turned on if (setting == 1) { *volume = 1; return; } snd_mixer_selem_id_set_name(sid, "Line Out Source"); elem = snd_mixer_find_selem(handle, sid); snd_mixer_selem_get_enum_item(elem, channel, &setting); // if both headphone and speakers are off, return 0 in volume to tell the screen that we need // to setup the radio *volume = setting == 1; } }