remote: remove events and states

This commit is contained in:
Wim Taymans 2019-12-06 12:03:45 +01:00
parent 8a959ea7a1
commit 3d79970d88
5 changed files with 5 additions and 158 deletions

View file

@ -93,6 +93,7 @@ int pw_protocol_native_connect_local_socket(struct pw_protocol_client *client,
res = pw_protocol_client_connect_fd(client, fd, true);
if (done_callback)
done_callback(data, res);
return res;

View file

@ -753,11 +753,6 @@ struct pw_remote {
int recv_seq; /**< last received sequence number */
int send_seq; /**< last protocol result code */
enum pw_remote_state state;
char *error;
struct spa_hook_list listener_list;
void *user_data; /**< extra user data */
};

View file

@ -49,59 +49,6 @@ struct remote {
};
/** \endcond */
SPA_EXPORT
const char *pw_remote_state_as_string(enum pw_remote_state state)
{
switch (state) {
case PW_REMOTE_STATE_ERROR:
return "error";
case PW_REMOTE_STATE_UNCONNECTED:
return "unconnected";
case PW_REMOTE_STATE_CONNECTING:
return "connecting";
case PW_REMOTE_STATE_CONNECTED:
return "connected";
}
return "invalid-state";
}
static int
pw_remote_update_state(struct pw_remote *remote, enum pw_remote_state state, const char *fmt, ...)
{
enum pw_remote_state old = remote->state;
if (old != state) {
free(remote->error);
if (fmt) {
va_list varargs;
va_start(varargs, fmt);
if (vasprintf(&remote->error, fmt, varargs) < 0) {
pw_log_debug(NAME" %p: error formating message: %m", remote);
remote->error = NULL;
}
va_end(varargs);
} else {
remote->error = NULL;
}
if (state == PW_REMOTE_STATE_ERROR) {
pw_log_error(NAME" %p: update state from %s -> %s (%s)", remote,
pw_remote_state_as_string(old),
pw_remote_state_as_string(state), remote->error);
} else {
pw_log_debug(NAME" %p: update state from %s -> %s", remote,
pw_remote_state_as_string(old),
pw_remote_state_as_string(state));
}
remote->state = state;
pw_remote_emit_state_changed(remote, old, state, remote->error);
}
return 0;
}
static void core_event_ping(void *data, uint32_t id, int seq)
{
struct pw_remote *this = data;
@ -222,15 +169,11 @@ struct pw_remote *pw_remote_new(struct pw_core *core,
pw_fill_remote_properties(core, properties);
this->properties = properties;
this->state = PW_REMOTE_STATE_UNCONNECTED;
pw_map_init(&this->objects, 64, 32);
spa_list_init(&this->stream_list);
spa_list_init(&this->filter_list);
spa_hook_list_init(&this->listener_list);
if ((protocol_name = pw_properties_get(properties, PW_KEY_PROTOCOL)) == NULL) {
if ((protocol_name = pw_properties_get(core->properties, PW_KEY_PROTOCOL)) == NULL) {
protocol_name = PW_TYPE_INFO_PROTOCOL_Native;
@ -284,9 +227,7 @@ void pw_remote_destroy(struct pw_remote *remote)
struct pw_filter *filter;
pw_log_debug(NAME" %p: destroy", remote);
pw_remote_emit_destroy(remote);
if (remote->state != PW_REMOTE_STATE_UNCONNECTED)
pw_remote_disconnect(remote);
spa_list_consume(stream, &remote->stream_list, link)
@ -302,7 +243,6 @@ void pw_remote_destroy(struct pw_remote *remote)
pw_log_debug(NAME" %p: free", remote);
pw_properties_free(remote->properties);
free(remote->error);
free(impl);
}
@ -342,23 +282,6 @@ void *pw_remote_get_user_data(struct pw_remote *remote)
return remote->user_data;
}
SPA_EXPORT
enum pw_remote_state pw_remote_get_state(struct pw_remote *remote, const char **error)
{
if (error)
*error = remote->error;
return remote->state;
}
SPA_EXPORT
void pw_remote_add_listener(struct pw_remote *remote,
struct spa_hook *listener,
const struct pw_remote_events *events,
void *data)
{
spa_hook_list_append(&remote->listener_list, listener, events, data);
}
static void core_proxy_destroy(void *data)
{
struct pw_remote *remote = data;
@ -418,19 +341,9 @@ static int init_connect(struct pw_remote *remote)
error_clean_core_proxy:
pw_proxy_remove((struct pw_proxy*)remote->core_proxy);
error:
pw_remote_update_state(remote, PW_REMOTE_STATE_ERROR, "can't connect: %s", spa_strerror(res));
return res;
}
static int
do_connect(struct spa_loop *loop,
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
{
struct pw_remote *remote = user_data;
pw_remote_update_state(remote, PW_REMOTE_STATE_CONNECTED, NULL);
return 0;
}
SPA_EXPORT
struct pw_core_proxy * pw_remote_get_core_proxy(struct pw_remote *remote)
{
@ -449,37 +362,20 @@ struct pw_proxy *pw_remote_find_proxy(struct pw_remote *remote, uint32_t id)
return pw_map_lookup(&remote->objects, id);
}
static void done_connect(void *data, int result)
{
struct pw_remote *remote = data;
if (result < 0) {
pw_remote_update_state(remote, PW_REMOTE_STATE_ERROR, "can't connect: %s",
spa_strerror(result));
return;
}
pw_loop_invoke(remote->core->main_loop,
do_connect, 0, NULL, 0, false, remote);
}
SPA_EXPORT
int pw_remote_connect(struct pw_remote *remote)
{
int res;
pw_remote_update_state(remote, PW_REMOTE_STATE_CONNECTING, NULL);
if ((res = init_connect(remote)) < 0)
goto error;
if ((res = pw_protocol_client_connect(remote->conn,
&remote->properties->dict,
done_connect, remote)) < 0)
NULL, NULL)) < 0)
goto error;
return remote->state == PW_REMOTE_STATE_ERROR ? -EIO : 0;
error:
pw_remote_update_state(remote, PW_REMOTE_STATE_ERROR,
"connect failed %d: %s", res, spa_strerror(res));
return res;
}
@ -488,21 +384,13 @@ int pw_remote_connect_fd(struct pw_remote *remote, int fd)
{
int res;
pw_remote_update_state(remote, PW_REMOTE_STATE_CONNECTING, NULL);
if ((res = init_connect(remote)) < 0)
goto error;
if ((res = pw_protocol_client_connect_fd(remote->conn, fd, true)) < 0)
goto error;
pw_loop_invoke(remote->core->main_loop,
do_connect, 0, NULL, 0, false, remote);
return remote->state == PW_REMOTE_STATE_ERROR ? -EIO : 0;
error:
pw_remote_update_state(remote, PW_REMOTE_STATE_ERROR,
"connect_fd failed %d: %s", res, spa_strerror(res));
return res;
}
@ -510,10 +398,7 @@ SPA_EXPORT
int pw_remote_steal_fd(struct pw_remote *remote)
{
int fd;
fd = pw_protocol_client_steal_fd(remote->conn);
if (fd >= 0)
pw_remote_update_state(remote, PW_REMOTE_STATE_UNCONNECTED, NULL);
return fd;
}
@ -538,8 +423,6 @@ int pw_remote_disconnect(struct pw_remote *remote)
remote->client_proxy = NULL;
pw_remote_update_state(remote, PW_REMOTE_STATE_UNCONNECTED, NULL);
pw_map_for_each(&remote->objects, destroy_proxy, remote);
pw_map_reset(&remote->objects);

View file

@ -116,29 +116,6 @@ struct pw_remote;
#include <pipewire/node.h>
#include <pipewire/proxy.h>
/** \enum pw_remote_state The state of a \ref pw_remote \memberof pw_remote */
enum pw_remote_state {
PW_REMOTE_STATE_ERROR = -1, /**< remote is in error */
PW_REMOTE_STATE_UNCONNECTED = 0, /**< not connected */
PW_REMOTE_STATE_CONNECTING = 1, /**< connecting to remote PipeWire */
PW_REMOTE_STATE_CONNECTED = 2, /**< remote is connected and ready */
};
/** Convert a \ref pw_remote_state to a readable string \memberof pw_remote */
const char *pw_remote_state_as_string(enum pw_remote_state state);
/** Events for the remote. use \ref pw_remote_add_listener */
struct pw_remote_events {
#define PW_VERSION_REMOTE_EVENTS 0
uint32_t version;
/** The remote is destroyed */
void (*destroy) (void *data);
/** emited when the state changes */
void (*state_changed) (void *data, enum pw_remote_state old,
enum pw_remote_state state, const char *error);
};
/** Create a new unconnected remote \memberof pw_remote
* \return a new unconnected remote */
struct pw_remote *
@ -162,15 +139,6 @@ int pw_remote_update_properties(struct pw_remote *remote, const struct spa_dict
/** Get the user_data. The size was given in \ref pw_remote_new */
void *pw_remote_get_user_data(struct pw_remote *remote);
/** Get the current state, \a error is set when state is \ref PW_REMOTE_STATE_ERROR */
enum pw_remote_state pw_remote_get_state(struct pw_remote *remote, const char **error);
/** Add listener for events */
void pw_remote_add_listener(struct pw_remote *remote,
struct spa_hook *listener,
const struct pw_remote_events *events,
void *data);
/** Connect to a remote PipeWire \memberof pw_remote
* \return 0 on success, < 0 on error */
int pw_remote_connect(struct pw_remote *remote);

View file

@ -4,7 +4,7 @@ test_apps = [
'test-core',
'test-interfaces',
'test-properties',
'test-remote',
# 'test-remote',
'test-stream',
'test-utils'
]