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);
}
Beispiel #3
0
/*
 * The purpose of this function is to let the user to select 
 *   the input where he plugged his signals.
 * Now if user select "default", as device, we have to select the input
 *   on the mixer of the card used by  "default".
 * What is the card used by device  "default" ?
 */ 
static void
as_setup_input_combo (GtkWidget *combo, SoundParams *sparams)
{
   snd_mixer_t *handle;
   int i ;
   snd_mixer_selem_id_t *sid;
   snd_mixer_elem_t *elem;
   snd_mixer_selem_id_alloca(&sid);
   char *devname;
   char name[32];

   devname = sparams->device_name;
   if ( *sparams->indexstr == '-' ) {
      sprintf(name, "hw:%d", sparams->firstcard);
      devname = name;
   }
   handle = sound_open_mixer(devname);
   if ( handle == NULL ){
      return ;
   }   

   for (elem = snd_mixer_first_elem(handle); elem; elem = snd_mixer_elem_next(elem)) {
      snd_mixer_selem_get_id(elem, sid);
      if (! snd_mixer_selem_is_active(elem)) {
	 continue;
      }
      const char *control_name = snd_mixer_selem_id_get_name(sid);
//      printf("Simple mixer control '%s',%i\n", control_name,  snd_mixer_selem_id_get_index(sid));
      if (snd_mixer_selem_is_enum_capture(elem)) {
	 int items;
	 char itemname[40];
	 app_free(sparams->control_name);
	 sparams->control_name = app_strdup(control_name);
	 items = snd_mixer_selem_get_enum_items(elem);
//	 printf("  Items:");
	 for (i = 0; i < items; i++) {
	    snd_mixer_selem_get_enum_item_name(elem, i, sizeof(itemname) - 1, itemname);
//	    printf(" '%s'", itemname);
            gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), itemname );
	    if ( i == sparams->input ) {
	       gtk_combo_box_set_active (GTK_COMBO_BOX (combo), i);
	    }
	 }
//	 printf("\n");
      }
   }
   snd_mixer_close(handle);
   return ;
}
Beispiel #4
0
EnumBox *lamixer_enumbox_add(const gchar *str, snd_mixer_elem_t *elem, guint voltype)
{
	EnumBox *enumbox;

	enumbox = g_malloc(sizeof(EnumBox));
	enumbox->type = voltype;
	enumbox->volelem = elem;
	enumbox->enumhbox = gtk_hbox_new(FALSE,0);
	enumbox->enumname = gtk_label_new(str);
	enumbox->enumswitch = gtk_combo_box_new_text();

	int enumsCnt = snd_mixer_selem_get_enum_items(elem);
	for(int i=0; i<enumsCnt; i++) {
		char iname[256];
		snd_mixer_selem_get_enum_item_name(elem, i, sizeof(iname), iname);
		gtk_combo_box_append_text (GTK_COMBO_BOX (enumbox->enumswitch), iname);
	}
	
	gtk_box_pack_start(GTK_BOX(enumbox->enumhbox), enumbox->enumname, FALSE, FALSE, 0);
	gtk_box_pack_start(GTK_BOX(enumbox->enumhbox), enumbox->enumswitch, FALSE, FALSE, 0);

	return enumbox;
}
Beispiel #5
0
GstMixerOptions *
gst_alsa_mixer_options_new (snd_mixer_elem_t * element, gint track_num)
{
    GstMixerOptions *opts;
    GstAlsaMixerOptions *alsa_opts;
    GstMixerTrack *track;
    const gchar *label;
    gint num, i;
    gchar str[256];

    label = snd_mixer_selem_get_name (element);

    opts = g_object_new (GST_ALSA_MIXER_OPTIONS_TYPE,
                         "untranslated-label", label, NULL);
    alsa_opts = (GstAlsaMixerOptions *) opts;
    track = (GstMixerTrack *) opts;

    /* set basic information */
    track->label = g_strdup (label);      /* FIXME: translate this? */
    track->num_channels = 0;
    track->flags = 0;
    alsa_opts->element = element;
    alsa_opts->track_num = track_num;

    /* get enumerations for switch/options object */
    num = snd_mixer_selem_get_enum_items (element);
    for (i = 0; i < num; i++) {
        if (snd_mixer_selem_get_enum_item_name (element, i, 255, str) < 0) {
            g_object_unref (G_OBJECT (alsa_opts));
            return NULL;
        }

        opts->values = g_list_append (opts->values, g_strdup (str));
    }

    return opts;
}