static void free_buffer (gpointer data) { struct GstShmBuffer *gsb = data; g_return_if_fail (gsb->pipe != NULL); g_return_if_fail (gsb->pipe->src != NULL); GST_LOG ("Freeing buffer %p", gsb->buf); GST_OBJECT_LOCK (gsb->pipe->src); sp_client_recv_finish (gsb->pipe->pipe, gsb->buf); GST_OBJECT_UNLOCK (gsb->pipe->src); gst_shm_pipe_dec (gsb->pipe); g_slice_free (struct GstShmBuffer, gsb); }
static gboolean shm_reader_fd_cb (GIOChannel *source, GIOCondition condition, gpointer data) { ShmReaderPrivate *priv = SHM_READER (data)->priv; if (condition & G_IO_IN) { gchar *buf; gulong ret; ret = sp_client_recv (priv->client, &buf); if (ret == -1) { goto error; } else if (ret > 0) { g_signal_emit (data, signals[SIGNAL_GOT_DATA], 0, ret, buf); if (sp_client_recv_finish (priv->client, buf) == 0) goto error; } /* else: it was a system message and already handled */ } else if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) { goto error; } return TRUE; error: shm_reader_disconnect (data); return FALSE; }