jack: added client property
authorTristan Matthews <le.businessman@gmail.com>
Mon, 6 Sep 2010 20:11:31 +0000 (16:11 -0400)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Sun, 2 Jan 2011 14:30:08 +0000 (14:30 +0000)
ext/jack/gstjack.c
ext/jack/gstjack.h
ext/jack/gstjackaudioclient.c
ext/jack/gstjackaudioclient.h
ext/jack/gstjackaudiosink.c
ext/jack/gstjackaudiosink.h
ext/jack/gstjackaudiosrc.c
ext/jack/gstjackaudiosrc.h

index 0830250..371a9e9 100644 (file)
@@ -46,6 +46,35 @@ gst_jack_connect_get_type (void)
 }
 
 
+static gpointer
+gst_jack_client_copy (gpointer jclient)
+{
+  return jclient;
+}
+
+
+static void
+gst_jack_client_free (gpointer jclient)
+{
+  return;
+}
+
+
+GType
+gst_jack_client_get_type (void)
+{
+  static GType type;            /* 0 */
+
+  if (type == 0) {
+    /* hackish, but makes it show up nicely in gst-inspect */
+    type = g_boxed_type_register_static ("JackClient",
+        (GBoxedCopyFunc) gst_jack_client_copy,
+        (GBoxedFreeFunc) gst_jack_client_free);
+  }
+
+  return type;
+}
+
 static gboolean
 plugin_init (GstPlugin * plugin)
 {
index 4565e06..d923866 100644 (file)
@@ -47,6 +47,9 @@ typedef enum {
 typedef jack_default_audio_sample_t sample_t;
 
 #define GST_TYPE_JACK_CONNECT (gst_jack_connect_get_type())
+#define GST_TYPE_JACK_CLIENT  (gst_jack_client_get_type ())
+
+GType gst_jack_client_get_type(void);
 GType gst_jack_connect_get_type(void);
 
 #endif  // _GST_JACK_H_
index 60e4138..1789edb 100644 (file)
@@ -189,11 +189,10 @@ connection_find (GstJackAudioConnection * conn, FindData * data)
  * status set. */
 static GstJackAudioConnection *
 gst_jack_audio_make_connection (const gchar * id, const gchar * server,
-    jack_status_t * status)
+    jack_client_t * jclient, jack_status_t * status)
 {
   GstJackAudioConnection *conn;
   jack_options_t options;
-  jack_client_t *jclient;
   gint res;
 
   *status = 0;
@@ -207,7 +206,8 @@ gst_jack_audio_make_connection (const gchar * id, const gchar * server,
   if (server != NULL)
     options |= JackServerName;
   /* open the client */
-  jclient = jack_client_open (id, options, status, server);
+  if (jclient == NULL)
+    jclient = jack_client_open (id, options, status, server);
   if (jclient == NULL)
     goto could_not_open;
 
@@ -258,7 +258,7 @@ could_not_activate:
 
 static GstJackAudioConnection *
 gst_jack_audio_get_connection (const gchar * id, const gchar * server,
-    jack_status_t * status)
+    jack_client_t * jclient, jack_status_t * status)
 {
   GstJackAudioConnection *conn;
   GList *found;
@@ -273,7 +273,7 @@ gst_jack_audio_get_connection (const gchar * id, const gchar * server,
   G_LOCK (connections_lock);
   found =
       g_list_find_custom (connections, &data, (GCompareFunc) connection_find);
-  if (found != NULL) {
+  if (found != NULL && jclient != NULL) {
     /* we found it, increase refcount and return it */
     conn = (GstJackAudioConnection *) found->data;
     conn->refcount++;
@@ -281,7 +281,7 @@ gst_jack_audio_get_connection (const gchar * id, const gchar * server,
     GST_DEBUG ("found connection %p", conn);
   } else {
     /* make new connection */
-    conn = gst_jack_audio_make_connection (id, server, status);
+    conn = gst_jack_audio_make_connection (id, server, jclient, status);
     if (conn != NULL) {
       GST_DEBUG ("created connection %p", conn);
       /* add to list on success */
@@ -407,10 +407,10 @@ gst_jack_audio_connection_remove_client (GstJackAudioConnection * conn,
  */
 GstJackAudioClient *
 gst_jack_audio_client_new (const gchar * id, const gchar * server,
-    GstJackClientType type, void (*shutdown) (void *arg),
-    JackProcessCallback process, JackBufferSizeCallback buffer_size,
-    JackSampleRateCallback sample_rate, gpointer user_data,
-    jack_status_t * status)
+    jack_client_t * jclient, GstJackClientType type,
+    void (*shutdown) (void *arg), JackProcessCallback process,
+    JackBufferSizeCallback buffer_size, JackSampleRateCallback sample_rate,
+    gpointer user_data, jack_status_t * status)
 {
   GstJackAudioClient *client;
   GstJackAudioConnection *conn;
@@ -419,7 +419,7 @@ gst_jack_audio_client_new (const gchar * id, const gchar * server,
   g_return_val_if_fail (status != NULL, NULL);
 
   /* first get a connection for the id/server pair */
-  conn = gst_jack_audio_get_connection (id, server, status);
+  conn = gst_jack_audio_get_connection (id, server, jclient, status);
   if (conn == NULL)
     goto no_connection;
 
index 9092e7d..5fb7e35 100644 (file)
@@ -40,6 +40,7 @@ void                  gst_jack_audio_client_init           (void);
 
 
 GstJackAudioClient *  gst_jack_audio_client_new            (const gchar *id, const gchar *server,
+                                                            jack_client_t *jclient,
                                                             GstJackClientType type,
                                                             void (*shutdown) (void *arg),
                                                             JackProcessCallback    process,
index ed11ca2..e902823 100644 (file)
@@ -334,6 +334,7 @@ gst_jack_ring_buffer_open_device (GstRingBuffer * buf)
     name = "GStreamer";
 
   sink->client = gst_jack_audio_client_new (name, sink->server,
+      sink->jclient,
       GST_JACK_CLIENT_SINK,
       jack_shutdown_cb,
       jack_process_cb, jack_buffer_size_cb, jack_sample_rate_cb, buf, &status);
@@ -627,6 +628,7 @@ enum
   PROP_0,
   PROP_CONNECT,
   PROP_SERVER,
+  PROP_CLIENT,
   PROP_LAST
 };
 
@@ -685,6 +687,12 @@ gst_jack_audio_sink_class_init (GstJackAudioSinkClass * klass)
           "The Jack server to connect to (NULL = default)",
           DEFAULT_PROP_SERVER, G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_CLIENT,
+      g_param_spec_boxed ("client", "JackClient", "Handle for jack client",
+          GST_TYPE_JACK_CLIENT,
+          GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
+          G_PARAM_STATIC_STRINGS));
+
   gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_jack_audio_sink_getcaps);
 
   gstbaseaudiosink_class->create_ringbuffer =
@@ -703,6 +711,7 @@ gst_jack_audio_sink_init (GstJackAudioSink * sink,
 {
   sink->connect = DEFAULT_PROP_CONNECT;
   sink->server = g_strdup (DEFAULT_PROP_SERVER);
+  sink->jclient = NULL;
   sink->ports = NULL;
   sink->port_count = 0;
 }
@@ -732,6 +741,12 @@ gst_jack_audio_sink_set_property (GObject * object, guint prop_id,
       g_free (sink->server);
       sink->server = g_value_dup_string (value);
       break;
+    case PROP_CLIENT:
+      if (GST_STATE (sink) == GST_STATE_NULL ||
+          GST_STATE (sink) == GST_STATE_READY) {
+        sink->jclient = g_value_get_boxed (value);
+      }
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -753,6 +768,9 @@ gst_jack_audio_sink_get_property (GObject * object, guint prop_id,
     case PROP_SERVER:
       g_value_set_string (value, sink->server);
       break;
+    case PROP_CLIENT:
+      g_value_set_boxed (value, sink->jclient);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
index b4a7703..def4233 100644 (file)
@@ -57,6 +57,7 @@ struct _GstJackAudioSink {
   /* properties */
   GstJackConnect   connect;
   gchar           *server;
+  jack_client_t   *jclient;
 
   /* our client */
   GstJackAudioClient *client;
index 22ba291..1492b3e 100644 (file)
@@ -341,6 +341,7 @@ gst_jack_ring_buffer_open_device (GstRingBuffer * buf)
     name = "GStreamer";
 
   src->client = gst_jack_audio_client_new (name, src->server,
+      src->jclient,
       GST_JACK_CLIENT_SOURCE,
       jack_shutdown_cb,
       jack_process_cb, jack_buffer_size_cb, jack_sample_rate_cb, buf, &status);
@@ -629,6 +630,7 @@ enum
   PROP_0,
   PROP_CONNECT,
   PROP_SERVER,
+  PROP_CLIENT,
   PROP_LAST
 };
 
@@ -707,6 +709,12 @@ gst_jack_audio_src_class_init (GstJackAudioSrcClass * klass)
           "The Jack server to connect to (NULL = default)",
           DEFAULT_PROP_SERVER, G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_CLIENT,
+      g_param_spec_boxed ("client", "JackClient", "Handle for jack client",
+          GST_TYPE_JACK_CLIENT,
+          GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
+          G_PARAM_STATIC_STRINGS));
+
   gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_jack_audio_src_getcaps);
   gstbaseaudiosrc_class->create_ringbuffer =
       GST_DEBUG_FUNCPTR (gst_jack_audio_src_create_ringbuffer);
@@ -729,6 +737,7 @@ gst_jack_audio_src_init (GstJackAudioSrc * src, GstJackAudioSrcClass * gclass)
   //gst_base_src_set_live(GST_BASE_SRC (src), TRUE);
   src->connect = DEFAULT_PROP_CONNECT;
   src->server = g_strdup (DEFAULT_PROP_SERVER);
+  src->jclient = NULL;
   src->ports = NULL;
   src->port_count = 0;
   src->buffers = NULL;
@@ -757,6 +766,12 @@ gst_jack_audio_src_set_property (GObject * object, guint prop_id,
       g_free (src->server);
       src->server = g_value_dup_string (value);
       break;
+    case PROP_CLIENT:
+      if (GST_STATE (src) == GST_STATE_NULL ||
+          GST_STATE (src) == GST_STATE_READY) {
+        src->jclient = g_value_get_boxed (value);
+      }
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -776,6 +791,9 @@ gst_jack_audio_src_get_property (GObject * object, guint prop_id,
     case PROP_SERVER:
       g_value_set_string (value, src->server);
       break;
+    case PROP_CLIENT:
+      g_value_set_boxed (value, src->jclient);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
index e81b421..7e99b69 100644 (file)
@@ -74,6 +74,7 @@ struct _GstJackAudioSrc
     /* properties */
     GstJackConnect connect;
     gchar           *server;
+    jack_client_t   *jclient;
 
     /* our client */
     GstJackAudioClient *client;