static void task_monitor_alsa (gpointer data) { struct pollfd *pfds; unsigned int nfds, rnfds; unsigned short revents; GstAlsaMixer *mixer = (GstAlsaMixer *) data; g_static_rec_mutex_lock (mixer->rec_mutex); nfds = snd_mixer_poll_descriptors_count (mixer->handle); if (nfds <= 0) { GST_ERROR ("snd_mixer_poll_descriptors_count <= 0: %d", nfds); /* FIXME: sleep ? stop monitoring ? */ return; } pfds = g_newa (struct pollfd, nfds + 1); rnfds = snd_mixer_poll_descriptors (mixer->handle, pfds, nfds); g_assert (rnfds <= nfds); pfds[rnfds].fd = mixer->pfd[0]; pfds[rnfds].events = POLLIN | POLLPRI | POLLHUP | POLLERR; pfds[rnfds].revents = 0; g_static_rec_mutex_unlock (mixer->rec_mutex); GST_LOG ("task loop"); poll (pfds, rnfds + 1, -1); g_static_rec_mutex_lock (mixer->rec_mutex); snd_mixer_poll_descriptors_revents (mixer->handle, pfds, nfds, &revents); if (revents & POLLIN || revents & POLLPRI) { GST_DEBUG ("Handling events"); snd_mixer_handle_events (mixer->handle); } g_static_rec_mutex_unlock (mixer->rec_mutex); }
static void task_monitor_alsa (gpointer data) { struct pollfd *pfds; unsigned int nfds, rnfds; unsigned short revents; GstAlsaMixer *mixer = (GstAlsaMixer *) data; gint ret; g_static_rec_mutex_lock (mixer->rec_mutex); nfds = snd_mixer_poll_descriptors_count (mixer->handle); if (nfds <= 0) { GST_ERROR ("snd_mixer_poll_descriptors_count <= 0: %d", nfds); /* FIXME: sleep ? stop monitoring ? */ g_static_rec_mutex_unlock (mixer->rec_mutex); return; } pfds = g_newa (struct pollfd, nfds + 1); rnfds = snd_mixer_poll_descriptors (mixer->handle, pfds, nfds); g_assert (rnfds <= nfds); if (rnfds < 0) { GST_ELEMENT_ERROR (mixer, RESOURCE, READ, (NULL), ("alsa error: %s", snd_strerror (rnfds))); gst_task_pause (mixer->task); g_static_rec_mutex_unlock (mixer->rec_mutex); return; } pfds[rnfds].fd = mixer->pfd[0]; pfds[rnfds].events = POLLIN | POLLPRI | POLLHUP | POLLERR; pfds[rnfds].revents = 0; g_static_rec_mutex_unlock (mixer->rec_mutex); GST_LOG ("task loop"); ret = poll (pfds, rnfds + 1, -1); if (ret < 0) { GST_ELEMENT_ERROR (mixer, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); gst_task_pause (mixer->task); return; } g_static_rec_mutex_lock (mixer->rec_mutex); ret = snd_mixer_poll_descriptors_revents (mixer->handle, pfds, nfds, &revents); if (ret < 0) { GST_ELEMENT_ERROR (mixer, RESOURCE, READ, (NULL), ("alsa error: %s", snd_strerror (ret))); gst_task_pause (mixer->task); } else if (revents & (POLLIN | POLLPRI)) { GST_DEBUG ("Handling events"); snd_mixer_handle_events (mixer->handle); } else if (revents & (POLLERR | POLLNVAL | POLLHUP)) { GST_ELEMENT_ERROR (mixer, RESOURCE, READ, (NULL), (NULL)); gst_task_pause (mixer->task); } g_static_rec_mutex_unlock (mixer->rec_mutex); }