mirror of
https://github.com/Rafostar/clapper.git
synced 2025-08-29 23:32:04 +02:00
The Free Software Foundation is now remote-only, and no longer has a street address. Updated license notice text is from https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html#SEC4.
168 lines
4.9 KiB
C
168 lines
4.9 KiB
C
/* Clapper Playback Library
|
|
* Copyright (C) 2024 Rafał Dzięgiel <rafostar.github@gmail.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see
|
|
* <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "clapper-bus-private.h"
|
|
#include "clapper-features-manager-private.h"
|
|
#include "clapper-features-bus-private.h"
|
|
|
|
#define GST_CAT_DEFAULT clapper_features_bus_debug
|
|
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
|
|
|
|
struct _ClapperFeaturesBus
|
|
{
|
|
GstBus parent;
|
|
};
|
|
|
|
#define parent_class clapper_features_bus_parent_class
|
|
G_DEFINE_TYPE (ClapperFeaturesBus, clapper_features_bus, GST_TYPE_BUS);
|
|
|
|
enum
|
|
{
|
|
CLAPPER_FEATURES_BUS_STRUCTURE_UNKNOWN = 0,
|
|
CLAPPER_FEATURES_BUS_STRUCTURE_EVENT
|
|
};
|
|
|
|
static ClapperBusQuark _structure_quarks[] = {
|
|
{"unknown", 0},
|
|
{"event", 0},
|
|
{NULL, 0}
|
|
};
|
|
|
|
enum
|
|
{
|
|
CLAPPER_FEATURES_BUS_FIELD_UNKNOWN = 0,
|
|
CLAPPER_FEATURES_BUS_FIELD_EVENT,
|
|
CLAPPER_FEATURES_BUS_FIELD_VALUE,
|
|
CLAPPER_FEATURES_BUS_FIELD_EXTRA_VALUE
|
|
};
|
|
|
|
static ClapperBusQuark _field_quarks[] = {
|
|
{"unknown", 0},
|
|
{"event", 0},
|
|
{"value", 0},
|
|
{"extra-value", 0},
|
|
{NULL, 0}
|
|
};
|
|
|
|
#define _STRUCTURE_QUARK(q) (_structure_quarks[CLAPPER_FEATURES_BUS_STRUCTURE_##q].quark)
|
|
#define _FIELD_QUARK(q) (_field_quarks[CLAPPER_FEATURES_BUS_FIELD_##q].quark)
|
|
#define _MESSAGE_SRC_CLAPPER_FEATURES_MANAGER(msg) ((ClapperFeaturesManager *) GST_MESSAGE_SRC (msg))
|
|
|
|
void
|
|
clapper_features_bus_initialize (void)
|
|
{
|
|
gint i;
|
|
|
|
for (i = 0; _structure_quarks[i].name; ++i)
|
|
_structure_quarks[i].quark = g_quark_from_static_string (_structure_quarks[i].name);
|
|
for (i = 0; _field_quarks[i].name; ++i)
|
|
_field_quarks[i].quark = g_quark_from_static_string (_field_quarks[i].name);
|
|
}
|
|
|
|
void
|
|
clapper_features_bus_post_event (ClapperFeaturesBus *self,
|
|
ClapperFeaturesManager *src, ClapperFeaturesManagerEvent event,
|
|
GValue *value, GValue *extra_value)
|
|
{
|
|
GstStructure *structure = gst_structure_new_id (_STRUCTURE_QUARK (EVENT),
|
|
_FIELD_QUARK (EVENT), G_TYPE_ENUM, event,
|
|
NULL);
|
|
|
|
if (value)
|
|
gst_structure_id_take_value (structure, _FIELD_QUARK (VALUE), value);
|
|
if (extra_value)
|
|
gst_structure_id_take_value (structure, _FIELD_QUARK (EXTRA_VALUE), extra_value);
|
|
|
|
gst_bus_post (GST_BUS_CAST (self), gst_message_new_application (
|
|
GST_OBJECT_CAST (src), structure));
|
|
}
|
|
|
|
static inline void
|
|
_handle_event_msg (GstMessage *msg, const GstStructure *structure,
|
|
ClapperFeaturesManager *features_manager)
|
|
{
|
|
ClapperFeaturesManagerEvent event = CLAPPER_FEATURES_MANAGER_EVENT_UNKNOWN;
|
|
const GValue *value = gst_structure_id_get_value (structure, _FIELD_QUARK (VALUE));
|
|
const GValue *extra_value = gst_structure_id_get_value (structure, _FIELD_QUARK (EXTRA_VALUE));
|
|
|
|
gst_structure_id_get (structure,
|
|
_FIELD_QUARK (EVENT), G_TYPE_ENUM, &event,
|
|
NULL);
|
|
|
|
clapper_features_manager_handle_event (features_manager, event, value, extra_value);
|
|
}
|
|
|
|
static gboolean
|
|
clapper_features_bus_message_func (GstBus *bus, GstMessage *msg, gpointer user_data G_GNUC_UNUSED)
|
|
{
|
|
if (G_LIKELY (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_APPLICATION)) {
|
|
ClapperFeaturesManager *features_manager = _MESSAGE_SRC_CLAPPER_FEATURES_MANAGER (msg);
|
|
const GstStructure *structure = gst_message_get_structure (msg);
|
|
GQuark quark = gst_structure_get_name_id (structure);
|
|
|
|
if (quark == _STRUCTURE_QUARK (EVENT))
|
|
_handle_event_msg (msg, structure, features_manager);
|
|
}
|
|
|
|
return G_SOURCE_CONTINUE;
|
|
}
|
|
|
|
/*
|
|
* clapper_features_bus_new:
|
|
*
|
|
* Returns: (transfer full): a new #ClapperFeaturesBus instance.
|
|
*/
|
|
ClapperFeaturesBus *
|
|
clapper_features_bus_new (void)
|
|
{
|
|
GstBus *features_bus;
|
|
|
|
features_bus = GST_BUS_CAST (g_object_new (CLAPPER_TYPE_FEATURES_BUS, NULL));
|
|
gst_object_ref_sink (features_bus);
|
|
|
|
gst_bus_add_watch (features_bus, (GstBusFunc) clapper_features_bus_message_func, NULL);
|
|
|
|
return CLAPPER_FEATURES_BUS_CAST (features_bus);
|
|
}
|
|
|
|
static void
|
|
clapper_features_bus_init (ClapperFeaturesBus *self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
clapper_features_bus_finalize (GObject *object)
|
|
{
|
|
ClapperFeaturesBus *self = CLAPPER_FEATURES_BUS_CAST (object);
|
|
|
|
GST_TRACE_OBJECT (self, "Finalize");
|
|
|
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
|
}
|
|
|
|
static void
|
|
clapper_features_bus_class_init (ClapperFeaturesBusClass *klass)
|
|
{
|
|
GObjectClass *gobject_class = (GObjectClass *) klass;
|
|
|
|
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperfeaturesbus", 0,
|
|
"Clapper Features Bus");
|
|
|
|
gobject_class->finalize = clapper_features_bus_finalize;
|
|
}
|