static void open_mixer (MokoAlsaVolumeControl *self) { MokoAlsaVolumeControlPrivate *priv = ALSA_VOLUME_CONTROL_PRIVATE (self); if (snd_mixer_open (&priv->mixer_handle, 0) != 0) { g_warning ("Failed to get mixer handle"); priv->mixer_handle = NULL; return; } snd_mixer_set_callback (priv->mixer_handle, mixer_event_cb); snd_mixer_set_callback_private (priv->mixer_handle, self); g_debug ("Opened mixer"); }
static int _mixer_callback_del(E_Mixer_System *self, struct e_mixer_callback_desc *desc) { Ecore_Fd_Handler *handler; EINA_LIST_FREE(desc->handlers, handler) ecore_main_fd_handler_del(handler); snd_mixer_set_callback_private(self, NULL); memset(desc, 0, sizeof(*desc)); free(desc); return 1; }
static int _mixer_callback_add(E_Mixer_System *self, int (*func)(void *data, E_Mixer_System *self), void *data) { struct e_mixer_callback_desc *desc; struct pollfd *pfds; int len; len = snd_mixer_poll_descriptors_count(self); if (len <= 0) return 0; desc = malloc(sizeof(struct e_mixer_callback_desc)); if (!desc) return 0; desc->func = func; desc->data = data; desc->self = self; desc->idler = NULL; desc->handlers = NULL; pfds = alloca(len * sizeof(struct pollfd)); len = snd_mixer_poll_descriptors(self, pfds, len); if (len <= 0) { free(desc); return 0; } while (len > 0) { Ecore_Fd_Handler *fd_handler; len--; fd_handler = ecore_main_fd_handler_add( pfds[len].fd, ECORE_FD_READ, _cb_fd_handler, desc, NULL, NULL); desc->handlers = eina_list_prepend(desc->handlers, fd_handler); } snd_mixer_set_callback_private(self, desc); return 1; }
/* First some utils, then the mixer implementation */ static gboolean gst_alsa_mixer_open (GstAlsaMixer * mixer) { gint err; snd_ctl_t *ctl; snd_ctl_card_info_t *card_info; g_return_val_if_fail (mixer->handle == NULL, FALSE); /* open and initialize the mixer device */ err = snd_mixer_open (&mixer->handle, 0); if (err < 0 || mixer->handle == NULL) goto open_failed; if ((err = snd_mixer_attach (mixer->handle, mixer->device)) < 0) { GST_WARNING ("Cannot open mixer for sound device '%s': %s", mixer->device, snd_strerror (err)); goto error; } if ((err = snd_mixer_selem_register (mixer->handle, NULL, NULL)) < 0) { GST_WARNING ("Cannot register mixer elements: %s", snd_strerror (err)); goto error; } if ((err = snd_mixer_load (mixer->handle)) < 0) { GST_WARNING ("Cannot load mixer settings: %s", snd_strerror (err)); goto error; } snd_mixer_set_callback_private (mixer->handle, mixer); snd_mixer_set_callback (mixer->handle, gst_alsa_mixer_handle_callback); /* now get the device name, any of this is not fatal */ g_free (mixer->cardname); if ((err = snd_ctl_open (&ctl, mixer->device, 0)) < 0) { GST_WARNING ("Cannot open CTL: %s", snd_strerror (err)); goto no_card_name; } snd_ctl_card_info_malloc (&card_info); if ((err = snd_ctl_card_info (ctl, card_info)) < 0) { GST_WARNING ("Cannot get card info: %s", snd_strerror (err)); snd_ctl_close (ctl); goto no_card_name; } mixer->cardname = g_strdup (snd_ctl_card_info_get_name (card_info)); GST_DEBUG ("Card name = %s", GST_STR_NULL (mixer->cardname)); snd_ctl_card_info_free (card_info); snd_ctl_close (ctl); no_card_name: if (mixer->cardname == NULL) { mixer->cardname = g_strdup ("Unknown"); GST_DEBUG ("Cannot find card name"); } GST_INFO ("Successfully opened mixer for device '%s'.", mixer->device); return TRUE; /* ERROR */ open_failed: { GST_WARNING ("Cannot open mixer: %s", snd_strerror (err)); mixer->handle = NULL; return FALSE; } error: { snd_mixer_close (mixer->handle); mixer->handle = NULL; return FALSE; } }