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;
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;
}
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));
}
}
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:
free (app->pfds);
free (app->buffer);
snd_midi_event_free (app->parser);
- free (app->ports);
+ g_free (app->seq_ports);
snd_seq_close (app->seq);
}