From 4a2981f90627716bdc4713f847b0e87e92dba894 Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Cerveau?= Date: Fri, 16 Oct 2020 14:35:04 +0200 Subject: [PATCH] alsa: allow per feature registration Split plugin into features including elements and device providers which can be indiviually registered during a static build. More details here: https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 Part-of: --- ext/alsa/gstalsaelement.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++ ext/alsa/gstalsaelements.h | 37 +++++++++++++++++++++ ext/alsa/gstalsamidisrc.c | 5 +++ ext/alsa/gstalsaplugin.c | 61 ++++------------------------------- ext/alsa/gstalsasink.c | 17 ++++------ ext/alsa/gstalsasrc.c | 5 +++ ext/alsa/meson.build | 1 + 7 files changed, 140 insertions(+), 66 deletions(-) create mode 100644 ext/alsa/gstalsaelement.c create mode 100644 ext/alsa/gstalsaelements.h diff --git a/ext/alsa/gstalsaelement.c b/ext/alsa/gstalsaelement.c new file mode 100644 index 0000000..c6ad28b --- /dev/null +++ b/ext/alsa/gstalsaelement.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2001 CodeFactory AB + * Copyright (C) 2001 Thomas Nyberg + * Copyright (C) 2001-2002 Andy Wingo + * Copyright (C) 2003 Benjamin Otte + * Copyright (C) 2020 Huawei Technologies Co., Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstalsaelements.h" +#include "gstalsadeviceprovider.h" + +#include + +GST_DEBUG_CATEGORY (alsa_debug); + +/* ALSA debugging wrapper */ +/* *INDENT-OFF* */ +G_GNUC_PRINTF (5, 6) +/* *INDENT-ON* */ +static void +gst_alsa_error_wrapper (const char *file, int line, const char *function, + int err, const char *fmt, ...) +{ +#ifndef GST_DISABLE_GST_DEBUG + va_list args; + gchar *str; + + va_start (args, fmt); + str = g_strdup_vprintf (fmt, args); + va_end (args); + /* FIXME: use GST_LEVEL_ERROR here? Currently warning is used because we're + * able to catch enough of the errors that would be printed otherwise + */ + gst_debug_log (alsa_debug, GST_LEVEL_WARNING, file, function, line, NULL, + "alsalib error: %s%s%s", str, err ? ": " : "", + err ? snd_strerror (err) : ""); + g_free (str); +#endif +} + +GST_DEVICE_PROVIDER_REGISTER_DEFINE (alsadeviceprovider, "alsadeviceprovider", + GST_RANK_SECONDARY, GST_TYPE_ALSA_DEVICE_PROVIDER); + +gboolean +alsa_element_init (GstPlugin * plugin) +{ + static gsize res = FALSE; + + if (g_once_init_enter (&res)) { + GST_DEBUG_CATEGORY_INIT (alsa_debug, "alsa", 0, "alsa plugins"); +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif + if (snd_lib_error_set_handler (gst_alsa_error_wrapper) != 0) + GST_WARNING ("failed to set alsa error handler"); + g_once_init_leave (&res, TRUE); + } + return res; +} diff --git a/ext/alsa/gstalsaelements.h b/ext/alsa/gstalsaelements.h new file mode 100644 index 0000000..60edff7 --- /dev/null +++ b/ext/alsa/gstalsaelements.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2020 Huawei Technologies Co., Ltd. + * @Author: Julian Bouzas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_ALSA_ELEMENTS_H__ +#define __GST_ALSA_ELEMENTS_H__ + +#include + +G_BEGIN_DECLS + +G_GNUC_INTERNAL gboolean alsa_element_init (GstPlugin * plugin); + +GST_ELEMENT_REGISTER_DECLARE (alsasrc); +GST_ELEMENT_REGISTER_DECLARE (alsasink); +GST_ELEMENT_REGISTER_DECLARE (alsamidisrc); + +GST_DEVICE_PROVIDER_REGISTER_DECLARE(alsadeviceprovider); + +G_END_DECLS + +#endif /* __GST_ALSA_ELEMENTS_H__ */ diff --git a/ext/alsa/gstalsamidisrc.c b/ext/alsa/gstalsamidisrc.c index d7cc619..c82ca37 100644 --- a/ext/alsa/gstalsamidisrc.c +++ b/ext/alsa/gstalsamidisrc.c @@ -42,6 +42,7 @@ # include "config.h" #endif +#include "gstalsaelements.h" #include "gstalsamidisrc.h" GST_DEBUG_CATEGORY_STATIC (gst_alsa_midi_src_debug); @@ -305,6 +306,10 @@ enum #define gst_alsa_midi_src_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstAlsaMidiSrc, gst_alsa_midi_src, GST_TYPE_PUSH_SRC, _do_init); +#define _do_element_init \ + ret |= alsa_element_init (plugin); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (alsamidisrc, "alsamidisrc", + GST_RANK_PRIMARY, GST_TYPE_ALSA_MIDI_SRC, _do_element_init); static void gst_alsa_midi_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); diff --git a/ext/alsa/gstalsaplugin.c b/ext/alsa/gstalsaplugin.c index ec3fbed..9f1ab2e 100644 --- a/ext/alsa/gstalsaplugin.c +++ b/ext/alsa/gstalsaplugin.c @@ -23,70 +23,21 @@ #include "config.h" #endif -#include "gstalsasink.h" -#include "gstalsasrc.h" -#include "gstalsamidisrc.h" +#include "gstalsaelements.h" #include "gstalsadeviceprovider.h" #include -GST_DEBUG_CATEGORY (alsa_debug); - -/* ALSA debugging wrapper */ -/* *INDENT-OFF* */ -G_GNUC_PRINTF (5, 6) -/* *INDENT-ON* */ -static void -gst_alsa_error_wrapper (const char *file, int line, const char *function, - int err, const char *fmt, ...) -{ -#ifndef GST_DISABLE_GST_DEBUG - va_list args; - gchar *str; - - va_start (args, fmt); - str = g_strdup_vprintf (fmt, args); - va_end (args); - /* FIXME: use GST_LEVEL_ERROR here? Currently warning is used because we're - * able to catch enough of the errors that would be printed otherwise - */ - gst_debug_log (alsa_debug, GST_LEVEL_WARNING, file, function, line, NULL, - "alsalib error: %s%s%s", str, err ? ": " : "", - err ? snd_strerror (err) : ""); - g_free (str); -#endif -} - static gboolean plugin_init (GstPlugin * plugin) { - int err; - - if (!gst_element_register (plugin, "alsasrc", GST_RANK_PRIMARY, - GST_TYPE_ALSA_SRC)) - return FALSE; - if (!gst_element_register (plugin, "alsasink", GST_RANK_PRIMARY, - GST_TYPE_ALSA_SINK)) - return FALSE; - if (!gst_element_register (plugin, "alsamidisrc", GST_RANK_PRIMARY, - GST_TYPE_ALSA_MIDI_SRC)) - return FALSE; - if (!gst_device_provider_register (plugin, "alsadeviceprovider", - GST_RANK_SECONDARY, GST_TYPE_ALSA_DEVICE_PROVIDER)) - return FALSE; + gboolean ret = FALSE; - GST_DEBUG_CATEGORY_INIT (alsa_debug, "alsa", 0, "alsa plugins"); - -#ifdef ENABLE_NLS - GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, - LOCALEDIR); - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); -#endif + ret |= GST_DEVICE_PROVIDER_REGISTER (alsadeviceprovider, plugin); - err = snd_lib_error_set_handler (gst_alsa_error_wrapper); - if (err != 0) - GST_WARNING ("failed to set alsa error handler"); + ret |= GST_ELEMENT_REGISTER (alsasrc, plugin); + ret |= GST_ELEMENT_REGISTER (alsasink, plugin); + ret |= GST_ELEMENT_REGISTER (alsamidisrc, plugin); return TRUE; } diff --git a/ext/alsa/gstalsasink.c b/ext/alsa/gstalsasink.c index 330578a..15f1b2b 100644 --- a/ext/alsa/gstalsasink.c +++ b/ext/alsa/gstalsasink.c @@ -47,6 +47,7 @@ #include #include +#include "gstalsaelements.h" #include "gstalsa.h" #include "gstalsasink.h" @@ -72,10 +73,12 @@ enum PROP_LAST }; -static void gst_alsasink_init_interfaces (GType type); +#define _do_init \ + ret |= alsa_element_init (plugin); #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 (GstAlsaSink, gst_alsasink, GST_TYPE_AUDIO_SINK); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (alsasink, "alsasink", GST_RANK_PRIMARY, + GST_TYPE_ALSA_SINK, _do_init); static void gst_alsasink_finalise (GObject * object); static void gst_alsasink_set_property (GObject * object, @@ -137,14 +140,6 @@ gst_alsasink_finalise (GObject * object) } static void -gst_alsasink_init_interfaces (GType type) -{ -#if 0 - gst_alsa_type_add_device_property_probe_interface (type); -#endif -} - -static void gst_alsasink_class_init (GstAlsaSinkClass * klass) { GObjectClass *gobject_class; diff --git a/ext/alsa/gstalsasrc.c b/ext/alsa/gstalsasrc.c index 89a922b..47d437b 100644 --- a/ext/alsa/gstalsasrc.c +++ b/ext/alsa/gstalsasrc.c @@ -45,6 +45,7 @@ #include #include +#include "gstalsaelements.h" #include "gstalsasrc.h" #include @@ -70,6 +71,10 @@ enum #define gst_alsasrc_parent_class parent_class G_DEFINE_TYPE (GstAlsaSrc, gst_alsasrc, GST_TYPE_AUDIO_SRC); +#define _do_init \ + ret |= alsa_element_init (plugin); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (alsasrc, "alsasrc", GST_RANK_PRIMARY, + GST_TYPE_ALSA_SRC, _do_init); static void gst_alsasrc_finalize (GObject * object); static void gst_alsasrc_set_property (GObject * object, diff --git a/ext/alsa/meson.build b/ext/alsa/meson.build index f8d4f2b..13d8214 100644 --- a/ext/alsa/meson.build +++ b/ext/alsa/meson.build @@ -2,6 +2,7 @@ alsa_sources = [ 'gstalsa.c', 'gstalsadeviceprovider.c', 'gstalsamidisrc.c', + 'gstalsaelement.c', 'gstalsaplugin.c', 'gstalsasink.c', 'gstalsasrc.c', -- 2.7.4