diff options
Diffstat (limited to 'src/tools/pipewire-cli.c')
-rw-r--r-- | src/tools/pipewire-cli.c | 92 |
1 files changed, 40 insertions, 52 deletions
diff --git a/src/tools/pipewire-cli.c b/src/tools/pipewire-cli.c index 4b880f2c..9c360c9e 100644 --- a/src/tools/pipewire-cli.c +++ b/src/tools/pipewire-cli.c @@ -28,6 +28,7 @@ #include <signal.h> #include <string.h> +#include <spa/utils/result.h> #include <spa/debug/pod.h> #include <spa/debug/format.h> @@ -71,12 +72,11 @@ struct remote_data { char *name; uint32_t id; - struct pw_remote *remote; - struct spa_hook remote_listener; int prompt_pending; struct pw_core_proxy *core_proxy; struct spa_hook core_listener; + struct spa_hook core_proxy_listener; struct pw_registry_proxy *registry_proxy; struct spa_hook registry_listener; @@ -370,71 +370,51 @@ static const struct pw_registry_proxy_events registry_events = { .global_remove = registry_event_global_remove, }; -static void on_remote_destroy(void *_data) +static void on_core_error(void *_data, uint32_t id, int seq, int res, const char *message) { struct remote_data *rd = _data; struct data *data = rd->data; - spa_list_remove(&rd->link); - - pw_map_remove(&data->vars, rd->id); - pw_map_for_each(&rd->globals, destroy_global, rd); + pw_log_error("remote %p: error id:%u seq:%d res:%d (%s): %s", rd, + id, seq, res, spa_strerror(res), message); - if (data->current == rd) - data->current = NULL; - free(rd->name); + if (id == 0) { + pw_main_loop_quit(data->loop); + } } static const struct pw_core_proxy_events remote_core_events = { - PW_VERSION_CORE_EVENTS, + PW_VERSION_CORE_PROXY_EVENTS, .info = on_core_info, .done = on_core_done, + .error = on_core_error, }; -static void on_state_changed(void *_data, enum pw_remote_state old, - enum pw_remote_state state, const char *error) +static void on_core_destroy(void *_data) { struct remote_data *rd = _data; struct data *data = rd->data; - switch (state) { - case PW_REMOTE_STATE_ERROR: - fprintf(stderr, "remote %d error: %s\n", rd->id, error); - pw_main_loop_quit(data->loop); - break; + spa_list_remove(&rd->link); - case PW_REMOTE_STATE_CONNECTED: - fprintf(stdout, "remote %d state: \"%s\"\n", rd->id, pw_remote_state_as_string(state)); - rd->core_proxy = pw_remote_get_core_proxy(rd->remote); - pw_core_proxy_add_listener(rd->core_proxy, - &rd->core_listener, - &remote_core_events, rd); - rd->registry_proxy = pw_core_proxy_get_registry(rd->core_proxy, - PW_VERSION_REGISTRY_PROXY, 0); - pw_registry_proxy_add_listener(rd->registry_proxy, - &rd->registry_listener, - ®istry_events, rd); - rd->prompt_pending = pw_core_proxy_sync(rd->core_proxy, 0, 0); - break; + pw_map_remove(&data->vars, rd->id); + pw_map_for_each(&rd->globals, destroy_global, rd); - default: - fprintf(stdout, "remote %d state: \"%s\"\n", rd->id, pw_remote_state_as_string(state)); - break; - } + if (data->current == rd) + data->current = NULL; + free(rd->name); } -static const struct pw_remote_events remote_events = { - PW_VERSION_REMOTE_EVENTS, - .destroy = on_remote_destroy, - .state_changed = on_state_changed, +static const struct pw_proxy_events core_proxy_events = { + PW_VERSION_PROXY_EVENTS, + .destroy = on_core_destroy, }; - static bool do_connect(struct data *data, const char *cmd, char *args, char **error) { char *a[1]; int n; - struct pw_remote *remote; + struct pw_core_proxy *core; struct pw_properties *props = NULL; struct remote_data *rd; @@ -442,21 +422,30 @@ static bool do_connect(struct data *data, const char *cmd, char *args, char **er if (n == 1) { props = pw_properties_new(PW_KEY_REMOTE_NAME, a[0], NULL); } - remote = pw_remote_new(data->core, props, sizeof(struct remote_data)); + core = pw_core_connect(data->core, props, sizeof(struct remote_data)); - rd = pw_remote_get_user_data(remote); - rd->remote = remote; + rd = pw_proxy_get_user_data((struct pw_proxy*)core); + rd->core_proxy = core; rd->data = data; pw_map_init(&rd->globals, 64, 16); rd->id = pw_map_insert_new(&data->vars, rd); spa_list_append(&data->remotes, &rd->link); - fprintf(stdout, "%d = @remote:%p\n", rd->id, remote); + fprintf(stdout, "%d = @core_proxy:%p\n", rd->id, core); data->current = rd; - pw_remote_add_listener(remote, &rd->remote_listener, &remote_events, rd); - if (pw_remote_connect(remote) < 0) - return false; + pw_core_proxy_add_listener(rd->core_proxy, + &rd->core_listener, + &remote_core_events, rd); + pw_proxy_add_listener((struct pw_proxy*)rd->core_proxy, + &rd->core_proxy_listener, + &core_proxy_events, rd); + rd->registry_proxy = pw_core_proxy_get_registry(rd->core_proxy, + PW_VERSION_REGISTRY_PROXY, 0); + pw_registry_proxy_add_listener(rd->registry_proxy, + &rd->registry_listener, + ®istry_events, rd); + rd->prompt_pending = pw_core_proxy_sync(rd->core_proxy, 0, 0); return true; } @@ -476,8 +465,7 @@ static bool do_disconnect(struct data *data, const char *cmd, char *args, char * goto no_remote; } - pw_remote_disconnect(rd->remote); - pw_remote_destroy(rd->remote); + pw_core_proxy_disconnect(rd->core_proxy); if (data->current == NULL) { if (spa_list_is_empty(&data->remotes)) { @@ -498,7 +486,7 @@ static bool do_list_remotes(struct data *data, const char *cmd, char *args, char struct remote_data *rd; spa_list_for_each(rd, &data->remotes, link) - fprintf(stdout, "\t%d = @remote:%p '%s'\n", rd->id, rd->remote, rd->name); + fprintf(stdout, "\t%d = @core_proxy:%p '%s'\n", rd->id, rd->core_proxy, rd->name); return true; } @@ -1428,7 +1416,7 @@ static bool do_export_node(struct data *data, const char *cmd, char *args, char return false; } node = pw_global_get_object(global); - proxy = pw_remote_export(rd->remote, PW_TYPE_INTERFACE_Node, NULL, node, 0); + proxy = pw_core_proxy_export(rd->core_proxy, PW_TYPE_INTERFACE_Node, NULL, node, 0); id = pw_map_insert_new(&data->vars, proxy); fprintf(stdout, "%d = @proxy:%d\n", id, pw_proxy_get_id((struct pw_proxy*)proxy)); |