diff --git a/src/server/client-source.c b/src/server/client-source.c index d0fe75973..a5da897cb 100644 --- a/src/server/client-source.c +++ b/src/server/client-source.c @@ -37,11 +37,64 @@ struct _PinosClientSourcePrivate GSocket *socket; + GBytes *possible_formats; + PinosSourceOutput *input; }; G_DEFINE_TYPE (PinosClientSource, pinos_client_source, PINOS_TYPE_SOURCE); +enum +{ + PROP_0, + PROP_POSSIBLE_FORMATS +}; + +static void +client_source_get_property (GObject *_object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + PinosClientSource *source = PINOS_CLIENT_SOURCE (_object); + PinosClientSourcePrivate *priv = source->priv; + + switch (prop_id) { + case PROP_POSSIBLE_FORMATS: + g_value_set_boxed (value, priv->possible_formats); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (source, prop_id, pspec); + break; + } +} + +static void +client_source_set_property (GObject *_object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + PinosClientSource *source = PINOS_CLIENT_SOURCE (_object); + PinosClientSourcePrivate *priv = source->priv; + + switch (prop_id) { + case PROP_POSSIBLE_FORMATS: + if (priv->possible_formats) + g_bytes_unref (priv->possible_formats); + priv->possible_formats = g_value_dup_boxed (value); + pinos_source_update_possible_formats (PINOS_SOURCE (source), + priv->possible_formats); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (source, prop_id, pspec); + break; + } +} + + static gboolean bus_handler (GstBus *bus, GstMessage *message, @@ -287,14 +340,14 @@ on_input_socket_notify (GObject *gobject, g_assert (requested_format != NULL); g_object_set (gobject, "format", requested_format, NULL); - /* and set as caps on the filter */ + /* and set as caps on the source */ caps = gst_caps_from_string (g_bytes_get_data (requested_format, NULL)); g_assert (caps != NULL); - g_object_set (priv->filter, "caps", caps, NULL); + g_object_set (priv->src, "caps", caps, NULL); gst_caps_unref (caps); g_bytes_unref (requested_format); } else { - g_object_set (priv->filter, "caps", NULL, NULL); + g_object_set (priv->src, "caps", NULL, NULL); } g_object_set (priv->src, "socket", socket, NULL); @@ -316,7 +369,12 @@ pinos_client_source_get_source_input (PinosClientSource *source, g_return_val_if_fail (PINOS_IS_CLIENT_SOURCE (source), NULL); priv = source->priv; + if (priv->input == NULL) { + GstCaps *caps = gst_caps_from_string (g_bytes_get_data (format_filter, NULL)); + + g_object_set (priv->filter, "caps", caps, NULL); + priv->input = PINOS_SOURCE_CLASS (pinos_client_source_parent_class) ->create_source_output (PINOS_SOURCE (source), client_path, @@ -342,6 +400,18 @@ pinos_client_source_class_init (PinosClientSourceClass * klass) gobject_class->dispose = client_source_dispose; gobject_class->finalize = client_source_finalize; + gobject_class->get_property = client_source_get_property; + gobject_class->set_property = client_source_set_property; + + g_object_class_install_property (gobject_class, + PROP_POSSIBLE_FORMATS, + g_param_spec_boxed ("possible-formats", + "Possible Format", + "The possible formats of the stream", + G_TYPE_BYTES, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + source_class->get_formats = client_get_formats; source_class->set_state = client_set_state; source_class->create_source_output = client_create_source_output; @@ -357,10 +427,12 @@ pinos_client_source_init (PinosClientSource * source) } PinosSource * -pinos_client_source_new (PinosDaemon *daemon) +pinos_client_source_new (PinosDaemon *daemon, + GBytes *possible_formats) { return g_object_new (PINOS_TYPE_CLIENT_SOURCE, "daemon", daemon, "name", "client-source", + "possible-formats", possible_formats, NULL); } diff --git a/src/server/client-source.h b/src/server/client-source.h index 437b8d4e5..0a63c7361 100644 --- a/src/server/client-source.h +++ b/src/server/client-source.h @@ -63,7 +63,8 @@ struct _PinosClientSourceClass { /* normal GObject stuff */ GType pinos_client_source_get_type (void); -PinosSource * pinos_client_source_new (PinosDaemon *daemon); +PinosSource * pinos_client_source_new (PinosDaemon *daemon, + GBytes *possible_formats); PinosSourceOutput * pinos_client_source_get_source_input (PinosClientSource *source, const gchar *client_path, diff --git a/src/server/client.c b/src/server/client.c index 51bed4953..ee6cc96f2 100644 --- a/src/server/client.c +++ b/src/server/client.c @@ -230,7 +230,9 @@ handle_create_source_input (PinosClient1 *interface, if (g_strcmp0 (pinos_client_get_sender (client), sender) != 0) goto not_allowed; - source = pinos_client_source_new (priv->daemon); + formats = g_bytes_new (arg_possible_formats, strlen (arg_possible_formats) + 1); + + source = pinos_client_source_new (priv->daemon, formats); if (source == NULL) goto no_source; @@ -241,7 +243,6 @@ handle_create_source_input (PinosClient1 *interface, sender = g_dbus_method_invocation_get_sender (invocation); - formats = g_bytes_new (arg_possible_formats, strlen (arg_possible_formats) + 1); input = pinos_client_source_get_source_input (PINOS_CLIENT_SOURCE (source), priv->object_path, @@ -277,6 +278,7 @@ no_source: { g_dbus_method_invocation_return_dbus_error (invocation, "org.pinos.Error", "Can't create source"); + g_bytes_unref (formats); return TRUE; } no_input: diff --git a/src/server/source.c b/src/server/source.c index 8d8f4c76c..94f8114ca 100644 --- a/src/server/source.c +++ b/src/server/source.c @@ -417,6 +417,19 @@ pinos_source_report_error (PinosSource *source, g_object_notify (G_OBJECT (source), "state"); } +void +pinos_source_update_possible_formats (PinosSource *source, GBytes *formats) +{ + PinosSourcePrivate *priv; + + g_return_if_fail (PINOS_IS_SOURCE (source)); + priv = source->priv; + + g_object_set (priv->iface, "possible-formats", + g_bytes_get_data (formats, NULL), + NULL); +} + PinosSourceOutput * pinos_source_create_source_output (PinosSource *source, const gchar *client_path, diff --git a/src/server/source.h b/src/server/source.h index 05b6b7c6b..890abc839 100644 --- a/src/server/source.h +++ b/src/server/source.h @@ -78,23 +78,24 @@ struct _PinosSourceClass { }; /* normal GObject stuff */ -GType pinos_source_get_type (void); +GType pinos_source_get_type (void); -const gchar * pinos_source_get_object_path (PinosSource *source); +const gchar * pinos_source_get_object_path (PinosSource *source); -GBytes * pinos_source_get_formats (PinosSource *source, GBytes *filter); +GBytes * pinos_source_get_formats (PinosSource *source, GBytes *filter); -gboolean pinos_source_set_state (PinosSource *source, PinosSourceState state); -void pinos_source_update_state (PinosSource *source, PinosSourceState state); -void pinos_source_report_error (PinosSource *source, GError *error); +gboolean pinos_source_set_state (PinosSource *source, PinosSourceState state); +void pinos_source_update_state (PinosSource *source, PinosSourceState state); +void pinos_source_report_error (PinosSource *source, GError *error); +void pinos_source_update_possible_formats (PinosSource *source, GBytes *formats); -PinosSourceOutput * pinos_source_create_source_output (PinosSource *source, - const gchar *client_path, - GBytes *format_filter, - const gchar *prefix, - GError **error); -gboolean pinos_source_release_source_output (PinosSource *source, - PinosSourceOutput *output); +PinosSourceOutput * pinos_source_create_source_output (PinosSource *source, + const gchar *client_path, + GBytes *format_filter, + const gchar *prefix, + GError **error); +gboolean pinos_source_release_source_output (PinosSource *source, + PinosSourceOutput *output); G_END_DECLS