Make the global App variable static
[gst-aseq-appsrc.git] / gst-aseq-appsrc.c
index b4f6c39..2fd617f 100644 (file)
@@ -52,7 +52,7 @@ struct _App
 
   snd_seq_t *seq;
   int port_count;
-  snd_seq_addr_t *ports;
+  snd_seq_addr_t *seq_ports;
   snd_midi_event_t *parser;
   unsigned char *buffer;
 
@@ -62,7 +62,7 @@ struct _App
   guint64 tick;
 };
 
-App s_app;
+static App s_app;
 
 static int
 init_seq (App * app)
@@ -89,55 +89,50 @@ error:
   return ret;
 }
 
-/* parses one or more port addresses from the string */
+/* Parses one or more port addresses from the string */
 static int
 parse_ports (const char *arg, App * app)
 {
-  char *buf, *s, *port_name;
-  int ret;
+  gchar **ports_list;
+  guint i;
+  int ret = 0;
 
   GST_DEBUG ("ports: %s", arg);
 
-  /* make a copy of the string because we're going to modify it */
-  buf = strdup (arg);
-  if (!buf) {
+  /*
+   * Assume that ports are separated by commas.
+   *
+   * Commas are used instead of spaces because those are valid in client
+   * names.
+   */
+  ports_list = g_strsplit (arg, ",", 0);
+
+  app->port_count = g_strv_length (ports_list);
+  app->seq_ports = g_try_new (snd_seq_addr_t, app->port_count);
+  if (!app->seq_ports) {
     GST_ERROR ("Out of memory");
     ret = -ENOMEM;
-    goto out;
+    goto out_free_ports_list;
   }
 
-  for (port_name = s = buf; s; port_name = s + 1) {
-    /* Assume that ports are separated by commas.  We don't use
-     * spaces because those are valid in client names. */
-    s = strchr (port_name, ',');
-    if (s)
-      *s = '\0';
-
-    app->port_count++;
-    app->ports =
-        realloc (app->ports, app->port_count * sizeof (snd_seq_addr_t));
-    if (!app->ports) {
-      GST_ERROR ("Out of memory");
-      ret = -ENOMEM;
-      goto out_free_buf;
-    }
+  for (i = 0; i < (guint)app->port_count; i++) {
+    gchar *port_name = ports_list[i];
 
-    ret =
-        snd_seq_parse_address (app->seq, &app->ports[app->port_count - 1],
+    ret = snd_seq_parse_address (app->seq, &app->seq_ports[i],
         port_name);
     if (ret < 0) {
-      GST_ERROR ("Invalid port %s - %s", port_name, snd_strerror (ret));
-      goto error_free_ports;
+      GST_ERROR ("Invalid port %s - %s", port_name,
+          snd_strerror (ret));
+      goto error_free_seq_ports;
     }
   }
 
-  goto out_free_buf;
+  goto out_free_ports_list;
 
-error_free_ports:
-  free (app->ports);
-out_free_buf:
-  free (buf);
-out:
+error_free_seq_ports:
+  g_free (app->seq_ports);
+out_free_ports_list:
+  g_strfreev (ports_list);
   return ret;
 }
 
@@ -164,12 +159,12 @@ connect_ports (App * app)
 
   for (i = 0; i < app->port_count; ++i) {
     ret =
-        snd_seq_connect_from (app->seq, 0, app->ports[i].client,
-        app->ports[i].port);
+        snd_seq_connect_from (app->seq, 0, app->seq_ports[i].client,
+        app->seq_ports[i].port);
     if (ret < 0)
       /* warning */
       GST_WARNING ("Cannot connect from port %d:%d - %s",
-          app->ports[i].client, app->ports[i].port, snd_strerror (ret));
+          app->seq_ports[i].client, app->seq_ports[i].port, snd_strerror (ret));
   }
 }
 
@@ -191,8 +186,7 @@ push_buffer (App * app, gpointer data, guint size)
   GST_BUFFER_OFFSET (buffer) = time;
   GST_BUFFER_DURATION (buffer) = DEFAULT_TICK_PERIOD_MS * GST_MSECOND;
 
-  local_data = g_malloc (size);
-  memcpy (local_data, data, size);
+  local_data = g_memdup (data, size);
 
   gst_buffer_append_memory (buffer,
       gst_memory_new_wrapped (0, local_data, size, 0, size, local_data,
@@ -347,7 +341,7 @@ app_init (App * app, char *ports)
   }
 
   app->npfds = snd_seq_poll_descriptors_count (app->seq, POLLIN);
-  app->pfds = alloca (sizeof (*app->pfds) * app->npfds);
+  app->pfds = malloc (sizeof (*app->pfds) * app->npfds);
   if (app->pfds == NULL) {
     ret = -ENOMEM;
     goto err_free_buffer;
@@ -360,7 +354,7 @@ err_free_buffer:
 err_free_parser:
   snd_midi_event_free (app->parser);
 err_free_ports:
-  free (app->ports);
+  g_free (app->seq_ports);
 err_seq_close:
   snd_seq_close (app->seq);
 err:
@@ -371,9 +365,10 @@ static void
 app_finalize (App * app)
 {
   /* free the resources */
+  free (app->pfds);
   free (app->buffer);
-  free (app->ports);
   snd_midi_event_free (app->parser);
+  g_free (app->seq_ports);
   snd_seq_close (app->seq);
 }