summaryrefslogtreecommitdiff
path: root/transmitters
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2011-07-14 22:15:19 -0400
committerOlivier CrĂȘte <olivier.crete@collabora.com>2011-09-15 14:08:13 -0400
commit2e0b1a5c46aa222a71f300ed8f12c1e78cbdb13b (patch)
tree27212f9255b01efa4c9aa2a6ad094db93382f5c3 /transmitters
parent0f65cfc532bf4a225b50d092b7d1b9357f6087d8 (diff)
downloadfarstream-2e0b1a5c46aa222a71f300ed8f12c1e78cbdb13b.tar.gz
shmstreamtrans: Transform bus errors into state changes
Diffstat (limited to 'transmitters')
-rw-r--r--transmitters/shm/fs-shm-stream-transmitter.c13
-rw-r--r--transmitters/shm/fs-shm-transmitter.c24
-rw-r--r--transmitters/shm/fs-shm-transmitter.h5
3 files changed, 36 insertions, 6 deletions
diff --git a/transmitters/shm/fs-shm-stream-transmitter.c b/transmitters/shm/fs-shm-stream-transmitter.c
index 8e79d6be..384331ba 100644
--- a/transmitters/shm/fs-shm-stream-transmitter.c
+++ b/transmitters/shm/fs-shm-stream-transmitter.c
@@ -426,6 +426,16 @@ fs_shm_stream_transmitter_add_sink (FsShmStreamTransmitter *self,
return TRUE;
}
+
+static void
+disconnected_cb (guint component, gint id, gpointer data)
+{
+ FsShmStreamTransmitter *self = data;
+
+ g_signal_emit_by_name (self, "state-changed", component,
+ FS_STREAM_STATE_FAILED);
+}
+
static gboolean
fs_shm_stream_transmitter_add_remote_candidate (
FsShmStreamTransmitter *self, FsCandidate *candidate,
@@ -452,7 +462,8 @@ fs_shm_stream_transmitter_add_remote_candidate (
self->priv->shm_src[candidate->component_id] =
fs_shm_transmitter_get_shm_src (self->priv->transmitter,
- candidate->component_id, path, got_buffer_func, self, error);
+ candidate->component_id, path, got_buffer_func, disconnected_cb,
+ self, error);
if (self->priv->shm_src[candidate->component_id] == NULL)
return FALSE;
diff --git a/transmitters/shm/fs-shm-transmitter.c b/transmitters/shm/fs-shm-transmitter.c
index 6000c2e4..3298dc05 100644
--- a/transmitters/shm/fs-shm-transmitter.c
+++ b/transmitters/shm/fs-shm-transmitter.c
@@ -306,7 +306,7 @@ fs_shm_transmitter_constructed (GObject *object)
/* First we need the src elemnet */
- self->priv->gst_src = gst_bin_new (NULL);
+ self->priv->gst_src = fs_shm_bin_new ();
if (!self->priv->gst_src) {
trans->construction_error = g_error_new (FS_ERROR,
@@ -552,6 +552,7 @@ struct _ShmSrc {
GstPad *funnelpad;
got_buffer got_buffer_func;
+ connection disconnected_func;
gpointer cb_data;
gulong buffer_probe;
};
@@ -565,11 +566,23 @@ src_buffer_probe_cb (GstPad *pad, GstBuffer *buffer, ShmSrc *shm)
return TRUE;
}
+
+static void
+disconnected_cb (GstBin *bin, GstElement *elem, ShmSrc *shm)
+{
+ if (elem != shm->src)
+ return;
+
+ shm->disconnected_func (shm->component, 0, shm->cb_data);
+}
+
+
ShmSrc *
fs_shm_transmitter_get_shm_src (FsShmTransmitter *self,
guint component,
const gchar *path,
got_buffer got_buffer_func,
+ connection disconnected_func,
gpointer cb_data,
GError **error)
{
@@ -579,6 +592,7 @@ fs_shm_transmitter_get_shm_src (FsShmTransmitter *self,
shm->component = component;
shm->got_buffer_func = got_buffer_func;
+ shm->disconnected_func = disconnected_func;
shm->cb_data = cb_data;
shm->path = g_strdup (path);
@@ -597,6 +611,10 @@ fs_shm_transmitter_get_shm_src (FsShmTransmitter *self,
"is-live", TRUE,
NULL);
+ if (shm->disconnected_func)
+ g_signal_connect (self->priv->gst_src, "disconnected",
+ G_CALLBACK (disconnected_cb), shm);
+
if (!gst_bin_add (GST_BIN (self->priv->gst_src), elem))
{
g_set_error (error, FS_ERROR, FS_ERROR_CONSTRUCTION,
@@ -685,7 +703,7 @@ struct _ShmSink {
GstPad *teepad;
ready ready_func;
- connected connected_func;
+ connection connected_func;
gpointer cb_data;
};
@@ -715,7 +733,7 @@ fs_shm_transmitter_get_shm_sink (FsShmTransmitter *self,
guint component,
const gchar *path,
ready ready_func,
- connected connected_func,
+ connection connected_func,
gpointer cb_data,
GError **error)
{
diff --git a/transmitters/shm/fs-shm-transmitter.h b/transmitters/shm/fs-shm-transmitter.h
index 41a738d8..26753ac6 100644
--- a/transmitters/shm/fs-shm-transmitter.h
+++ b/transmitters/shm/fs-shm-transmitter.h
@@ -89,12 +89,13 @@ typedef struct _ShmSink ShmSink;
typedef void (*got_buffer) (GstBuffer *buffer, guint component, gpointer data);
typedef void (*ready) (guint component, gchar *path, gpointer data);
-typedef void (*connected) (guint component, gint id, gpointer data);
+typedef void (*connection) (guint component, gint id, gpointer data);
ShmSrc *fs_shm_transmitter_get_shm_src (FsShmTransmitter *self,
guint component,
const gchar *path,
got_buffer got_buffer_func,
+ connection disconnected_func,
gpointer cb_data,
GError **error);
@@ -106,7 +107,7 @@ ShmSink *fs_shm_transmitter_get_shm_sink (FsShmTransmitter *self,
guint component,
const gchar *path,
ready ready_func,
- connected connected_func,
+ connection connected_fubnc,
gpointer cb_data,
GError **error);