Files
wireplumber/lib/wp/core-interfaces.c
2019-04-22 13:07:08 +03:00

238 lines
7.0 KiB
C

/* WirePlumber
*
* Copyright © 2019 Collabora Ltd.
* @author George Kiagiadakis <george.kiagiadakis@collabora.com>
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
#include "core-interfaces.h"
#include "plugin.h"
#include "session.h"
/* WpPluginRegistry */
G_DEFINE_INTERFACE (WpPluginRegistry, wp_plugin_registry, WP_TYPE_INTERFACE_IMPL)
static void
wp_plugin_registry_default_init (WpPluginRegistryInterface * iface)
{
}
/**
* wp_plugin_registry_register_static: (skip)
* @plugin_type: the #GType of the #WpPlugin subclass
* @metadata: the metadata
* @metadata_size: the sizeof (@metadata), to allow ABI-compatible future
* expansion of the structure
*
* Registers a plugin in the registry.
* This method is used internally by WP_PLUGIN_REGISTER().
* Avoid using it directly.
*/
void
wp_plugin_registry_register_static (WpPluginRegistry * self,
GType plugin_type,
const WpPluginMetadata * metadata,
gsize metadata_size)
{
WpPluginRegistryInterface *iface = WP_PLUGIN_REGISTRY_GET_IFACE (self);
g_return_if_fail (WP_IS_PLUGIN_REGISTRY (self));
g_return_if_fail (iface->register_plugin != NULL);
g_return_if_fail (g_type_is_a (plugin_type, WP_TYPE_PLUGIN));
g_return_if_fail (metadata->name != NULL);
g_return_if_fail (metadata->description != NULL);
g_return_if_fail (metadata->author != NULL);
g_return_if_fail (metadata->license != NULL);
g_return_if_fail (metadata->version != NULL);
g_return_if_fail (metadata->origin != NULL);
WP_PLUGIN_REGISTRY_GET_IFACE (self)->register_plugin (self, plugin_type,
metadata, metadata_size, TRUE);
}
/**
* wp_plugin_registry_register: (method)
* @plugin_type: the #GType of the #WpPlugin subclass
* @rank: the rank of the plugin
* @name: the name of the plugin
* @description: plugin description
* @author: author <email@domain>, author2 <email@domain>
* @license: a SPDX license ID or "Proprietary"
* @version: the version of the plugin
* @origin: URL or short reference of where this plugin came from
*
* Registers a plugin in the registry.
* This method creates a dynamically allocated #WpPluginMetadata and is meant
* to be used by bindings that have no way of representing #WpPluginMetadata.
* In C/C++, you should use WP_PLUGIN_REGISTER()
*/
void
wp_plugin_registry_register (WpPluginRegistry * self,
GType plugin_type,
guint16 rank,
const gchar *name,
const gchar *description,
const gchar *author,
const gchar *license,
const gchar *version,
const gchar *origin)
{
WpPluginRegistryInterface *iface = WP_PLUGIN_REGISTRY_GET_IFACE (self);
WpPluginMetadata metadata = {0};
g_return_if_fail (WP_IS_PLUGIN_REGISTRY (self));
g_return_if_fail (iface->register_plugin != NULL);
g_return_if_fail (g_type_is_a (plugin_type, WP_TYPE_PLUGIN));
g_return_if_fail (name != NULL);
g_return_if_fail (description != NULL);
g_return_if_fail (author != NULL);
g_return_if_fail (license != NULL);
g_return_if_fail (version != NULL);
g_return_if_fail (origin != NULL);
metadata.rank = rank;
metadata.name = name;
metadata.description = description;
metadata.author = author;
metadata.license = license;
metadata.version = version;
metadata.origin = origin;
WP_PLUGIN_REGISTRY_GET_IFACE (self)->register_plugin (self, plugin_type,
&metadata, sizeof (metadata), FALSE);
}
/* WpProxyRegistry */
G_DEFINE_INTERFACE (WpProxyRegistry, wp_proxy_registry, WP_TYPE_INTERFACE_IMPL)
static void
wp_proxy_registry_default_init (WpProxyRegistryInterface * iface)
{
}
/**
* wp_proxy_registry_get_proxy: (method)
* @self: the registry
* @global_id: the ID of the pw_global that is represented by the proxy
*
* Returns: (transfer full): the #WpProxy that represents the global with
* @global_id
*/
WpProxy *
wp_proxy_registry_get_proxy (WpProxyRegistry * self, guint32 global_id)
{
WpProxyRegistryInterface * iface = WP_PROXY_REGISTRY_GET_IFACE (self);
g_return_val_if_fail (WP_IS_PROXY_REGISTRY (self), NULL);
g_return_val_if_fail (iface->get_proxy != NULL, NULL);
return iface->get_proxy (self, global_id);
}
/**
* wp_proxy_registry_get_pw_registry_proxy: (skip)
* @self: the registry
*
* Returns: the underlying `pw_registry_proxy`
*/
struct pw_registry_proxy *
wp_proxy_registry_get_pw_registry_proxy (WpProxyRegistry * self)
{
WpProxyRegistryInterface * iface = WP_PROXY_REGISTRY_GET_IFACE (self);
g_return_val_if_fail (WP_IS_PROXY_REGISTRY (self), NULL);
g_return_val_if_fail (iface->get_pw_registry_proxy != NULL, NULL);
return iface->get_pw_registry_proxy (self);
}
/* WpSessionRegistry */
G_DEFINE_INTERFACE (WpSessionRegistry, wp_session_registry, G_TYPE_OBJECT)
enum {
SIG_SESSION_REGISTERED,
SIG_SESSION_UNREGISTERED,
N_SESSION_REGISTRY_SIGNALS
};
static guint session_registry_signals[N_SESSION_REGISTRY_SIGNALS];
static void
wp_session_registry_default_init (WpSessionRegistryInterface * iface)
{
session_registry_signals[SIG_SESSION_REGISTERED] = g_signal_new (
"session-registered", G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_UINT,
WP_TYPE_SESSION);
session_registry_signals[SIG_SESSION_UNREGISTERED] = g_signal_new (
"session-unregistered", G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT);
}
guint32
wp_session_registry_register_session (WpSessionRegistry * self,
WpSession * session,
GError ** error)
{
WpSessionRegistryInterface *iface = WP_SESSION_REGISTRY_GET_IFACE (self);
guint32 id;
g_return_val_if_fail (WP_IS_SESSION_REGISTRY (self), -1);
g_return_val_if_fail (session != NULL, -1);
g_return_val_if_fail (iface->register_session, -1);
id = iface->register_session (self, session, error);
if (id != -1) {
g_signal_emit (self, session_registry_signals[SIG_SESSION_REGISTERED], 0,
id, session);
}
return id;
}
gboolean
wp_session_registry_unregister_session (WpSessionRegistry * self,
guint32 session_id)
{
WpSessionRegistryInterface *iface = WP_SESSION_REGISTRY_GET_IFACE (self);
gboolean ret;
g_return_val_if_fail (WP_IS_SESSION_REGISTRY (self), FALSE);
g_return_val_if_fail (iface->unregister_session, FALSE);
ret = iface->unregister_session (self, session_id);
if (ret) {
g_signal_emit (self, session_registry_signals[SIG_SESSION_UNREGISTERED], 0,
session_id);
}
return ret;
}
GArray *
wp_session_registry_list_sessions (WpSessionRegistry * self,
const gchar * media_class)
{
WpSessionRegistryInterface *iface = WP_SESSION_REGISTRY_GET_IFACE (self);
g_return_val_if_fail (WP_IS_SESSION_REGISTRY (self), NULL);
g_return_val_if_fail (iface->list_sessions, NULL);
return iface->list_sessions (self, media_class);
}
WpSession *
wp_session_registry_get_session (WpSessionRegistry * self,
guint32 session_id)
{
WpSessionRegistryInterface *iface = WP_SESSION_REGISTRY_GET_IFACE (self);
g_return_val_if_fail (WP_IS_SESSION_REGISTRY (self), NULL);
g_return_val_if_fail (iface->get_session, NULL);
return iface->get_session (self, session_id);
}