A similar change was made for pa_card_set_profile() in ce304d62087b51ce592e9489381ba49750392f60. --- src/modules/dbus/iface-device-port.c | 6 ++++++ src/modules/dbus/iface-device-port.h | 1 + src/modules/dbus/iface-device.c | 4 ++-- src/modules/module-switch-on-port-available.c | 8 ++++---- src/pulsecore/cli-command.c | 16 ++++++++++++++-- src/pulsecore/protocol-native.c | 11 ++++++++--- src/pulsecore/sink.c | 10 ++-------- src/pulsecore/sink.h | 2 +- src/pulsecore/source.c | 10 ++-------- src/pulsecore/source.h | 2 +- 10 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/modules/dbus/iface-device-port.c b/src/modules/dbus/iface-device-port.c index d403b6a..e8d87cc 100644 --- a/src/modules/dbus/iface-device-port.c +++ b/src/modules/dbus/iface-device-port.c @@ -188,3 +188,9 @@ const char *pa_dbusiface_device_port_get_name(pa_dbusiface_device_port *p) { return p->port->name; } + +pa_device_port *pa_dbusiface_device_port_get_port(pa_dbusiface_device_port *p) { + pa_assert(p); + + return p->port; +} diff --git a/src/modules/dbus/iface-device-port.h b/src/modules/dbus/iface-device-port.h index 0461e2f..1d300c2 100644 --- a/src/modules/dbus/iface-device-port.h +++ b/src/modules/dbus/iface-device-port.h @@ -46,5 +46,6 @@ void pa_dbusiface_device_port_free(pa_dbusiface_device_port *p); const char *pa_dbusiface_device_port_get_path(pa_dbusiface_device_port *p); const char *pa_dbusiface_device_port_get_name(pa_dbusiface_device_port *p); +pa_device_port *pa_dbusiface_device_port_get_port(pa_dbusiface_device_port *p); #endif diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c index 34b370b..c2e1fd7 100644 --- a/src/modules/dbus/iface-device.c +++ b/src/modules/dbus/iface-device.c @@ -753,13 +753,13 @@ static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, DBusM } if (d->type == PA_DEVICE_TYPE_SINK) { - if ((r = pa_sink_set_port(d->sink, pa_dbusiface_device_port_get_name(new_active), true)) < 0) { + if ((r = pa_sink_set_port(d->sink, pa_dbusiface_device_port_get_port(new_active), true)) < 0) { pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Internal error in PulseAudio: pa_sink_set_port() failed with error code %i.", r); return; } } else { - if ((r = pa_source_set_port(d->source, pa_dbusiface_device_port_get_name(new_active), true)) < 0) { + if ((r = pa_source_set_port(d->source, pa_dbusiface_device_port_get_port(new_active), true)) < 0) { pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Internal error in PulseAudio: pa_source_set_port() failed with error code %i.", r); return; diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c index 92730fe..05d88e6 100644 --- a/src/modules/module-switch-on-port-available.c +++ b/src/modules/module-switch-on-port-available.c @@ -196,9 +196,9 @@ static pa_hook_result_t port_available_hook_callback(pa_core *c, pa_device_port } if (source) - pa_source_set_port(source, port->name, false); + pa_source_set_port(source, port, false); if (sink) - pa_sink_set_port(sink, port->name, false); + pa_sink_set_port(sink, port, false); } if (port->available == PA_AVAILABLE_NO) { @@ -206,7 +206,7 @@ static pa_hook_result_t port_available_hook_callback(pa_core *c, pa_device_port pa_device_port *p2 = find_best_port(sink->ports); if (p2 && p2->available != PA_AVAILABLE_NO) - pa_sink_set_port(sink, p2->name, false); + pa_sink_set_port(sink, p2, false); else { /* Maybe try to switch to another profile? */ } @@ -216,7 +216,7 @@ static pa_hook_result_t port_available_hook_callback(pa_core *c, pa_device_port pa_device_port *p2 = find_best_port(source->ports); if (p2 && p2->available != PA_AVAILABLE_NO) - pa_source_set_port(source, p2->name, false); + pa_source_set_port(source, p2, false); else { /* Maybe try to switch to another profile? */ } diff --git a/src/pulsecore/cli-command.c b/src/pulsecore/cli-command.c index d390a74..03512b7 100644 --- a/src/pulsecore/cli-command.c +++ b/src/pulsecore/cli-command.c @@ -1672,6 +1672,7 @@ static int pa_cli_command_card_profile(pa_core *c, pa_tokenizer *t, pa_strbuf *b static int pa_cli_command_sink_port(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { const char *n, *p; pa_sink *sink; + pa_device_port *port; pa_core_assert_ref(c); pa_assert(t); @@ -1693,7 +1694,12 @@ static int pa_cli_command_sink_port(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, return -1; } - if (pa_sink_set_port(sink, p, true) < 0) { + if (!(port = pa_hashmap_get(sink->ports, p))) { + pa_strbuf_printf(buf, "No such port: %s\n", p); + return -1; + } + + if (pa_sink_set_port(sink, port, true) < 0) { pa_strbuf_printf(buf, "Failed to set sink port to '%s'.\n", p); return -1; } @@ -1704,6 +1710,7 @@ static int pa_cli_command_sink_port(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, static int pa_cli_command_source_port(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { const char *n, *p; pa_source *source; + pa_device_port *port; pa_core_assert_ref(c); pa_assert(t); @@ -1725,7 +1732,12 @@ static int pa_cli_command_source_port(pa_core *c, pa_tokenizer *t, pa_strbuf *bu return -1; } - if (pa_source_set_port(source, p, true) < 0) { + if (!(port = pa_hashmap_get(source->ports, p))) { + pa_strbuf_printf(buf, "No such port: %s\n", p); + return -1; + } + + if (pa_source_set_port(source, port, true) < 0) { pa_strbuf_printf(buf, "Failed to set source port to '%s'.\n", p); return -1; } diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c index 88ebcdc..379c4b3 100644 --- a/src/pulsecore/protocol-native.c +++ b/src/pulsecore/protocol-native.c @@ -4747,7 +4747,8 @@ static void command_set_card_profile(pa_pdispatch *pd, uint32_t command, uint32_ static void command_set_sink_or_source_port(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) { pa_native_connection *c = PA_NATIVE_CONNECTION(userdata); uint32_t idx = PA_INVALID_INDEX; - const char *name = NULL, *port = NULL; + const char *name = NULL, *port_name = NULL; + pa_device_port *port; int ret; pa_native_connection_assert_ref(c); @@ -4755,7 +4756,7 @@ static void command_set_sink_or_source_port(pa_pdispatch *pd, uint32_t command, if (pa_tagstruct_getu32(t, &idx) < 0 || pa_tagstruct_gets(t, &name) < 0 || - pa_tagstruct_gets(t, &port) < 0 || + pa_tagstruct_gets(t, &port_name) < 0 || !pa_tagstruct_eof(t)) { protocol_error(c); return; @@ -4764,7 +4765,7 @@ static void command_set_sink_or_source_port(pa_pdispatch *pd, uint32_t command, CHECK_VALIDITY(c->pstream, c->authorized, tag, PA_ERR_ACCESS); CHECK_VALIDITY(c->pstream, !name || pa_namereg_is_valid_name_or_wildcard(name, command == PA_COMMAND_SET_SINK_PORT ? PA_NAMEREG_SINK : PA_NAMEREG_SOURCE), tag, PA_ERR_INVALID); CHECK_VALIDITY(c->pstream, (idx != PA_INVALID_INDEX) ^ (name != NULL), tag, PA_ERR_INVALID); - CHECK_VALIDITY(c->pstream, port, tag, PA_ERR_INVALID); + CHECK_VALIDITY(c->pstream, port_name, tag, PA_ERR_INVALID); if (command == PA_COMMAND_SET_SINK_PORT) { pa_sink *sink; @@ -4775,6 +4776,8 @@ static void command_set_sink_or_source_port(pa_pdispatch *pd, uint32_t command, sink = pa_namereg_get(c->protocol->core, name, PA_NAMEREG_SINK); CHECK_VALIDITY(c->pstream, sink, tag, PA_ERR_NOENTITY); + port = pa_hashmap_get(sink->ports, port_name); + CHECK_VALIDITY(c->pstream, port, tag, PA_ERR_NOENTITY); if ((ret = pa_sink_set_port(sink, port, true)) < 0) { pa_pstream_send_error(c->pstream, tag, -ret); @@ -4791,6 +4794,8 @@ static void command_set_sink_or_source_port(pa_pdispatch *pd, uint32_t command, source = pa_namereg_get(c->protocol->core, name, PA_NAMEREG_SOURCE); CHECK_VALIDITY(c->pstream, source, tag, PA_ERR_NOENTITY); + port = pa_hashmap_get(source->ports, port_name); + CHECK_VALIDITY(c->pstream, port, tag, PA_ERR_NOENTITY); if ((ret = pa_source_set_port(source, port, true)) < 0) { pa_pstream_send_error(c->pstream, tag, -ret); diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 1792538..45dc618 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -3424,12 +3424,12 @@ size_t pa_sink_get_max_request(pa_sink *s) { } /* Called from main context */ -int pa_sink_set_port(pa_sink *s, const char *name, bool save) { - pa_device_port *port; +int pa_sink_set_port(pa_sink *s, pa_device_port *port, bool save) { pa_device_port *old_port; int ret; pa_sink_assert_ref(s); + pa_assert(port); pa_assert_ctl_context(); if (!s->set_port) { @@ -3437,12 +3437,6 @@ int pa_sink_set_port(pa_sink *s, const char *name, bool save) { return -PA_ERR_NOTIMPLEMENTED; } - if (!name) - return -PA_ERR_NOENTITY; - - if (!(port = pa_hashmap_get(s->ports, name))) - return -PA_ERR_NOENTITY; - old_port = s->active_port; if (port == old_port) { diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index 020ee3d..a3bd24b 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -461,7 +461,7 @@ bool pa_sink_get_mute(pa_sink *sink, bool force_refresh); bool pa_sink_update_proplist(pa_sink *s, pa_update_mode_t mode, pa_proplist *p); -int pa_sink_set_port(pa_sink *s, const char *name, bool save); +int pa_sink_set_port(pa_sink *s, pa_device_port *port, bool save); void pa_sink_set_mixer_dirty(pa_sink *s, bool is_dirty); unsigned pa_sink_linked_by(pa_sink *s); /* Number of connected streams */ diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index 0843795..d836ae2 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -2717,12 +2717,12 @@ size_t pa_source_get_max_rewind(pa_source *s) { } /* Called from main context */ -int pa_source_set_port(pa_source *s, const char *name, bool save) { - pa_device_port *port; +int pa_source_set_port(pa_source *s, pa_device_port *port, bool save) { pa_device_port *old_port; int ret; pa_source_assert_ref(s); + pa_assert(port); pa_assert_ctl_context(); if (!s->set_port) { @@ -2730,12 +2730,6 @@ int pa_source_set_port(pa_source *s, const char *name, bool save) { return -PA_ERR_NOTIMPLEMENTED; } - if (!name) - return -PA_ERR_NOENTITY; - - if (!(port = pa_hashmap_get(s->ports, name))) - return -PA_ERR_NOENTITY; - old_port = s->active_port; if (port == old_port) { diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h index fcb52a7..cb8f900 100644 --- a/src/pulsecore/source.h +++ b/src/pulsecore/source.h @@ -395,7 +395,7 @@ bool pa_source_get_mute(pa_source *source, bool force_refresh); bool pa_source_update_proplist(pa_source *s, pa_update_mode_t mode, pa_proplist *p); -int pa_source_set_port(pa_source *s, const char *name, bool save); +int pa_source_set_port(pa_source *s, pa_device_port *port, bool save); void pa_source_set_mixer_dirty(pa_source *s, bool is_dirty); int pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough); -- 1.8.3.1