mirror of
https://gitlab.freedesktop.org/pipewire/wireplumber.git
synced 2025-12-20 05:20:05 +01:00
Since all the current hooks are defined specifically for a particular event type, we can register the hooks in a hash table using the event type as key for faster event hook collection. Also, hooks that are not specific to a particular event type, like constraints such as 'event.type=*', will be registered in both the undefined hook list, and also in all the hash table defined hook lists so they are always evaluated. Even though 'wp_event_dispatcher_new_hooks_iterator()' can still be used, it is now marked as deprecated because it is slower. The event hook collection uses 'wp_event_dispatcher_new_hooks_for_event_type_iterator()' now because it is much faster. Previously, the more hooks we were registering, the slower WirePlumber would process events as all hooks needed to be evaluated for all events constantly. This is not the case anymore with this patch. We can register thousands of hooks, and if only 1 of those runs for a particular event, only 1 will be evaluated instead of all of them. See #824
141 lines
4.3 KiB
C
141 lines
4.3 KiB
C
/* WirePlumber
|
|
*
|
|
* Copyright © 2020 Collabora Ltd.
|
|
* @author George Kiagiadakis <george.kiagiadakis@collabora.com>
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#ifndef __WIREPLUMBER_OBJECT_INTEREST_H__
|
|
#define __WIREPLUMBER_OBJECT_INTEREST_H__
|
|
|
|
#include <glib-object.h>
|
|
#include "defs.h"
|
|
#include "properties.h"
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/*!
|
|
* \brief Constraint types for wp_object_interest_add_constraint()
|
|
* \ingroup wpobjectinterest
|
|
*/
|
|
typedef enum {
|
|
/*! invalid constraint type */
|
|
WP_CONSTRAINT_TYPE_NONE = 0,
|
|
/*! constraint applies to a PipeWire global property of the object
|
|
* (the ones returned by wp_global_proxy_get_global_properties()) */
|
|
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
|
|
/*! constraint applies to a PipeWire property of the object
|
|
* (the ones returned by wp_pipewire_object_get_properties()) */
|
|
WP_CONSTRAINT_TYPE_PW_PROPERTY,
|
|
/*! constraint applies to a GObject property of the object */
|
|
WP_CONSTRAINT_TYPE_G_PROPERTY,
|
|
} WpConstraintType;
|
|
|
|
/*!
|
|
* \brief Verbs to use with wp_object_interest_add_constraint()
|
|
* \ingroup wpobjectinterest
|
|
*/
|
|
typedef enum {
|
|
/*! the subject's value must equal the constraint's value */
|
|
WP_CONSTRAINT_VERB_EQUALS = '=',
|
|
/*! the subject's value must be different from the constraint's value */
|
|
WP_CONSTRAINT_VERB_NOT_EQUALS = '!',
|
|
/*! the subject's value must equal at least
|
|
* one of the values in the list given as the constraint's value */
|
|
WP_CONSTRAINT_VERB_IN_LIST = 'c',
|
|
/*! the subject's value must be a number in the range defined
|
|
* by the constraint's value */
|
|
WP_CONSTRAINT_VERB_IN_RANGE = '~',
|
|
/*! the subject's value must match the pattern specified in the
|
|
* constraint's value */
|
|
WP_CONSTRAINT_VERB_MATCHES = '#',
|
|
/*! the subject property must exist */
|
|
WP_CONSTRAINT_VERB_IS_PRESENT = '+',
|
|
/*! the subject property must not exist */
|
|
WP_CONSTRAINT_VERB_IS_ABSENT = '-',
|
|
} WpConstraintVerb;
|
|
|
|
/*!
|
|
* \brief Flags that indicate which constraints have been matched in
|
|
* wp_object_interest_matches_full()
|
|
* \ingroup wpobjectinterest
|
|
*/
|
|
typedef enum { /*< flags >*/
|
|
WP_INTEREST_MATCH_NONE = 0,
|
|
WP_INTEREST_MATCH_GTYPE = (1 << 0),
|
|
WP_INTEREST_MATCH_PW_GLOBAL_PROPERTIES = (1 << 1),
|
|
WP_INTEREST_MATCH_PW_PROPERTIES = (1 << 2),
|
|
WP_INTEREST_MATCH_G_PROPERTIES = (1 << 3),
|
|
|
|
/*!
|
|
* Special WpInterestMatch value that indicates that all constraints
|
|
* have been matched
|
|
*/
|
|
WP_INTEREST_MATCH_ALL =
|
|
(WP_INTEREST_MATCH_GTYPE |
|
|
WP_INTEREST_MATCH_PW_GLOBAL_PROPERTIES |
|
|
WP_INTEREST_MATCH_PW_PROPERTIES |
|
|
WP_INTEREST_MATCH_G_PROPERTIES),
|
|
} WpInterestMatch;
|
|
|
|
/*!
|
|
* \brief Flags to alter the behaviour of wp_object_interest_matches_full()
|
|
* \ingroup wpobjectinterest
|
|
*/
|
|
typedef enum { /*< flags >*/
|
|
WP_INTEREST_MATCH_FLAGS_NONE = 0,
|
|
/*! check all the constraints instead of returning after the first mismatch */
|
|
WP_INTEREST_MATCH_FLAGS_CHECK_ALL = (1 << 0),
|
|
} WpInterestMatchFlags;
|
|
|
|
/*!
|
|
* \brief The WpObjectInterest GType
|
|
* \ingroup wpobjectinterest
|
|
*/
|
|
#define WP_TYPE_OBJECT_INTEREST (wp_object_interest_get_type ())
|
|
WP_API
|
|
GType wp_object_interest_get_type (void) G_GNUC_CONST;
|
|
|
|
typedef struct _WpObjectInterest WpObjectInterest;
|
|
|
|
WP_API
|
|
WpObjectInterest * wp_object_interest_new (GType gtype, ...) G_GNUC_NULL_TERMINATED;
|
|
|
|
WP_API
|
|
WpObjectInterest * wp_object_interest_new_valist (GType gtype, va_list * args);
|
|
|
|
WP_API
|
|
WpObjectInterest * wp_object_interest_new_type (GType gtype);
|
|
|
|
WP_API
|
|
void wp_object_interest_add_constraint (WpObjectInterest * self,
|
|
WpConstraintType type, const gchar * subject,
|
|
WpConstraintVerb verb, GVariant * value);
|
|
|
|
WP_API
|
|
WpObjectInterest * wp_object_interest_ref (WpObjectInterest *self);
|
|
|
|
WP_API
|
|
void wp_object_interest_unref (WpObjectInterest * self);
|
|
|
|
WP_API
|
|
gboolean wp_object_interest_validate (WpObjectInterest * self, GError ** error);
|
|
|
|
WP_API
|
|
gboolean wp_object_interest_matches (WpObjectInterest * self, gpointer object);
|
|
|
|
WP_API
|
|
WpInterestMatch wp_object_interest_matches_full (WpObjectInterest * self,
|
|
WpInterestMatchFlags flags, GType object_type, gpointer object,
|
|
WpProperties * pw_props, WpProperties * pw_global_props);
|
|
|
|
WP_API
|
|
GPtrArray * wp_object_interest_find_defined_constraint_values (
|
|
WpObjectInterest * self, WpConstraintType type, const gchar * subject);
|
|
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (WpObjectInterest, wp_object_interest_unref)
|
|
|
|
G_END_DECLS
|
|
|
|
#endif
|