node: add port and node params

Add a new struct spa_param_info that lists the available params on
a node/port and if they are readable/writable/updated. We can use
this to replace and improve the PARAM_List and also to notify
property change and updates.

Update elements and code to deal with this new param stuff. Add
port and node info to most elements and signal changes.

Use async enum_params in -inspect and use the param info to know
which ones to enumerate.

Use the port info to know what parameters to update in the
remote-node.
This commit is contained in:
Wim Taymans 2019-02-27 16:43:01 +01:00
parent 3d25adc598
commit 499dd3ff22
52 changed files with 1979 additions and 1461 deletions

View file

@ -41,12 +41,12 @@ struct spa_device_info {
#define SPA_VERSION_DEVICE_INFO 0
uint32_t version;
#define SPA_DEVICE_CHANGE_MASK_INFO (1<<0)
#define SPA_DEVICE_CHANGE_MASK_PROPS (1<<0)
#define SPA_DEVICE_CHANGE_MASK_PARAMS (1<<1)
uint64_t change_mask;
const struct spa_dict *info;
const struct spa_dict *props;
struct spa_param_info *params;
uint32_t n_params;
uint32_t *params;
};
#define SPA_DEVICE_INFO_INIT() (struct spa_device_info){ SPA_VERSION_DEVICE_INFO, }
@ -58,9 +58,9 @@ struct spa_device_object_info {
uint32_t type;
const struct spa_handle_factory *factory;
#define SPA_DEVICE_OBJECT_CHANGE_MASK_INFO (1<<0)
#define SPA_DEVICE_OBJECT_CHANGE_MASK_PROPS (1<<0)
uint64_t change_mask;
const struct spa_dict *info;
const struct spa_dict *props;
};
#define SPA_DEVICE_OBJECT_INFO_INIT() (struct spa_device_object_info){ SPA_VERSION_DEVICE_OBJECT_INFO, }

View file

@ -55,9 +55,7 @@ struct spa_io_buffers {
#define SPA_STATUS_OK 0
#define SPA_STATUS_NEED_BUFFER (1<<0)
#define SPA_STATUS_HAVE_BUFFER (1<<1)
#define SPA_STATUS_FORMAT_CHANGED (1<<2)
#define SPA_STATUS_PORT_CHANGED (1<<3)
#define SPA_STATUS_PARAM_CHANGED (1<<4)
#define SPA_STATUS_STOPPED (1<<2)
int32_t status; /**< the status code */
uint32_t buffer_id; /**< a buffer id */
};

View file

@ -52,12 +52,16 @@ struct spa_node_info {
uint32_t max_output_ports;
#define SPA_NODE_CHANGE_MASK_FLAGS (1u<<0)
#define SPA_NODE_CHANGE_MASK_PROPS (1u<<1)
#define SPA_NODE_CHANGE_MASK_PARAMS (1u<<2)
uint64_t change_mask;
#define SPA_NODE_FLAG_DYNAMIC_INPUT_PORTS (1u<<0) /**< input ports can be added/removed */
#define SPA_NODE_FLAG_DYNAMIC_OUTPUT_PORTS (1u<<1) /**< output ports can be added/removed */
#define SPA_NODE_FLAG_RT (1u<<2) /**< node can do real-time processing */
uint32_t flags;
struct spa_dict *props;
struct spa_dict *props; /**< extra node properties */
struct spa_param_info *params; /**< parameter information */
uint32_t n_params; /**< number of items in \a params */
};
#define SPA_NODE_INFO_INIT() (struct spa_node_info) { 0, }
@ -71,6 +75,7 @@ struct spa_port_info {
#define SPA_PORT_CHANGE_MASK_FLAGS (1u<<0)
#define SPA_PORT_CHANGE_MASK_RATE (1u<<1)
#define SPA_PORT_CHANGE_MASK_PROPS (1u<<2)
#define SPA_PORT_CHANGE_MASK_PARAMS (1u<<3)
uint64_t change_mask;
#define SPA_PORT_FLAG_REMOVABLE (1u<<0) /**< port can be removed */
@ -90,6 +95,8 @@ struct spa_port_info {
uint32_t flags; /**< port flags */
uint32_t rate; /**< rate of sequence numbers on port */
const struct spa_dict *props; /**< extra port properties */
struct spa_param_info *params; /**< parameter information */
uint32_t n_params; /**< number of items in \a params */
};
#define SPA_PORT_INFO_INIT() (struct spa_port_info) { 0, }

View file

@ -34,7 +34,6 @@ extern "C" {
/** different parameter types that can be queried */
enum spa_param_type {
SPA_PARAM_Invalid, /**< invalid */
SPA_PARAM_List, /**< available params as SPA_TYPE_OBJECT_ParamList */
SPA_PARAM_PropInfo, /**< property information as SPA_TYPE_OBJECT_PropInfo */
SPA_PARAM_Props, /**< properties as SPA_TYPE_OBJECT_Props */
SPA_PARAM_EnumFormat, /**< available formats as SPA_TYPE_OBJECT_Format */

View file

@ -41,7 +41,6 @@ extern "C" {
static const struct spa_type_info spa_type_param[] = {
{ SPA_PARAM_Invalid, SPA_TYPE_Int, SPA_TYPE_INFO_PARAM_ID_BASE "Invalid", NULL },
{ SPA_PARAM_List, SPA_TYPE_Int, SPA_TYPE_INFO_PARAM_ID_BASE "List", NULL },
{ SPA_PARAM_PropInfo, SPA_TYPE_Int, SPA_TYPE_INFO_PARAM_ID_BASE "PropInfo", NULL },
{ SPA_PARAM_Props, SPA_TYPE_Int, SPA_TYPE_INFO_PARAM_ID_BASE "Props", NULL },
{ SPA_PARAM_EnumFormat, SPA_TYPE_Int, SPA_TYPE_INFO_PARAM_ID_BASE "EnumFormat", NULL },
@ -57,16 +56,6 @@ static const struct spa_type_info spa_type_param[] = {
#define SPA_TYPE_INFO_Param SPA_TYPE_INFO_OBJECT_BASE "Param"
#define SPA_TYPE_INFO_PARAM_BASE SPA_TYPE_INFO_Param ":"
/* object with supported parameter id */
#define SPA_TYPE_INFO_PARAM_List SPA_TYPE_INFO_PARAM_BASE "List"
#define SPA_TYPE_INFO_PARAM_LIST_BASE SPA_TYPE_INFO_PARAM_List ":"
static const struct spa_type_info spa_type_param_list[] = {
{ SPA_PARAM_LIST_START, SPA_TYPE_Id, SPA_TYPE_INFO_PARAM_LIST_BASE, spa_type_param },
{ SPA_PARAM_LIST_id, SPA_TYPE_Id, SPA_TYPE_INFO_PARAM_LIST_BASE "id", spa_type_param },
{ 0, 0, NULL, NULL },
};
#define SPA_TYPE_INFO_Props SPA_TYPE_INFO_PARAM_BASE "Props"
#define SPA_TYPE_INFO_PROPS_BASE SPA_TYPE_INFO_Props ":"

View file

@ -72,6 +72,19 @@ struct spa_fraction {
uint32_t denom;
};
struct spa_param_info {
uint32_t id;
#define SPA_PARAM_INFO_SERIAL (1<<0) /**< bit to signal update even when the
* read/write flags don't change */
#define SPA_PARAM_INFO_READ (1<<1)
#define SPA_PARAM_INFO_WRITE (1<<2)
#define SPA_PARAM_INFO_READWRITE (SPA_PARAM_INFO_WRITE|SPA_PARAM_INFO_READ)
uint32_t flags;
uint32_t padding[6];
};
#define SPA_PARAM_INFO(id,flags) (struct spa_param_info){ (id), (flags) }
#define SPA_N_ELEMENTS(arr) (sizeof(arr) / sizeof((arr)[0]))
#define SPA_MIN(a,b) \

View file

@ -123,7 +123,6 @@ static const struct spa_type_info spa_types[] = {
{ SPA_TYPE_OBJECT_START, SPA_TYPE_Object, SPA_TYPE_INFO_Object, NULL },
{ SPA_TYPE_OBJECT_MonitorItem, SPA_TYPE_Object, SPA_TYPE_INFO_MonitorItem, spa_type_monitor_item },
{ SPA_TYPE_OBJECT_ParamList, SPA_TYPE_Object, SPA_TYPE_INFO_PARAM_List, spa_type_param_list, },
{ SPA_TYPE_OBJECT_PropInfo, SPA_TYPE_Object, SPA_TYPE_INFO_PropInfo, spa_type_prop_info, },
{ SPA_TYPE_OBJECT_Props, SPA_TYPE_Object, SPA_TYPE_INFO_Props, spa_type_props },
{ SPA_TYPE_OBJECT_Format, SPA_TYPE_Object, SPA_TYPE_INFO_Format, spa_type_format },

View file

@ -94,7 +94,6 @@ enum {
/* Objects */
SPA_TYPE_OBJECT_START = 0x50000,
SPA_TYPE_OBJECT_MonitorItem,
SPA_TYPE_OBJECT_ParamList,
SPA_TYPE_OBJECT_PropInfo,
SPA_TYPE_OBJECT_Props,
SPA_TYPE_OBJECT_Format,