[Bug 746762] alsa: add uri handler
GStreamer (GNOME Bugzilla)
bugzilla at gnome.org
Sat Oct 27 12:47:02 UTC 2018
https://bugzilla.gnome.org/show_bug.cgi?id=746762
Marc Leeman <marc.leeman at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Attachment #374061|0 |1
is obsolete| |
--- Comment #9 from Marc Leeman <marc.leeman at gmail.com> ---
Comment on attachment 374061
--> https://bugzilla.gnome.org/attachment.cgi?id=374061
alsa: add uri-handler for src/sink
>From a1363dbf5b11fdf66c1ab9a5c8bd882dd1c75b81 Mon Sep 17 00:00:00 2001
>From: Paul HENRYS <visechelle at gmail.com>
>Date: Thu, 21 Mar 2013 17:14:36 +0100
>Subject: [PATCH] Add uri handler for alsasrc and alsasink elements
>
>The chosen scheme is "alsa://"
>
>Signed-off-by: Marc Leeman <marc.leeman at gmail.com>
>---
> ext/alsa/gstalsasink.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++--
> ext/alsa/gstalsasink.h | 4 ++-
> ext/alsa/gstalsasrc.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++--
> ext/alsa/gstalsasrc.h | 3 ++
> 4 files changed, 174 insertions(+), 5 deletions(-)
>
>diff --git a/ext/alsa/gstalsasink.c b/ext/alsa/gstalsasink.c
>index e1bb7d7eb..8c0bf1aec 100644
>--- a/ext/alsa/gstalsasink.c
>+++ b/ext/alsa/gstalsasink.c
>@@ -58,6 +58,7 @@
> #define ESTRPIPE EPIPE
> #endif
>
>+#define DEFAULT_PROP_URI "alsa://default"
> #define DEFAULT_DEVICE "default"
> #define DEFAULT_DEVICE_NAME ""
> #define DEFAULT_CARD_NAME ""
>@@ -70,13 +71,18 @@ enum
> PROP_DEVICE,
> PROP_DEVICE_NAME,
> PROP_CARD_NAME,
>+ PROP_URI,
> PROP_LAST
> };
>
> static void gst_alsasink_init_interfaces (GType type);
>+static void gst_alsasink_uri_handler_init (gpointer g_iface,
>+ gpointer iface_data);
> #define gst_alsasink_parent_class parent_class
>-G_DEFINE_TYPE_WITH_CODE (GstAlsaSink, gst_alsasink,
>- GST_TYPE_AUDIO_SINK, gst_alsasink_init_interfaces (g_define_type_id));
>+G_DEFINE_TYPE_WITH_CODE (GstAlsaSink, gst_alsasink, GST_TYPE_AUDIO_SINK,
>+ gst_alsasink_init_interfaces (g_define_type_id);
>+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER,
>+ gst_alsasink_uri_handler_init));
>
> static void gst_alsasink_finalise (GObject * object);
> static void gst_alsasink_set_property (GObject * object,
>@@ -120,6 +126,9 @@ gst_alsasink_finalise (GObject * object)
> {
> GstAlsaSink *sink = GST_ALSA_SINK (object);
>
>+ if (sink->uri)
>+ gst_uri_unref(sink->uri);
>+
> g_free (sink->device);
> g_mutex_clear (&sink->alsa_lock);
> g_mutex_clear (&sink->delay_lock);
>@@ -184,6 +193,11 @@ gst_alsasink_class_init (GstAlsaSinkClass * klass)
> gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_alsasink_delay);
> gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_alsasink_reset);
>
>+ g_object_class_install_property (gobject_class, PROP_URI,
>+ g_param_spec_string ("uri", "URI",
>+ "URI (e.g.: alsa:///default?card-name=generic)",
>+ DEFAULT_PROP_URI, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
>+
> g_object_class_install_property (gobject_class, PROP_DEVICE,
> g_param_spec_string ("device", "Device",
> "ALSA device, as defined in an asound configuration file",
>@@ -209,6 +223,22 @@ gst_alsasink_set_property (GObject * object, guint prop_id,
> sink = GST_ALSA_SINK (object);
>
> switch (prop_id) {
>+ case PROP_URI: {
>+ gchar *path;
>+ if (sink->uri)
>+ gst_uri_unref (sink->uri);
>+
>+ sink->uri = gst_uri_from_string (g_value_get_string (value));
>+ if (sink->uri) {
>+ gst_object_set_properties_from_uri_query_parameters (G_OBJECT (sink), sink->uri);
>+ path = gst_uri_get_path (sink->uri);
>+ if (0 != *(path))
>+ g_object_set (G_OBJECT (sink),
>+ "device", path, NULL);
>+ g_free (path);
>+ }
>+ }
>+ break;
> case PROP_DEVICE:
> g_free (sink->device);
> sink->device = g_value_dup_string (value);
>@@ -232,6 +262,12 @@ gst_alsasink_get_property (GObject * object, guint prop_id,
> sink = GST_ALSA_SINK (object);
>
> switch (prop_id) {
>+ case PROP_URI: {
>+ if (self->uri)
>+ g_value_take_string (value, gst_uri_to_string (self->uri));
>+ else
>+ g_value_set_string (value, NULL);
>+ break;
> case PROP_DEVICE:
> g_value_set_string (value, sink->device);
> break;
>@@ -256,6 +292,7 @@ gst_alsasink_init (GstAlsaSink * alsasink)
> {
> GST_DEBUG_OBJECT (alsasink, "initializing alsasink");
>
>+ alsasink->uri = gst_uri_from_string(DEFAULT_PROP_URI);
> alsasink->device = g_strdup (DEFAULT_DEVICE);
> alsasink->handle = NULL;
> alsasink->cached_caps = NULL;
>@@ -1178,3 +1215,48 @@ gst_alsasink_payload (GstAudioBaseSink * sink, GstBuffer * buf)
>
> return gst_buffer_ref (buf);
> }
>+
>+/* GstURIHandler interface */
>+static GstURIType
>+gst_alsasink_uri_get_type (GType type)
>+{
>+ return GST_URI_SINK;
>+}
>+
>+static const gchar *const *
>+gst_alsasink_uri_get_protocols (GType type)
>+{
>+ static const gchar *protocols[] = { "alsa", NULL };
>+
>+ return protocols;
>+}
>+
>+static gchar *
>+gst_alsasink_uri_get_uri (GstURIHandler * handler)
>+{
>+ GstAlsaSink *alsasink = GST_ALSA_SINK (handler);
>+
>+ return gst_uri_to_string (alsasink->uri);
>+}
>+
>+static gboolean
>+gst_alsasink_uri_set_uri (GstURIHandler * handler, const gchar * uri,
>+ GError ** error)
>+{
>+ GstAlsaSink *alsasink = GST_ALSA_SINK (handler);
>+
>+ g_object_set (G_OBJECT (alsasink), "uri", uri, NULL);
>+
>+ return TRUE;
>+}
>+
>+static void
>+gst_alsasink_uri_handler_init (gpointer g_iface, gpointer iface_data)
>+{
>+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
>+
>+ iface->get_type = gst_alsasink_uri_get_type;
>+ iface->get_protocols = gst_alsasink_uri_get_protocols;
>+ iface->get_uri = gst_alsasink_uri_get_uri;
>+ iface->set_uri = gst_alsasink_uri_set_uri;
>+}
>diff --git a/ext/alsa/gstalsasink.h b/ext/alsa/gstalsasink.h
>index b240fe43d..65b94ffb4 100644
>--- a/ext/alsa/gstalsasink.h
>+++ b/ext/alsa/gstalsasink.h
>@@ -1,7 +1,7 @@
> /* GStreamer
> * Copyright (C) 2005 Wim Taymans <wim at fluendo.com>
> *
>- * gstalsasink.h:
>+ * gstalsasink.h:
> *
> * This library is free software; you can redistribute it and/or
> * modify it under the terms of the GNU Library General Public
>@@ -24,6 +24,7 @@
> #define __GST_ALSASINK_H__
>
> #include <gst/gst.h>
>+#include <gst/gsturi.h>
> #include <gst/audio/audio.h>
> #include <alsa/asoundlib.h>
>
>@@ -55,6 +56,7 @@ typedef struct _GstAlsaSinkClass GstAlsaSinkClass;
> struct _GstAlsaSink {
> GstAudioSink sink;
>
>+ GstUri *uri;
> gchar *device;
>
> snd_pcm_t *handle;
>diff --git a/ext/alsa/gstalsasrc.c b/ext/alsa/gstalsasrc.c
>index 6ee0ca887..808c3dc1c 100644
>--- a/ext/alsa/gstalsasrc.c
>+++ b/ext/alsa/gstalsasrc.c
>@@ -54,6 +54,7 @@
> #define ESTRPIPE EPIPE
> #endif
>
>+#define DEFAULT_PROP_URI "alsa://default"
> #define DEFAULT_PROP_DEVICE "default"
> #define DEFAULT_PROP_DEVICE_NAME ""
> #define DEFAULT_PROP_CARD_NAME ""
>@@ -64,11 +65,18 @@ enum
> PROP_DEVICE,
> PROP_DEVICE_NAME,
> PROP_CARD_NAME,
>+ PROP_URI,
> PROP_LAST
> };
>
>+static void gst_alsasrc_uri_handler_init (gpointer g_iface,
>+ gpointer iface_data);
>+
> #define gst_alsasrc_parent_class parent_class
>-G_DEFINE_TYPE (GstAlsaSrc, gst_alsasrc, GST_TYPE_AUDIO_SRC);
>+G_DEFINE_TYPE_WITH_CODE (GstAlsaSrc, gst_alsasrc, GST_TYPE_AUDIO_SRC,
>+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_alsasrc_uri_handler_init));
>+
>+
>
> static void gst_alsasrc_finalize (GObject * object);
> static void gst_alsasrc_set_property (GObject * object,
>@@ -115,7 +123,8 @@ static void
> gst_alsasrc_finalize (GObject * object)
> {
> GstAlsaSrc *src = GST_ALSA_SRC (object);
>-
>+ if (src->uri)
>+ gst_uri_unref(src->uri);
> g_free (src->device);
> g_mutex_clear (&src->alsa_lock);
>
>@@ -157,6 +166,11 @@ gst_alsasrc_class_init (GstAlsaSrcClass * klass)
> gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_alsasrc_reset);
> gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_alsasrc_change_state);
>
>+ g_object_class_install_property (gobject_class, PROP_URI,
>+ g_param_spec_string ("uri", "URI",
>+ "URI (e.g.: alsa:///default?card-name=generic)",
>+ DEFAULT_PROP_URI, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
>+
> g_object_class_install_property (gobject_class, PROP_DEVICE,
> g_param_spec_string ("device", "Device",
> "ALSA device, as defined in an asound configuration file",
>@@ -182,6 +196,22 @@ gst_alsasrc_set_property (GObject * object, guint prop_id,
> src = GST_ALSA_SRC (object);
>
> switch (prop_id) {
>+ case PROP_URI: {
>+ gchar *path;
>+ if (src->uri)
>+ gst_uri_unref (src->uri);
>+
>+ src->uri = gst_uri_from_string (g_value_get_string (value));
>+ if (src->uri) {
>+ gst_object_set_properties_from_uri_query_parameters (G_OBJECT (src), src->uri);
>+ path = gst_uri_get_path (src->uri);
>+ if (0 != *(path))
>+ g_object_set (G_OBJECT (src),
>+ "device", path, NULL);
>+ g_free (path);
>+ }
>+ }
>+ break;
> case PROP_DEVICE:
> g_free (src->device);
> src->device = g_value_dup_string (value);
>@@ -204,6 +234,12 @@ gst_alsasrc_get_property (GObject * object, guint prop_id,
> src = GST_ALSA_SRC (object);
>
> switch (prop_id) {
>+ case PROP_URI: {
>+ if (self->uri)
>+ g_value_take_string (value, gst_uri_to_string (self->uri));
>+ else
>+ g_value_set_string (value, NULL);
>+ break;
> case PROP_DEVICE:
> g_value_set_string (value, src->device);
> break;
>@@ -270,6 +306,7 @@ gst_alsasrc_init (GstAlsaSrc * alsasrc)
> {
> GST_DEBUG_OBJECT (alsasrc, "initializing");
>
>+ alsasrc->uri = gst_uri_from_string(DEFAULT_PROP_URI);
> alsasrc->device = g_strdup (DEFAULT_PROP_DEVICE);
> alsasrc->cached_caps = NULL;
> alsasrc->driver_timestamps = FALSE;
>@@ -1048,3 +1085,48 @@ prepare_error:
> return;
> }
> }
>+
>+/* GstURIHandler interface */
>+static GstURIType
>+gst_alsasrc_uri_get_type (GType type)
>+{
>+ return GST_URI_SRC;
>+}
>+
>+static const gchar *const *
>+gst_alsasrc_uri_get_protocols (GType type)
>+{
>+ static const gchar *protocols[] = { "alsa", NULL };
>+
>+ return protocols;
>+}
>+
>+static gchar *
>+gst_alsasrc_uri_get_uri (GstURIHandler * handler)
>+{
>+ GstAlsaSrc *alsasrc = GST_ALSA_SRC (handler);
>+
>+ return gst_uri_to_string (alsasrc->uri);
>+}
>+
>+static gboolean
>+gst_alsasrc_uri_set_uri (GstURIHandler * handler, const gchar * uri,
>+ GError ** error)
>+{
>+ GstAlsaSrc *alsasrc = GST_ALSA_SRC (handler);
>+
>+ g_object_set (G_OBJECT (alsasrc), "uri", uri, NULL);
>+
>+ return TRUE;
>+}
>+
>+static void
>+gst_alsasrc_uri_handler_init (gpointer g_iface, gpointer iface_data)
>+{
>+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
>+
>+ iface->get_type = gst_alsasrc_uri_get_type;
>+ iface->get_protocols = gst_alsasrc_uri_get_protocols;
>+ iface->get_uri = gst_alsasrc_uri_get_uri;
>+ iface->set_uri = gst_alsasrc_uri_set_uri;
>+}
>diff --git a/ext/alsa/gstalsasrc.h b/ext/alsa/gstalsasrc.h
>index 57e27015a..5e00d4f63 100644
>--- a/ext/alsa/gstalsasrc.h
>+++ b/ext/alsa/gstalsasrc.h
>@@ -23,6 +23,8 @@
> #ifndef __GST_ALSASRC_H__
> #define __GST_ALSASRC_H__
>
>+#include <gst/gst.h>
>+#include <gst/gsturi.h>
> #include <gst/audio/audio.h>
> #include "gstalsa.h"
>
>@@ -50,6 +52,7 @@ typedef struct _GstAlsaSrcClass GstAlsaSrcClass;
> struct _GstAlsaSrc {
> GstAudioSrc src;
>
>+ GstUri *uri;
> gchar *device;
>
> snd_pcm_t *handle;
>--
>2.16.3
>
--
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.
More information about the gstreamer-bugs
mailing list