--- man/pactl.1.xml.in | 6 ++++ shell-completion/bash/pulseaudio | 3 +- shell-completion/zsh/_pulseaudio | 1 + src/utils/pactl.c | 63 ++++++++++++++++++++++++++++++++++++++-- 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/man/pactl.1.xml.in b/man/pactl.1.xml.in index c2064ca..6b93661 100644 --- a/man/pactl.1.xml.in +++ b/man/pactl.1.xml.in @@ -250,6 +250,12 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. <optdesc><p>Subscribe to events, pactl does not exit by itself, but keeps waiting for new events.</p></optdesc> </option> + <option> + <p><opt>device-manager-list-devices</opt></p> + <optdesc><p>List all entries in the device-manager database. This command + works only if module-device-manager is loaded.</p></optdesc> + </option> + </section> <section name="Authors"> diff --git a/shell-completion/bash/pulseaudio b/shell-completion/bash/pulseaudio index 4d7e0b8..ac06603 100644 --- a/shell-completion/bash/pulseaudio +++ b/shell-completion/bash/pulseaudio @@ -120,7 +120,8 @@ _pactl() { set-source-port set-sink-volume set-source-volume set-sink-input-volume set-source-output-volume set-sink-mute set-source-mute set-sink-input-mute set-source-output-mute - set-sink-formats set-port-latency-offset subscribe help) + set-sink-formats set-port-latency-offset subscribe help + device-manager-list-devices) _init_completion -n = || return preprev=${words[$cword-2]} diff --git a/shell-completion/zsh/_pulseaudio b/shell-completion/zsh/_pulseaudio index c7d68f5..908e49d 100644 --- a/shell-completion/zsh/_pulseaudio +++ b/shell-completion/zsh/_pulseaudio @@ -264,6 +264,7 @@ _pactl_completion() { 'set-source-output-mute: mute a recording stream' 'set-sink-formats: set supported formats of a sink' 'subscribe: subscribe to events' + 'device-manager-list-devices: list devices in the device-manager database' ) _describe 'pactl commands' _pactl_commands diff --git a/src/utils/pactl.c b/src/utils/pactl.c index a3ff527..ecaa4dc 100644 --- a/src/utils/pactl.c +++ b/src/utils/pactl.c @@ -131,7 +131,8 @@ static enum { SET_SOURCE_OUTPUT_MUTE, SET_SINK_FORMATS, SET_PORT_LATENCY_OFFSET, - SUBSCRIBE + SUBSCRIBE, + DEVICE_MANAGER_LIST_DEVICES, } action = NONE; static void quit(int ret) { @@ -1194,6 +1195,51 @@ static void device_manager_subscribe_callback(pa_context *c, void *userdata) { fflush(stdout); } +static void device_manager_read_callback(pa_context *c, const pa_ext_device_manager_info *info, int is_last, void *userdata) { + char *index_str; + unsigned i; + + pa_assert(c); + + if (is_last < 0) { + pa_log(_("Failed to get device manager information: %s"), pa_strerror(pa_context_errno(c))); + quit(1); + return; + } + + if (is_last) { + complete_action(); + return; + } + + pa_assert(info); + + if (nl) + printf("\n"); + nl = true; + + if (info->index != PA_INVALID_INDEX) + index_str = pa_sprintf_malloc("%u", info->index); + else + index_str = pa_xstrdup(_("(unset)")); + + printf(_("Device %s\n" + "\tDescription: %s\n" + "\tIcon: %s\n" + "\tIndex: %s\n" + "\tRole priorities: %s\n"), + info->name, + info->description ? info->description : _("(unset)"), + info->icon ? info->icon : _("(unset)"), + index_str, + info->n_role_priorities > 0 ? "" : _("(none)")); + + for (i = 0; i < info->n_role_priorities; i++) + printf("\t\t%s: %u\n", info->role_priorities[i].role, info->role_priorities[i].priority); + + pa_xfree(index_str); +} + static void context_state_callback(pa_context *c, void *userdata) { pa_operation *o = NULL; @@ -1439,7 +1485,11 @@ static void context_state_callback(pa_context *c, void *userdata) { break; - default: + case DEVICE_MANAGER_LIST_DEVICES: + o = pa_ext_device_manager_read(c, device_manager_read_callback, NULL); + break; + + case NONE: pa_assert_not_reached(); } @@ -1593,6 +1643,7 @@ static void help(const char *argv0) { printf("%s %s %s %s\n", argv0, _("[options]"), "set-sink-formats", _("#N FORMATS")); printf("%s %s %s %s\n", argv0, _("[options]"), "set-port-latency-offset", _("CARD-NAME|CARD-#N PORT OFFSET")); printf("%s %s %s\n", argv0, _("[options]"), "subscribe"); + printf("%s %s %s\n", argv0, _("[options]"), "device-manager-list-devices"); printf(_("\nThe special names @DEFAULT_SINK@, @DEFAULT_SOURCE@ and @DEFAULT_MONITOR@\n" "can be used to specify the default sink, source and monitor.\n")); @@ -2058,6 +2109,14 @@ int main(int argc, char *argv[]) { goto quit; } + } else if (pa_streq(argv[optind], "device-manager-list-devices")) { + action = DEVICE_MANAGER_LIST_DEVICES; + + if (argc > optind + 1) { + pa_log(_("Too many arguments.")); + goto quit; + } + } else if (pa_streq(argv[optind], "help")) { help(bn); ret = 0; -- 1.9.3