mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-15 07:00:05 -05:00
monitor: use dynamic types
Make the monitor item a POD object and use dynamic types.
This commit is contained in:
parent
c44a7c9735
commit
7270986c3a
14 changed files with 360 additions and 248 deletions
|
|
@ -31,26 +31,62 @@ typedef struct _SpaMonitor SpaMonitor;
|
|||
|
||||
#include <spa/defs.h>
|
||||
#include <spa/dict.h>
|
||||
#include <spa/plugin.h>
|
||||
#include <spa/event.h>
|
||||
|
||||
/**
|
||||
* SpaMonitorEventType:
|
||||
* @SPA_MONITOR_EVENT_TYPE_INVALID: invalid event
|
||||
* @SPA_MONITOR_EVENT_TYPE_ADDED: an item was added, data points to #SpaMonitorItem
|
||||
* @SPA_MONITOR_EVENT_TYPE_REMOVED: an item was removed, data points to #SpaMonitorItem
|
||||
* @SPA_MONITOR_EVENT_TYPE_CHANGED: an item was changed, data points to #SpaMonitorItem
|
||||
*/
|
||||
typedef enum {
|
||||
SPA_MONITOR_EVENT_TYPE_INVALID = 0,
|
||||
SPA_MONITOR_EVENT_TYPE_ADDED,
|
||||
SPA_MONITOR_EVENT_TYPE_REMOVED,
|
||||
SPA_MONITOR_EVENT_TYPE_CHANGED,
|
||||
} SpaMonitorEventType;
|
||||
typedef SpaEvent SpaMonitorEvent;
|
||||
#define SPA_MONITOR_EVENT_URI "http://spaplug.in/ns/monitor-event"
|
||||
#define SPA_MONITOR_EVENT_PREFIX SPA_MONITOR_EVENT_URI "#"
|
||||
|
||||
#define SPA_MONITOR_EVENT__Added SPA_MONITOR_EVENT_PREFIX "Added"
|
||||
#define SPA_MONITOR_EVENT__Removed SPA_MONITOR_EVENT_PREFIX "Removed"
|
||||
#define SPA_MONITOR_EVENT__Changed SPA_MONITOR_EVENT_PREFIX "Changed"
|
||||
|
||||
typedef SpaPODObject SpaMonitorItem;
|
||||
#define SPA_MONITOR_ITEM_URI "http://spaplug.in/ns/monitor-item"
|
||||
#define SPA_MONITOR_ITEM_PREFIX SPA_MONITOR_ITEM_URI "#"
|
||||
#define SPA_MONITOR_ITEM__id SPA_MONITOR_ITEM_PREFIX "id"
|
||||
#define SPA_MONITOR_ITEM__flags SPA_MONITOR_ITEM_PREFIX "flags"
|
||||
#define SPA_MONITOR_ITEM__state SPA_MONITOR_ITEM_PREFIX "state"
|
||||
#define SPA_MONITOR_ITEM__name SPA_MONITOR_ITEM_PREFIX "name"
|
||||
#define SPA_MONITOR_ITEM__class SPA_MONITOR_ITEM_PREFIX "class"
|
||||
#define SPA_MONITOR_ITEM__info SPA_MONITOR_ITEM_PREFIX "info"
|
||||
#define SPA_MONITOR_ITEM__factory SPA_MONITOR_ITEM_PREFIX "factory"
|
||||
|
||||
typedef struct {
|
||||
SpaMonitorEventType type;
|
||||
uint32_t size;
|
||||
} SpaMonitorEvent;
|
||||
uint32_t Monitor;
|
||||
|
||||
uint32_t Added;
|
||||
uint32_t Removed;
|
||||
uint32_t Changed;
|
||||
|
||||
uint32_t MonitorItem;
|
||||
uint32_t id;
|
||||
uint32_t flags;
|
||||
uint32_t state;
|
||||
uint32_t name;
|
||||
uint32_t klass;
|
||||
uint32_t info;
|
||||
uint32_t factory;
|
||||
} SpaMonitorTypes;
|
||||
|
||||
static inline void
|
||||
spa_monitor_types_map (SpaIDMap *map, SpaMonitorTypes *types)
|
||||
{
|
||||
if (types->Added == 0) {
|
||||
types->Monitor = spa_id_map_get_id (map, SPA_MONITOR_URI);
|
||||
types->Added = spa_id_map_get_id (map, SPA_MONITOR_EVENT__Added);
|
||||
types->Removed = spa_id_map_get_id (map, SPA_MONITOR_EVENT__Removed);
|
||||
types->Changed = spa_id_map_get_id (map, SPA_MONITOR_EVENT__Changed);
|
||||
types->MonitorItem = spa_id_map_get_id (map, SPA_MONITOR_ITEM_URI);
|
||||
types->id = spa_id_map_get_id (map, SPA_MONITOR_ITEM__id);
|
||||
types->flags = spa_id_map_get_id (map, SPA_MONITOR_ITEM__flags);
|
||||
types->state = spa_id_map_get_id (map, SPA_MONITOR_ITEM__state);
|
||||
types->name = spa_id_map_get_id (map, SPA_MONITOR_ITEM__name);
|
||||
types->klass = spa_id_map_get_id (map, SPA_MONITOR_ITEM__class);
|
||||
types->info = spa_id_map_get_id (map, SPA_MONITOR_ITEM__info);
|
||||
types->factory = spa_id_map_get_id (map, SPA_MONITOR_ITEM__factory);
|
||||
}
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
SPA_MONITOR_ITEM_FLAG_NONE = 0,
|
||||
|
|
@ -68,17 +104,6 @@ typedef enum {
|
|||
SPA_MONITOR_ITEM_STATE_UNAVAILABLE,
|
||||
} SpaMonitorItemState;
|
||||
|
||||
typedef struct {
|
||||
SpaMonitorEvent event;
|
||||
const char *id;
|
||||
SpaMonitorItemFlags flags;
|
||||
SpaMonitorItemState state;
|
||||
const char *name;
|
||||
const char *klass;
|
||||
const SpaDict *info;
|
||||
const SpaHandleFactory *factory;
|
||||
} SpaMonitorItem;
|
||||
|
||||
/**
|
||||
* SpaMonitorCallback:
|
||||
* @node: a #SpaMonitor emiting the event
|
||||
|
|
@ -88,9 +113,9 @@ typedef struct {
|
|||
* This will be called when a monitor event is notified
|
||||
* on @monitor.
|
||||
*/
|
||||
typedef void (*SpaMonitorEventCallback) (SpaMonitor *monitor,
|
||||
SpaMonitorEvent *event,
|
||||
void *user_data);
|
||||
typedef void (*SpaMonitorEventCallback) (SpaMonitor *monitor,
|
||||
SpaMonitorEvent *event,
|
||||
void *user_data);
|
||||
|
||||
/**
|
||||
* SpaMonitor:
|
||||
|
|
|
|||
|
|
@ -27,6 +27,9 @@ extern "C" {
|
|||
#include <spa/defs.h>
|
||||
#include <spa/dict.h>
|
||||
|
||||
#define SPA_HANDLE_URI "http://spaplug.in/ns/handle"
|
||||
#define SPA_HANDLE_FACTORY_URI "http://spaplug.in/ns/handle-factory"
|
||||
|
||||
typedef struct _SpaHandle SpaHandle;
|
||||
typedef struct _SpaHandleFactory SpaHandleFactory;
|
||||
|
||||
|
|
|
|||
|
|
@ -233,6 +233,15 @@ spa_pod_builder_bytes (SpaPODBuilder *builder, const void *bytes, uint32_t len)
|
|||
return ref;
|
||||
}
|
||||
|
||||
#define SPA_POD_POINTER_INIT(type,value) { { sizeof (SpaPODPointerBody), SPA_POD_TYPE_POINTER }, { type, value } }
|
||||
|
||||
static inline uint32_t
|
||||
spa_pod_builder_pointer (SpaPODBuilder *builder, uint32_t type, void *val)
|
||||
{
|
||||
const SpaPODPointer p = SPA_POD_POINTER_INIT (type, val);
|
||||
return spa_pod_builder_primitive (builder, &p.pod);
|
||||
}
|
||||
|
||||
#define SPA_POD_RECTANGLE_INIT(width,height) { { sizeof (SpaRectangle), SPA_POD_TYPE_RECTANGLE }, { width, height } }
|
||||
|
||||
static inline uint32_t
|
||||
|
|
@ -329,6 +338,7 @@ spa_pod_builder_addv (SpaPODBuilder *builder,
|
|||
SpaPODDouble double_pod;
|
||||
SpaPODString string_pod;
|
||||
SpaPODBytes bytes_pod;
|
||||
SpaPODPointer pointer_pod;
|
||||
SpaPODRectangle rectangle_pod;
|
||||
SpaPODFraction fraction_pod;
|
||||
SpaPODArray array_pod;
|
||||
|
|
@ -400,6 +410,14 @@ spa_pod_builder_addv (SpaPODBuilder *builder,
|
|||
head.bytes_pod.pod.size = body_size;
|
||||
head_size = sizeof (SpaPOD);
|
||||
goto primitive;
|
||||
case SPA_POD_TYPE_POINTER:
|
||||
head.pointer_pod.pod.type = SPA_POD_TYPE_POINTER;
|
||||
head.pointer_pod.pod.size = body_size = sizeof (SpaPODPointerBody);
|
||||
head.pointer_pod.body.type = va_arg (args, uint32_t);
|
||||
head.pointer_pod.body.value = va_arg (args, void *);
|
||||
head_size = sizeof (SpaPOD);
|
||||
body = &head.pointer_pod.body;
|
||||
goto primitive;
|
||||
case SPA_POD_TYPE_RECTANGLE:
|
||||
head.rectangle_pod.pod.type = SPA_POD_TYPE_RECTANGLE;
|
||||
head.rectangle_pod.pod.size = body_size = sizeof (SpaRectangle);
|
||||
|
|
|
|||
|
|
@ -116,7 +116,9 @@ spa_pod_iter_getv (SpaPODIter *iter,
|
|||
uint32_t type,
|
||||
va_list args)
|
||||
{
|
||||
while (type && spa_pod_iter_has_next (iter)) {
|
||||
bool res = true;
|
||||
|
||||
while (type && (res = spa_pod_iter_has_next (iter))) {
|
||||
SpaPOD *pod = spa_pod_iter_next (iter);
|
||||
|
||||
if (type != SPA_POD_TYPE_POD && pod->type != type)
|
||||
|
|
@ -126,7 +128,7 @@ spa_pod_iter_getv (SpaPODIter *iter,
|
|||
|
||||
type = va_arg (args, uint32_t);
|
||||
}
|
||||
return true;
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
|
|
|
|||
|
|
@ -120,6 +120,12 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
|
|||
*(va_arg (args, void **)) = SPA_POD_CONTENTS (SpaPODBytes, pod); \
|
||||
*(va_arg (args, uint32_t *)) = SPA_POD_BODY_SIZE (pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_POINTER: \
|
||||
{ \
|
||||
SpaPODPointerBody *b = SPA_POD_BODY (pod); \
|
||||
*(va_arg (args, void **)) = b->value; \
|
||||
break; \
|
||||
} \
|
||||
case SPA_POD_TYPE_RECTANGLE: \
|
||||
*(va_arg (args, SpaRectangle *)) = SPA_POD_VALUE (SpaPODRectangle, pod); \
|
||||
break; \
|
||||
|
|
@ -143,6 +149,7 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
|
|||
#define SPA_POD_COLLECT_SKIP(type,args) \
|
||||
switch (type) { \
|
||||
case SPA_POD_TYPE_BYTES: \
|
||||
case SPA_POD_TYPE_POINTER: \
|
||||
va_arg (args, void*); \
|
||||
/* fallthrough */ \
|
||||
case SPA_POD_TYPE_BOOL: \
|
||||
|
|
@ -177,7 +184,7 @@ spa_pod_contents_queryv (const SpaPOD *pod, uint32_t offset, uint32_t key, va_li
|
|||
type = va_arg (args, uint32_t);
|
||||
|
||||
if (prop && prop->body.key == key &&
|
||||
prop->body.value.type == type &&
|
||||
(type == SPA_POD_TYPE_POD || prop->body.value.type == type) &&
|
||||
!(prop->body.flags & SPA_POD_PROP_FLAG_UNSET)) {
|
||||
SPA_POD_COLLECT (&prop->body.value, type, args);
|
||||
count++;
|
||||
|
|
@ -202,6 +209,9 @@ spa_pod_contents_query (const SpaPOD *pod, uint32_t offset, uint32_t key, ...)
|
|||
return count;
|
||||
}
|
||||
|
||||
#define spa_pod_object_query(object,key, ...) \
|
||||
spa_pod_contents_query (&object->pod, sizeof (SpaPODObject), key, __VA_ARGS__)
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ typedef enum {
|
|||
SPA_POD_TYPE_DOUBLE,
|
||||
SPA_POD_TYPE_STRING,
|
||||
SPA_POD_TYPE_BYTES,
|
||||
SPA_POD_TYPE_POINTER,
|
||||
SPA_POD_TYPE_RECTANGLE,
|
||||
SPA_POD_TYPE_FRACTION,
|
||||
SPA_POD_TYPE_BITMASK,
|
||||
|
|
@ -94,6 +95,16 @@ typedef struct {
|
|||
/* value here */
|
||||
} SpaPODBytes;
|
||||
|
||||
typedef struct {
|
||||
uint32_t type;
|
||||
void *value;
|
||||
} SpaPODPointerBody;
|
||||
|
||||
typedef struct {
|
||||
SpaPOD pod;
|
||||
SpaPODPointerBody body;
|
||||
} SpaPODPointer;
|
||||
|
||||
typedef struct {
|
||||
SpaPOD pod;
|
||||
SpaRectangle value;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue