mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
pulse-server: add move and default sink/source
Clean up error handling, use errno everywhere and convert when needed.
This commit is contained in:
parent
686128a5dd
commit
c619d7851f
4 changed files with 433 additions and 404 deletions
|
|
@ -81,6 +81,31 @@ enum error_code {
|
|||
ERR_MAX /**< Not really an error but the first invalid error code */
|
||||
};
|
||||
|
||||
static inline int res_to_err(int res)
|
||||
{
|
||||
switch (res) {
|
||||
case 0: return ERR_OK;
|
||||
case -EACCES: return ERR_ACCESS;
|
||||
case -ENOTTY: return ERR_COMMAND;
|
||||
case -EINVAL: return ERR_INVALID;
|
||||
case -EEXIST: return ERR_EXIST;
|
||||
case -ENOENT: return ERR_NOENTITY;
|
||||
case -ECONNREFUSED: return ERR_CONNECTIONREFUSED;
|
||||
case -EPROTO: return ERR_PROTOCOL;
|
||||
case -ETIMEDOUT: return ERR_TIMEOUT;
|
||||
case -ENOKEY: return ERR_AUTHKEY;
|
||||
case -ECONNRESET: return ERR_CONNECTIONTERMINATED;
|
||||
case -EBADFD: return ERR_BADSTATE;
|
||||
case -ENODATA: return ERR_NODATA;
|
||||
case -EOVERFLOW: return ERR_TOOLARGE;
|
||||
case -ENOTSUP: return ERR_NOTSUPPORTED;
|
||||
case -ENOSYS: return ERR_NOTIMPLEMENTED;
|
||||
case -EIO: return ERR_IO;
|
||||
case -EBUSY: return ERR_BUSY;
|
||||
}
|
||||
return ERR_UNKNOWN;
|
||||
}
|
||||
|
||||
enum {
|
||||
/* Generic commands */
|
||||
COMMAND_ERROR,
|
||||
|
|
@ -366,3 +391,7 @@ static uint32_t port_type_value(const char *port_type)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define METADATA_DEFAULT_SINK "default.audio.sink"
|
||||
#define METADATA_DEFAULT_SOURCE "default.audio.source"
|
||||
#define METADATA_TARGET_NODE "target.node"
|
||||
|
|
|
|||
|
|
@ -33,6 +33,8 @@
|
|||
#define manager_emit_removed(m,o) spa_hook_list_call(&m->hooks, struct pw_manager_events, removed, 0, o)
|
||||
#define manager_emit_metadata(m,s,k,t,v) spa_hook_list_call(&m->hooks, struct pw_manager_events, metadata,0,s,k,t,v)
|
||||
|
||||
struct object;
|
||||
|
||||
struct manager {
|
||||
struct pw_manager this;
|
||||
|
||||
|
|
@ -40,6 +42,8 @@ struct manager {
|
|||
struct spa_hook registry_listener;
|
||||
int sync_seq;
|
||||
|
||||
struct object *metadata;
|
||||
|
||||
struct spa_hook_list hooks;
|
||||
};
|
||||
|
||||
|
|
@ -47,7 +51,8 @@ struct object_info {
|
|||
const char *type;
|
||||
uint32_t version;
|
||||
const void *events;
|
||||
void (*destroy) (void *object);
|
||||
void (*init) (struct object *object);
|
||||
void (*destroy) (struct object *object);
|
||||
};
|
||||
|
||||
struct object {
|
||||
|
|
@ -131,6 +136,12 @@ static void object_destroy(struct object *o)
|
|||
free(o);
|
||||
}
|
||||
|
||||
/* core */
|
||||
static const struct object_info core_info = {
|
||||
.type = PW_TYPE_INTERFACE_Core,
|
||||
.version = PW_VERSION_CORE,
|
||||
};
|
||||
|
||||
/* client */
|
||||
static void client_event_info(void *object, const struct pw_client_info *info)
|
||||
{
|
||||
|
|
@ -155,9 +166,8 @@ static const struct pw_client_events client_events = {
|
|||
.info = client_event_info,
|
||||
};
|
||||
|
||||
static void client_destroy(void *data)
|
||||
static void client_destroy(struct object *o)
|
||||
{
|
||||
struct object *o = data;
|
||||
if (o->this.info)
|
||||
pw_client_info_free(o->this.info);
|
||||
}
|
||||
|
|
@ -193,9 +203,8 @@ static const struct pw_module_events module_events = {
|
|||
.info = module_event_info,
|
||||
};
|
||||
|
||||
static void module_destroy(void *data)
|
||||
static void module_destroy(struct object *o)
|
||||
{
|
||||
struct object *o = data;
|
||||
if (o->this.info)
|
||||
pw_module_info_free(o->this.info);
|
||||
}
|
||||
|
|
@ -257,9 +266,8 @@ static const struct pw_device_events device_events = {
|
|||
.param = device_event_param,
|
||||
};
|
||||
|
||||
static void device_destroy(void *data)
|
||||
static void device_destroy(struct object *o)
|
||||
{
|
||||
struct object *o = data;
|
||||
if (o->this.info)
|
||||
pw_device_info_free(o->this.info);
|
||||
}
|
||||
|
|
@ -324,9 +332,8 @@ static const struct pw_node_events node_events = {
|
|||
.param = node_event_param,
|
||||
};
|
||||
|
||||
static void node_destroy(void *data)
|
||||
static void node_destroy(struct object *o)
|
||||
{
|
||||
struct object *o = data;
|
||||
if (o->this.info)
|
||||
pw_node_info_free(o->this.info);
|
||||
}
|
||||
|
|
@ -362,14 +369,31 @@ static const struct pw_metadata_events metadata_events = {
|
|||
.property = metadata_property,
|
||||
};
|
||||
|
||||
static void metadata_init(struct object *o)
|
||||
{
|
||||
struct manager *m = o->manager;
|
||||
if (m->metadata == NULL)
|
||||
m->metadata = o;
|
||||
}
|
||||
|
||||
static void metadata_destroy(struct object *o)
|
||||
{
|
||||
struct manager *m = o->manager;
|
||||
if (m->metadata == o)
|
||||
m->metadata = NULL;
|
||||
}
|
||||
|
||||
static const struct object_info metadata_info = {
|
||||
.type = PW_TYPE_INTERFACE_Metadata,
|
||||
.version = PW_VERSION_METADATA,
|
||||
.events = &metadata_events,
|
||||
.init = metadata_init,
|
||||
.destroy = metadata_destroy,
|
||||
};
|
||||
|
||||
static const struct object_info *objects[] =
|
||||
{
|
||||
&core_info,
|
||||
&module_info,
|
||||
&client_info,
|
||||
&device_info,
|
||||
|
|
@ -459,6 +483,9 @@ static void registry_event_global(void *data, uint32_t id,
|
|||
&o->proxy_listener,
|
||||
&proxy_events, o);
|
||||
|
||||
if (info->init)
|
||||
info->init(o);
|
||||
|
||||
core_sync(m);
|
||||
}
|
||||
|
||||
|
|
@ -541,16 +568,32 @@ void pw_manager_add_listener(struct pw_manager *manager,
|
|||
core_sync(m);
|
||||
}
|
||||
|
||||
struct pw_manager_object *pw_manager_find_object(struct pw_manager *manager,
|
||||
uint32_t id)
|
||||
int pw_manager_set_metadata(struct pw_manager *manager,
|
||||
uint32_t subject, const char *key, const char *type,
|
||||
const char *format, ...)
|
||||
{
|
||||
struct manager *m = SPA_CONTAINER_OF(manager, struct manager, this);
|
||||
struct object *o;
|
||||
struct object *s;
|
||||
va_list args;
|
||||
char buf[1024];
|
||||
|
||||
o = find_object(m, id);
|
||||
if (o == NULL)
|
||||
return NULL;
|
||||
return (struct pw_manager_object*)o;
|
||||
if ((s = find_object(m, subject)) == NULL)
|
||||
return -ENOENT;
|
||||
if (!SPA_FLAG_IS_SET(s->this.permissions, PW_PERM_M))
|
||||
return -EACCES;
|
||||
|
||||
if (m->metadata == NULL)
|
||||
return -ENOTSUP;
|
||||
if (!SPA_FLAG_IS_SET(m->metadata->this.permissions, PW_PERM_W|PW_PERM_X))
|
||||
return -EACCES;
|
||||
|
||||
va_start(args, format);
|
||||
vsnprintf(buf, sizeof(buf)-1, format, args);
|
||||
va_end(args);
|
||||
|
||||
pw_metadata_set_property(m->metadata->this.proxy,
|
||||
subject, key, type, buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pw_manager_for_each_object(struct pw_manager *manager,
|
||||
|
|
|
|||
|
|
@ -90,6 +90,10 @@ void pw_manager_add_listener(struct pw_manager *manager,
|
|||
|
||||
void pw_manager_destroy(struct pw_manager *manager);
|
||||
|
||||
int pw_manager_set_metadata(struct pw_manager *manager,
|
||||
uint32_t subject, const char *key, const char *type,
|
||||
const char *format, ...) SPA_PRINTF_FUNC(5,6);
|
||||
|
||||
int pw_manager_for_each_object(struct pw_manager *manager,
|
||||
int (*callback) (void *data, struct pw_manager_object *object),
|
||||
void *data);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue