153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2004-2006 Lennart Poettering 553a5a1b3Sopenharmony_ci Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB 653a5a1b3Sopenharmony_ci 753a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 853a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 953a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 1053a5a1b3Sopenharmony_ci or (at your option) any later version. 1153a5a1b3Sopenharmony_ci 1253a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1353a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1453a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1553a5a1b3Sopenharmony_ci General Public License for more details. 1653a5a1b3Sopenharmony_ci 1753a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1853a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1953a5a1b3Sopenharmony_ci***/ 2053a5a1b3Sopenharmony_ci 2153a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2253a5a1b3Sopenharmony_ci#include <config.h> 2353a5a1b3Sopenharmony_ci#endif 2453a5a1b3Sopenharmony_ci 2553a5a1b3Sopenharmony_ci#include <stdio.h> 2653a5a1b3Sopenharmony_ci#include <string.h> 2753a5a1b3Sopenharmony_ci#include <stdlib.h> 2853a5a1b3Sopenharmony_ci#include <errno.h> 2953a5a1b3Sopenharmony_ci#include <unistd.h> 3053a5a1b3Sopenharmony_ci#include <ltdl.h> 3153a5a1b3Sopenharmony_ci#include <sys/stat.h> 3253a5a1b3Sopenharmony_ci#include <dirent.h> 3353a5a1b3Sopenharmony_ci#include <time.h> 3453a5a1b3Sopenharmony_ci#include <fcntl.h> 3553a5a1b3Sopenharmony_ci#include <ctype.h> 3653a5a1b3Sopenharmony_ci 3753a5a1b3Sopenharmony_ci#include <pulse/xmalloc.h> 3853a5a1b3Sopenharmony_ci#include <pulse/error.h> 3953a5a1b3Sopenharmony_ci 4053a5a1b3Sopenharmony_ci#include <pulsecore/module.h> 4153a5a1b3Sopenharmony_ci#include <pulsecore/sink.h> 4253a5a1b3Sopenharmony_ci#include <pulsecore/source.h> 4353a5a1b3Sopenharmony_ci#include <pulsecore/client.h> 4453a5a1b3Sopenharmony_ci#include <pulsecore/sink-input.h> 4553a5a1b3Sopenharmony_ci#include <pulsecore/source-output.h> 4653a5a1b3Sopenharmony_ci#include <pulsecore/tokenizer.h> 4753a5a1b3Sopenharmony_ci#include <pulsecore/strbuf.h> 4853a5a1b3Sopenharmony_ci#include <pulsecore/namereg.h> 4953a5a1b3Sopenharmony_ci#include <pulsecore/cli-text.h> 5053a5a1b3Sopenharmony_ci#include <pulsecore/core-scache.h> 5153a5a1b3Sopenharmony_ci#include <pulsecore/sound-file.h> 5253a5a1b3Sopenharmony_ci#include <pulsecore/play-memchunk.h> 5353a5a1b3Sopenharmony_ci#include <pulsecore/sound-file-stream.h> 5453a5a1b3Sopenharmony_ci#include <pulsecore/shared.h> 5553a5a1b3Sopenharmony_ci#include <pulsecore/core-util.h> 5653a5a1b3Sopenharmony_ci#include <pulsecore/message-handler.h> 5753a5a1b3Sopenharmony_ci#include <pulsecore/core-error.h> 5853a5a1b3Sopenharmony_ci#include <pulsecore/modinfo.h> 5953a5a1b3Sopenharmony_ci#include <pulsecore/dynarray.h> 6053a5a1b3Sopenharmony_ci 6153a5a1b3Sopenharmony_ci#include "cli-command.h" 6253a5a1b3Sopenharmony_ci 6353a5a1b3Sopenharmony_cistruct command { 6453a5a1b3Sopenharmony_ci const char *name; 6553a5a1b3Sopenharmony_ci int (*proc) (pa_core *c, pa_tokenizer*t, pa_strbuf *buf, bool *fail); 6653a5a1b3Sopenharmony_ci const char *help; 6753a5a1b3Sopenharmony_ci unsigned args; 6853a5a1b3Sopenharmony_ci}; 6953a5a1b3Sopenharmony_ci 7053a5a1b3Sopenharmony_ci#define META_INCLUDE ".include" 7153a5a1b3Sopenharmony_ci#define META_FAIL ".fail" 7253a5a1b3Sopenharmony_ci#define META_NOFAIL ".nofail" 7353a5a1b3Sopenharmony_ci#define META_IFEXISTS ".ifexists" 7453a5a1b3Sopenharmony_ci#define META_ELSE ".else" 7553a5a1b3Sopenharmony_ci#define META_ENDIF ".endif" 7653a5a1b3Sopenharmony_ci 7753a5a1b3Sopenharmony_cienum { 7853a5a1b3Sopenharmony_ci IFSTATE_NONE = -1, 7953a5a1b3Sopenharmony_ci IFSTATE_FALSE = 0, 8053a5a1b3Sopenharmony_ci IFSTATE_TRUE = 1, 8153a5a1b3Sopenharmony_ci}; 8253a5a1b3Sopenharmony_ci 8353a5a1b3Sopenharmony_ci/* Prototypes for all available commands */ 8453a5a1b3Sopenharmony_cistatic int pa_cli_command_exit(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 8553a5a1b3Sopenharmony_cistatic int pa_cli_command_help(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 8653a5a1b3Sopenharmony_cistatic int pa_cli_command_modules(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 8753a5a1b3Sopenharmony_cistatic int pa_cli_command_clients(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 8853a5a1b3Sopenharmony_cistatic int pa_cli_command_cards(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 8953a5a1b3Sopenharmony_cistatic int pa_cli_command_sinks(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9053a5a1b3Sopenharmony_cistatic int pa_cli_command_sources(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9153a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_inputs(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9253a5a1b3Sopenharmony_cistatic int pa_cli_command_source_outputs(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9353a5a1b3Sopenharmony_cistatic int pa_cli_command_stat(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9453a5a1b3Sopenharmony_cistatic int pa_cli_command_info(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9553a5a1b3Sopenharmony_cistatic int pa_cli_command_load(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9653a5a1b3Sopenharmony_cistatic int pa_cli_command_unload(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9753a5a1b3Sopenharmony_cistatic int pa_cli_command_describe(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9853a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_volume(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 9953a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_input_volume(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10053a5a1b3Sopenharmony_cistatic int pa_cli_command_source_output_volume(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10153a5a1b3Sopenharmony_cistatic int pa_cli_command_source_volume(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10253a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_mute(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10353a5a1b3Sopenharmony_cistatic int pa_cli_command_source_mute(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10453a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_input_mute(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10553a5a1b3Sopenharmony_cistatic int pa_cli_command_source_output_mute(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10653a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_default(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10753a5a1b3Sopenharmony_cistatic int pa_cli_command_source_default(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10853a5a1b3Sopenharmony_cistatic int pa_cli_command_kill_client(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 10953a5a1b3Sopenharmony_cistatic int pa_cli_command_kill_sink_input(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11053a5a1b3Sopenharmony_cistatic int pa_cli_command_kill_source_output(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11153a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_play(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11253a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_remove(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11353a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_list(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11453a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_load(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11553a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_load_dir(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11653a5a1b3Sopenharmony_cistatic int pa_cli_command_play_file(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11753a5a1b3Sopenharmony_cistatic int pa_cli_command_dump(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11853a5a1b3Sopenharmony_cistatic int pa_cli_command_list_shared_props(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 11953a5a1b3Sopenharmony_cistatic int pa_cli_command_move_sink_input(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12053a5a1b3Sopenharmony_cistatic int pa_cli_command_move_source_output(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12153a5a1b3Sopenharmony_cistatic int pa_cli_command_vacuum(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12253a5a1b3Sopenharmony_cistatic int pa_cli_command_suspend_sink(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12353a5a1b3Sopenharmony_cistatic int pa_cli_command_suspend_source(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12453a5a1b3Sopenharmony_cistatic int pa_cli_command_suspend(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12553a5a1b3Sopenharmony_cistatic int pa_cli_command_log_target(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12653a5a1b3Sopenharmony_cistatic int pa_cli_command_log_level(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12753a5a1b3Sopenharmony_cistatic int pa_cli_command_log_meta(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12853a5a1b3Sopenharmony_cistatic int pa_cli_command_log_time(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 12953a5a1b3Sopenharmony_cistatic int pa_cli_command_log_backtrace(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13053a5a1b3Sopenharmony_cistatic int pa_cli_command_update_sink_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13153a5a1b3Sopenharmony_cistatic int pa_cli_command_update_source_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13253a5a1b3Sopenharmony_cistatic int pa_cli_command_update_sink_input_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13353a5a1b3Sopenharmony_cistatic int pa_cli_command_update_source_output_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13453a5a1b3Sopenharmony_cistatic int pa_cli_command_card_profile(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13553a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_port(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13653a5a1b3Sopenharmony_cistatic int pa_cli_command_source_port(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13753a5a1b3Sopenharmony_cistatic int pa_cli_command_port_offset(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13853a5a1b3Sopenharmony_cistatic int pa_cli_command_dump_volumes(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 13953a5a1b3Sopenharmony_cistatic int pa_cli_command_send_message_to_object(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail); 14053a5a1b3Sopenharmony_ci 14153a5a1b3Sopenharmony_ci/* A method table for all available commands */ 14253a5a1b3Sopenharmony_ci 14353a5a1b3Sopenharmony_cistatic const struct command commands[] = { 14453a5a1b3Sopenharmony_ci { "help", pa_cli_command_help, "Show this help", 1 }, 14553a5a1b3Sopenharmony_ci { "list-modules", pa_cli_command_modules, "List loaded modules", 1 }, 14653a5a1b3Sopenharmony_ci { "list-cards", pa_cli_command_cards, "List cards", 1 }, 14753a5a1b3Sopenharmony_ci { "list-sinks", pa_cli_command_sinks, "List loaded sinks", 1 }, 14853a5a1b3Sopenharmony_ci { "list-sources", pa_cli_command_sources, "List loaded sources", 1 }, 14953a5a1b3Sopenharmony_ci { "list-clients", pa_cli_command_clients, "List loaded clients", 1 }, 15053a5a1b3Sopenharmony_ci { "list-sink-inputs", pa_cli_command_sink_inputs, "List sink inputs", 1 }, 15153a5a1b3Sopenharmony_ci { "list-source-outputs", pa_cli_command_source_outputs, "List source outputs", 1 }, 15253a5a1b3Sopenharmony_ci { "stat", pa_cli_command_stat, "Show memory block statistics", 1 }, 15353a5a1b3Sopenharmony_ci { "info", pa_cli_command_info, "Show comprehensive status", 1 }, 15453a5a1b3Sopenharmony_ci { "ls", pa_cli_command_info, NULL, 1 }, 15553a5a1b3Sopenharmony_ci { "list", pa_cli_command_info, NULL, 1 }, 15653a5a1b3Sopenharmony_ci { "load-module", pa_cli_command_load, "Load a module (args: name, arguments)", 3}, 15753a5a1b3Sopenharmony_ci { "unload-module", pa_cli_command_unload, "Unload a module (args: index|name)", 2}, 15853a5a1b3Sopenharmony_ci { "describe-module", pa_cli_command_describe, "Describe a module (arg: name)", 2}, 15953a5a1b3Sopenharmony_ci { "set-sink-volume", pa_cli_command_sink_volume, "Set the volume of a sink (args: index|name, volume)", 3}, 16053a5a1b3Sopenharmony_ci { "set-source-volume", pa_cli_command_source_volume, "Set the volume of a source (args: index|name, volume)", 3}, 16153a5a1b3Sopenharmony_ci { "set-sink-mute", pa_cli_command_sink_mute, "Set the mute switch of a sink (args: index|name, bool)", 3}, 16253a5a1b3Sopenharmony_ci { "set-source-mute", pa_cli_command_source_mute, "Set the mute switch of a source (args: index|name, bool)", 3}, 16353a5a1b3Sopenharmony_ci { "set-sink-input-volume", pa_cli_command_sink_input_volume, "Set the volume of a sink input (args: index, volume)", 3}, 16453a5a1b3Sopenharmony_ci { "set-source-output-volume",pa_cli_command_source_output_volume,"Set the volume of a source output (args: index, volume)", 3}, 16553a5a1b3Sopenharmony_ci { "set-sink-input-mute", pa_cli_command_sink_input_mute, "Set the mute switch of a sink input (args: index, bool)", 3}, 16653a5a1b3Sopenharmony_ci { "set-source-output-mute", pa_cli_command_source_output_mute, "Set the mute switch of a source output (args: index, bool)", 3}, 16753a5a1b3Sopenharmony_ci { "set-default-sink", pa_cli_command_sink_default, "Set the default sink (args: index|name)", 2}, 16853a5a1b3Sopenharmony_ci { "set-default-source", pa_cli_command_source_default, "Set the default source (args: index|name)", 2}, 16953a5a1b3Sopenharmony_ci { "set-card-profile", pa_cli_command_card_profile, "Change the profile of a card (args: index|name, profile-name)", 3}, 17053a5a1b3Sopenharmony_ci { "set-sink-port", pa_cli_command_sink_port, "Change the port of a sink (args: index|name, port-name)", 3}, 17153a5a1b3Sopenharmony_ci { "set-source-port", pa_cli_command_source_port, "Change the port of a source (args: index|name, port-name)", 3}, 17253a5a1b3Sopenharmony_ci { "set-port-latency-offset", pa_cli_command_port_offset, "Change the latency of a port (args: card-index|card-name, port-name, latency-offset)", 4}, 17353a5a1b3Sopenharmony_ci { "suspend-sink", pa_cli_command_suspend_sink, "Suspend sink (args: index|name, bool)", 3}, 17453a5a1b3Sopenharmony_ci { "suspend-source", pa_cli_command_suspend_source, "Suspend source (args: index|name, bool)", 3}, 17553a5a1b3Sopenharmony_ci { "suspend", pa_cli_command_suspend, "Suspend all sinks and all sources (args: bool)", 2}, 17653a5a1b3Sopenharmony_ci { "move-sink-input", pa_cli_command_move_sink_input, "Move sink input to another sink (args: index, sink)", 3}, 17753a5a1b3Sopenharmony_ci { "move-source-output", pa_cli_command_move_source_output, "Move source output to another source (args: index, source)", 3}, 17853a5a1b3Sopenharmony_ci { "update-sink-proplist", pa_cli_command_update_sink_proplist, "Update the properties of a sink (args: index|name, properties)", 3}, 17953a5a1b3Sopenharmony_ci { "update-source-proplist", pa_cli_command_update_source_proplist, "Update the properties of a source (args: index|name, properties)", 3}, 18053a5a1b3Sopenharmony_ci { "update-sink-input-proplist", pa_cli_command_update_sink_input_proplist, "Update the properties of a sink input (args: index, properties)", 3}, 18153a5a1b3Sopenharmony_ci { "update-source-output-proplist", pa_cli_command_update_source_output_proplist, "Update the properties of a source output (args: index, properties)", 3}, 18253a5a1b3Sopenharmony_ci { "list-samples", pa_cli_command_scache_list, "List all entries in the sample cache", 1}, 18353a5a1b3Sopenharmony_ci { "play-sample", pa_cli_command_scache_play, "Play a sample from the sample cache (args: name, sink|index)", 3}, 18453a5a1b3Sopenharmony_ci { "remove-sample", pa_cli_command_scache_remove, "Remove a sample from the sample cache (args: name)", 2}, 18553a5a1b3Sopenharmony_ci { "load-sample", pa_cli_command_scache_load, "Load a sound file into the sample cache (args: name, filename)", 3}, 18653a5a1b3Sopenharmony_ci { "load-sample-lazy", pa_cli_command_scache_load, "Lazily load a sound file into the sample cache (args: name, filename)", 3}, 18753a5a1b3Sopenharmony_ci { "load-sample-dir-lazy", pa_cli_command_scache_load_dir, "Lazily load all files in a directory into the sample cache (args: pathname)", 2}, 18853a5a1b3Sopenharmony_ci { "kill-client", pa_cli_command_kill_client, "Kill a client (args: index)", 2}, 18953a5a1b3Sopenharmony_ci { "kill-sink-input", pa_cli_command_kill_sink_input, "Kill a sink input (args: index)", 2}, 19053a5a1b3Sopenharmony_ci { "kill-source-output", pa_cli_command_kill_source_output, "Kill a source output (args: index)", 2}, 19153a5a1b3Sopenharmony_ci { "set-log-target", pa_cli_command_log_target, "Change the log target (args: null|auto|syslog|stderr|file:PATH|newfile:PATH)", 2}, 19253a5a1b3Sopenharmony_ci { "set-log-level", pa_cli_command_log_level, "Change the log level (args: numeric level)", 2}, 19353a5a1b3Sopenharmony_ci { "set-log-meta", pa_cli_command_log_meta, "Show source code location in log messages (args: bool)", 2}, 19453a5a1b3Sopenharmony_ci { "set-log-time", pa_cli_command_log_time, "Show timestamps in log messages (args: bool)", 2}, 19553a5a1b3Sopenharmony_ci { "set-log-backtrace", pa_cli_command_log_backtrace, "Show backtrace in log messages (args: frames)", 2}, 19653a5a1b3Sopenharmony_ci { "send-message", pa_cli_command_send_message_to_object, "Send a message to an object (args: recipient, message, message_parameters)", 4}, 19753a5a1b3Sopenharmony_ci { "play-file", pa_cli_command_play_file, "Play a sound file (args: filename, sink|index)", 3}, 19853a5a1b3Sopenharmony_ci { "dump", pa_cli_command_dump, "Dump daemon configuration", 1}, 19953a5a1b3Sopenharmony_ci { "dump-volumes", pa_cli_command_dump_volumes, "Debug: Show the state of all volumes", 1 }, 20053a5a1b3Sopenharmony_ci { "shared", pa_cli_command_list_shared_props, "Debug: Show shared properties", 1}, 20153a5a1b3Sopenharmony_ci { "exit", pa_cli_command_exit, "Terminate the daemon", 1 }, 20253a5a1b3Sopenharmony_ci { "vacuum", pa_cli_command_vacuum, NULL, 1}, 20353a5a1b3Sopenharmony_ci { NULL, NULL, NULL, 0 } 20453a5a1b3Sopenharmony_ci}; 20553a5a1b3Sopenharmony_ci 20653a5a1b3Sopenharmony_cistatic const char whitespace[] = " \t\n\r"; 20753a5a1b3Sopenharmony_cistatic const char linebreak[] = "\n\r"; 20853a5a1b3Sopenharmony_ci 20953a5a1b3Sopenharmony_cistatic uint32_t parse_index(const char *n) { 21053a5a1b3Sopenharmony_ci uint32_t idx; 21153a5a1b3Sopenharmony_ci 21253a5a1b3Sopenharmony_ci if (pa_atou(n, &idx) < 0) 21353a5a1b3Sopenharmony_ci return (uint32_t) PA_IDXSET_INVALID; 21453a5a1b3Sopenharmony_ci 21553a5a1b3Sopenharmony_ci return idx; 21653a5a1b3Sopenharmony_ci} 21753a5a1b3Sopenharmony_ci 21853a5a1b3Sopenharmony_cistatic int pa_cli_command_exit(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 21953a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 22053a5a1b3Sopenharmony_ci pa_assert(t); 22153a5a1b3Sopenharmony_ci pa_assert(buf); 22253a5a1b3Sopenharmony_ci pa_assert(fail); 22353a5a1b3Sopenharmony_ci 22453a5a1b3Sopenharmony_ci if (pa_core_exit(c, false, 0) < 0) 22553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Not allowed to terminate daemon.\n"); 22653a5a1b3Sopenharmony_ci 22753a5a1b3Sopenharmony_ci return 0; 22853a5a1b3Sopenharmony_ci} 22953a5a1b3Sopenharmony_ci 23053a5a1b3Sopenharmony_cistatic int pa_cli_command_help(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 23153a5a1b3Sopenharmony_ci const struct command*command; 23253a5a1b3Sopenharmony_ci 23353a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 23453a5a1b3Sopenharmony_ci pa_assert(t); 23553a5a1b3Sopenharmony_ci pa_assert(buf); 23653a5a1b3Sopenharmony_ci pa_assert(fail); 23753a5a1b3Sopenharmony_ci 23853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Available commands:\n"); 23953a5a1b3Sopenharmony_ci 24053a5a1b3Sopenharmony_ci for (command = commands; command->name; command++) 24153a5a1b3Sopenharmony_ci if (command->help) 24253a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, " %-25s %s\n", command->name, command->help); 24353a5a1b3Sopenharmony_ci return 0; 24453a5a1b3Sopenharmony_ci} 24553a5a1b3Sopenharmony_ci 24653a5a1b3Sopenharmony_cistatic int pa_cli_command_modules(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 24753a5a1b3Sopenharmony_ci char *s; 24853a5a1b3Sopenharmony_ci 24953a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 25053a5a1b3Sopenharmony_ci pa_assert(t); 25153a5a1b3Sopenharmony_ci pa_assert(buf); 25253a5a1b3Sopenharmony_ci pa_assert(fail); 25353a5a1b3Sopenharmony_ci 25453a5a1b3Sopenharmony_ci pa_assert_se(s = pa_module_list_to_string(c)); 25553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, s); 25653a5a1b3Sopenharmony_ci pa_xfree(s); 25753a5a1b3Sopenharmony_ci return 0; 25853a5a1b3Sopenharmony_ci} 25953a5a1b3Sopenharmony_ci 26053a5a1b3Sopenharmony_cistatic int pa_cli_command_clients(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 26153a5a1b3Sopenharmony_ci char *s; 26253a5a1b3Sopenharmony_ci 26353a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 26453a5a1b3Sopenharmony_ci pa_assert(t); 26553a5a1b3Sopenharmony_ci pa_assert(buf); 26653a5a1b3Sopenharmony_ci pa_assert(fail); 26753a5a1b3Sopenharmony_ci 26853a5a1b3Sopenharmony_ci pa_assert_se(s = pa_client_list_to_string(c)); 26953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, s); 27053a5a1b3Sopenharmony_ci pa_xfree(s); 27153a5a1b3Sopenharmony_ci return 0; 27253a5a1b3Sopenharmony_ci} 27353a5a1b3Sopenharmony_ci 27453a5a1b3Sopenharmony_cistatic int pa_cli_command_cards(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 27553a5a1b3Sopenharmony_ci char *s; 27653a5a1b3Sopenharmony_ci 27753a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 27853a5a1b3Sopenharmony_ci pa_assert(t); 27953a5a1b3Sopenharmony_ci pa_assert(buf); 28053a5a1b3Sopenharmony_ci pa_assert(fail); 28153a5a1b3Sopenharmony_ci 28253a5a1b3Sopenharmony_ci pa_assert_se(s = pa_card_list_to_string(c)); 28353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, s); 28453a5a1b3Sopenharmony_ci pa_xfree(s); 28553a5a1b3Sopenharmony_ci return 0; 28653a5a1b3Sopenharmony_ci} 28753a5a1b3Sopenharmony_ci 28853a5a1b3Sopenharmony_cistatic int pa_cli_command_sinks(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 28953a5a1b3Sopenharmony_ci char *s; 29053a5a1b3Sopenharmony_ci 29153a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 29253a5a1b3Sopenharmony_ci pa_assert(t); 29353a5a1b3Sopenharmony_ci pa_assert(buf); 29453a5a1b3Sopenharmony_ci pa_assert(fail); 29553a5a1b3Sopenharmony_ci 29653a5a1b3Sopenharmony_ci pa_assert_se(s = pa_sink_list_to_string(c)); 29753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, s); 29853a5a1b3Sopenharmony_ci pa_xfree(s); 29953a5a1b3Sopenharmony_ci return 0; 30053a5a1b3Sopenharmony_ci} 30153a5a1b3Sopenharmony_ci 30253a5a1b3Sopenharmony_cistatic int pa_cli_command_sources(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 30353a5a1b3Sopenharmony_ci char *s; 30453a5a1b3Sopenharmony_ci 30553a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 30653a5a1b3Sopenharmony_ci pa_assert(t); 30753a5a1b3Sopenharmony_ci pa_assert(buf); 30853a5a1b3Sopenharmony_ci pa_assert(fail); 30953a5a1b3Sopenharmony_ci 31053a5a1b3Sopenharmony_ci pa_assert_se(s = pa_source_list_to_string(c)); 31153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, s); 31253a5a1b3Sopenharmony_ci pa_xfree(s); 31353a5a1b3Sopenharmony_ci return 0; 31453a5a1b3Sopenharmony_ci} 31553a5a1b3Sopenharmony_ci 31653a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_inputs(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 31753a5a1b3Sopenharmony_ci char *s; 31853a5a1b3Sopenharmony_ci 31953a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 32053a5a1b3Sopenharmony_ci pa_assert(t); 32153a5a1b3Sopenharmony_ci pa_assert(buf); 32253a5a1b3Sopenharmony_ci pa_assert(fail); 32353a5a1b3Sopenharmony_ci 32453a5a1b3Sopenharmony_ci pa_assert_se(s = pa_sink_input_list_to_string(c)); 32553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, s); 32653a5a1b3Sopenharmony_ci pa_xfree(s); 32753a5a1b3Sopenharmony_ci return 0; 32853a5a1b3Sopenharmony_ci} 32953a5a1b3Sopenharmony_ci 33053a5a1b3Sopenharmony_cistatic int pa_cli_command_source_outputs(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 33153a5a1b3Sopenharmony_ci char *s; 33253a5a1b3Sopenharmony_ci 33353a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 33453a5a1b3Sopenharmony_ci pa_assert(t); 33553a5a1b3Sopenharmony_ci pa_assert(buf); 33653a5a1b3Sopenharmony_ci pa_assert(fail); 33753a5a1b3Sopenharmony_ci 33853a5a1b3Sopenharmony_ci pa_assert_se(s = pa_source_output_list_to_string(c)); 33953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, s); 34053a5a1b3Sopenharmony_ci pa_xfree(s); 34153a5a1b3Sopenharmony_ci return 0; 34253a5a1b3Sopenharmony_ci} 34353a5a1b3Sopenharmony_ci 34453a5a1b3Sopenharmony_cistatic int pa_cli_command_stat(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 34553a5a1b3Sopenharmony_ci char ss[PA_SAMPLE_SPEC_SNPRINT_MAX]; 34653a5a1b3Sopenharmony_ci char cm[PA_CHANNEL_MAP_SNPRINT_MAX]; 34753a5a1b3Sopenharmony_ci char bytes[PA_BYTES_SNPRINT_MAX]; 34853a5a1b3Sopenharmony_ci const pa_mempool_stat *mstat; 34953a5a1b3Sopenharmony_ci unsigned k; 35053a5a1b3Sopenharmony_ci 35153a5a1b3Sopenharmony_ci static const char* const type_table[PA_MEMBLOCK_TYPE_MAX] = { 35253a5a1b3Sopenharmony_ci [PA_MEMBLOCK_POOL] = "POOL", 35353a5a1b3Sopenharmony_ci [PA_MEMBLOCK_POOL_EXTERNAL] = "POOL_EXTERNAL", 35453a5a1b3Sopenharmony_ci [PA_MEMBLOCK_APPENDED] = "APPENDED", 35553a5a1b3Sopenharmony_ci [PA_MEMBLOCK_USER] = "USER", 35653a5a1b3Sopenharmony_ci [PA_MEMBLOCK_FIXED] = "FIXED", 35753a5a1b3Sopenharmony_ci [PA_MEMBLOCK_IMPORTED] = "IMPORTED", 35853a5a1b3Sopenharmony_ci }; 35953a5a1b3Sopenharmony_ci 36053a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 36153a5a1b3Sopenharmony_ci pa_assert(t); 36253a5a1b3Sopenharmony_ci pa_assert(buf); 36353a5a1b3Sopenharmony_ci pa_assert(fail); 36453a5a1b3Sopenharmony_ci 36553a5a1b3Sopenharmony_ci mstat = pa_mempool_get_stat(c->mempool); 36653a5a1b3Sopenharmony_ci 36753a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Memory blocks currently allocated: %u, size: %s.\n", 36853a5a1b3Sopenharmony_ci (unsigned) pa_atomic_load(&mstat->n_allocated), 36953a5a1b3Sopenharmony_ci pa_bytes_snprint(bytes, sizeof(bytes), (unsigned) pa_atomic_load(&mstat->allocated_size))); 37053a5a1b3Sopenharmony_ci 37153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Memory blocks allocated during the whole lifetime: %u, size: %s.\n", 37253a5a1b3Sopenharmony_ci (unsigned) pa_atomic_load(&mstat->n_accumulated), 37353a5a1b3Sopenharmony_ci pa_bytes_snprint(bytes, sizeof(bytes), (unsigned) pa_atomic_load(&mstat->accumulated_size))); 37453a5a1b3Sopenharmony_ci 37553a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Memory blocks imported from other processes: %u, size: %s.\n", 37653a5a1b3Sopenharmony_ci (unsigned) pa_atomic_load(&mstat->n_imported), 37753a5a1b3Sopenharmony_ci pa_bytes_snprint(bytes, sizeof(bytes), (unsigned) pa_atomic_load(&mstat->imported_size))); 37853a5a1b3Sopenharmony_ci 37953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Memory blocks exported to other processes: %u, size: %s.\n", 38053a5a1b3Sopenharmony_ci (unsigned) pa_atomic_load(&mstat->n_exported), 38153a5a1b3Sopenharmony_ci pa_bytes_snprint(bytes, sizeof(bytes), (unsigned) pa_atomic_load(&mstat->exported_size))); 38253a5a1b3Sopenharmony_ci 38353a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Total sample cache size: %s.\n", 38453a5a1b3Sopenharmony_ci pa_bytes_snprint(bytes, sizeof(bytes), (unsigned) pa_scache_total_size(c))); 38553a5a1b3Sopenharmony_ci 38653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Default sample spec: %s\n", 38753a5a1b3Sopenharmony_ci pa_sample_spec_snprint(ss, sizeof(ss), &c->default_sample_spec)); 38853a5a1b3Sopenharmony_ci 38953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Default channel map: %s\n", 39053a5a1b3Sopenharmony_ci pa_channel_map_snprint(cm, sizeof(cm), &c->default_channel_map)); 39153a5a1b3Sopenharmony_ci 39253a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Default sink name: %s\n" 39353a5a1b3Sopenharmony_ci "Default source name: %s\n", 39453a5a1b3Sopenharmony_ci c->default_sink ? c->default_sink->name : "none", 39553a5a1b3Sopenharmony_ci c->default_source ? c->default_source->name : "none"); 39653a5a1b3Sopenharmony_ci 39753a5a1b3Sopenharmony_ci for (k = 0; k < PA_MEMBLOCK_TYPE_MAX; k++) 39853a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 39953a5a1b3Sopenharmony_ci "Memory blocks of type %s: %u allocated/%u accumulated.\n", 40053a5a1b3Sopenharmony_ci type_table[k], 40153a5a1b3Sopenharmony_ci (unsigned) pa_atomic_load(&mstat->n_allocated_by_type[k]), 40253a5a1b3Sopenharmony_ci (unsigned) pa_atomic_load(&mstat->n_accumulated_by_type[k])); 40353a5a1b3Sopenharmony_ci 40453a5a1b3Sopenharmony_ci return 0; 40553a5a1b3Sopenharmony_ci} 40653a5a1b3Sopenharmony_ci 40753a5a1b3Sopenharmony_cistatic int pa_cli_command_info(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 40853a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 40953a5a1b3Sopenharmony_ci pa_assert(t); 41053a5a1b3Sopenharmony_ci pa_assert(buf); 41153a5a1b3Sopenharmony_ci pa_assert(fail); 41253a5a1b3Sopenharmony_ci 41353a5a1b3Sopenharmony_ci pa_cli_command_stat(c, t, buf, fail); 41453a5a1b3Sopenharmony_ci pa_cli_command_modules(c, t, buf, fail); 41553a5a1b3Sopenharmony_ci pa_cli_command_sinks(c, t, buf, fail); 41653a5a1b3Sopenharmony_ci pa_cli_command_sources(c, t, buf, fail); 41753a5a1b3Sopenharmony_ci pa_cli_command_clients(c, t, buf, fail); 41853a5a1b3Sopenharmony_ci pa_cli_command_cards(c, t, buf, fail); 41953a5a1b3Sopenharmony_ci pa_cli_command_sink_inputs(c, t, buf, fail); 42053a5a1b3Sopenharmony_ci pa_cli_command_source_outputs(c, t, buf, fail); 42153a5a1b3Sopenharmony_ci pa_cli_command_scache_list(c, t, buf, fail); 42253a5a1b3Sopenharmony_ci return 0; 42353a5a1b3Sopenharmony_ci} 42453a5a1b3Sopenharmony_ci 42553a5a1b3Sopenharmony_cistatic int pa_cli_command_load(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 42653a5a1b3Sopenharmony_ci const char *name; 42753a5a1b3Sopenharmony_ci pa_error_code_t err; 42853a5a1b3Sopenharmony_ci pa_module *m = NULL; 42953a5a1b3Sopenharmony_ci 43053a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 43153a5a1b3Sopenharmony_ci pa_assert(t); 43253a5a1b3Sopenharmony_ci pa_assert(buf); 43353a5a1b3Sopenharmony_ci pa_assert(fail); 43453a5a1b3Sopenharmony_ci 43553a5a1b3Sopenharmony_ci if (!(name = pa_tokenizer_get(t, 1))) { 43653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify the module name and optionally arguments.\n"); 43753a5a1b3Sopenharmony_ci return -1; 43853a5a1b3Sopenharmony_ci } 43953a5a1b3Sopenharmony_ci 44053a5a1b3Sopenharmony_ci if ((err = pa_module_load(&m, c, name, pa_tokenizer_get(t, 2))) < 0) { 44153a5a1b3Sopenharmony_ci if (err == PA_ERR_EXIST) { 44253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Module already loaded; ignoring.\n"); 44353a5a1b3Sopenharmony_ci } else { 44453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Module load failed.\n"); 44553a5a1b3Sopenharmony_ci return -1; 44653a5a1b3Sopenharmony_ci } 44753a5a1b3Sopenharmony_ci } 44853a5a1b3Sopenharmony_ci 44953a5a1b3Sopenharmony_ci return 0; 45053a5a1b3Sopenharmony_ci} 45153a5a1b3Sopenharmony_ci 45253a5a1b3Sopenharmony_cistatic int pa_cli_command_unload(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 45353a5a1b3Sopenharmony_ci pa_module *m; 45453a5a1b3Sopenharmony_ci uint32_t idx; 45553a5a1b3Sopenharmony_ci const char *i; 45653a5a1b3Sopenharmony_ci bool unloaded = false; 45753a5a1b3Sopenharmony_ci 45853a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 45953a5a1b3Sopenharmony_ci pa_assert(t); 46053a5a1b3Sopenharmony_ci pa_assert(buf); 46153a5a1b3Sopenharmony_ci pa_assert(fail); 46253a5a1b3Sopenharmony_ci 46353a5a1b3Sopenharmony_ci if (!(i = pa_tokenizer_get(t, 1))) { 46453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify the module index or name.\n"); 46553a5a1b3Sopenharmony_ci return -1; 46653a5a1b3Sopenharmony_ci } 46753a5a1b3Sopenharmony_ci 46853a5a1b3Sopenharmony_ci if (pa_atou(i, &idx) >= 0) { 46953a5a1b3Sopenharmony_ci if (!(m = pa_idxset_get_by_index(c->modules, idx))) { 47053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Invalid module index.\n"); 47153a5a1b3Sopenharmony_ci return -1; 47253a5a1b3Sopenharmony_ci } 47353a5a1b3Sopenharmony_ci 47453a5a1b3Sopenharmony_ci pa_module_unload(m, false); 47553a5a1b3Sopenharmony_ci 47653a5a1b3Sopenharmony_ci } else { 47753a5a1b3Sopenharmony_ci PA_IDXSET_FOREACH(m, c->modules, idx) 47853a5a1b3Sopenharmony_ci if (pa_streq(i, m->name)) { 47953a5a1b3Sopenharmony_ci unloaded = true; 48053a5a1b3Sopenharmony_ci pa_module_unload(m, false); 48153a5a1b3Sopenharmony_ci } 48253a5a1b3Sopenharmony_ci 48353a5a1b3Sopenharmony_ci if (unloaded == false) { 48453a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Module %s not loaded.\n", i); 48553a5a1b3Sopenharmony_ci return -1; 48653a5a1b3Sopenharmony_ci } 48753a5a1b3Sopenharmony_ci } 48853a5a1b3Sopenharmony_ci 48953a5a1b3Sopenharmony_ci return 0; 49053a5a1b3Sopenharmony_ci} 49153a5a1b3Sopenharmony_ci 49253a5a1b3Sopenharmony_cistatic int pa_cli_command_describe(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 49353a5a1b3Sopenharmony_ci const char *name; 49453a5a1b3Sopenharmony_ci pa_modinfo *i; 49553a5a1b3Sopenharmony_ci 49653a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 49753a5a1b3Sopenharmony_ci pa_assert(t); 49853a5a1b3Sopenharmony_ci pa_assert(buf); 49953a5a1b3Sopenharmony_ci pa_assert(fail); 50053a5a1b3Sopenharmony_ci 50153a5a1b3Sopenharmony_ci if (!(name = pa_tokenizer_get(t, 1))) { 50253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify the module name.\n"); 50353a5a1b3Sopenharmony_ci return -1; 50453a5a1b3Sopenharmony_ci } 50553a5a1b3Sopenharmony_ci 50653a5a1b3Sopenharmony_ci if ((i = pa_modinfo_get_by_name(name))) { 50753a5a1b3Sopenharmony_ci 50853a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Name: %s\n", name); 50953a5a1b3Sopenharmony_ci 51053a5a1b3Sopenharmony_ci if (!i->description && !i->version && !i->author && !i->usage) 51153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "No module information available\n"); 51253a5a1b3Sopenharmony_ci else { 51353a5a1b3Sopenharmony_ci if (i->version) 51453a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Version: %s\n", i->version); 51553a5a1b3Sopenharmony_ci if (i->description) 51653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Description: %s\n", i->description); 51753a5a1b3Sopenharmony_ci if (i->author) 51853a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Author: %s\n", i->author); 51953a5a1b3Sopenharmony_ci if (i->usage) 52053a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Usage: %s\n", i->usage); 52153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Load Once: %s\n", pa_yes_no(i->load_once)); 52253a5a1b3Sopenharmony_ci if (i->deprecated) 52353a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Warning, deprecated: %s\n", i->deprecated); 52453a5a1b3Sopenharmony_ci } 52553a5a1b3Sopenharmony_ci 52653a5a1b3Sopenharmony_ci pa_modinfo_free(i); 52753a5a1b3Sopenharmony_ci } else 52853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to open module.\n"); 52953a5a1b3Sopenharmony_ci 53053a5a1b3Sopenharmony_ci return 0; 53153a5a1b3Sopenharmony_ci} 53253a5a1b3Sopenharmony_ci 53353a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_volume(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 53453a5a1b3Sopenharmony_ci const char *n, *v; 53553a5a1b3Sopenharmony_ci pa_sink *sink; 53653a5a1b3Sopenharmony_ci uint32_t volume; 53753a5a1b3Sopenharmony_ci pa_cvolume cvolume; 53853a5a1b3Sopenharmony_ci 53953a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 54053a5a1b3Sopenharmony_ci pa_assert(t); 54153a5a1b3Sopenharmony_ci pa_assert(buf); 54253a5a1b3Sopenharmony_ci pa_assert(fail); 54353a5a1b3Sopenharmony_ci 54453a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 54553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink either by its name or its index.\n"); 54653a5a1b3Sopenharmony_ci return -1; 54753a5a1b3Sopenharmony_ci } 54853a5a1b3Sopenharmony_ci 54953a5a1b3Sopenharmony_ci if (!(v = pa_tokenizer_get(t, 2))) { 55053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a volume >= 0. (0 is muted, 0x10000 is normal volume)\n"); 55153a5a1b3Sopenharmony_ci return -1; 55253a5a1b3Sopenharmony_ci } 55353a5a1b3Sopenharmony_ci 55453a5a1b3Sopenharmony_ci if (pa_atou(v, &volume) < 0) { 55553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse volume.\n"); 55653a5a1b3Sopenharmony_ci return -1; 55753a5a1b3Sopenharmony_ci } 55853a5a1b3Sopenharmony_ci 55953a5a1b3Sopenharmony_ci if (!PA_VOLUME_IS_VALID(volume)) { 56053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Volume outside permissible range.\n"); 56153a5a1b3Sopenharmony_ci return -1; 56253a5a1b3Sopenharmony_ci } 56353a5a1b3Sopenharmony_ci 56453a5a1b3Sopenharmony_ci if (!(sink = pa_namereg_get(c, n, PA_NAMEREG_SINK))) { 56553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink found by this name or index.\n"); 56653a5a1b3Sopenharmony_ci return -1; 56753a5a1b3Sopenharmony_ci } 56853a5a1b3Sopenharmony_ci 56953a5a1b3Sopenharmony_ci pa_cvolume_set(&cvolume, 1, volume); 57053a5a1b3Sopenharmony_ci pa_sink_set_volume(sink, &cvolume, true, true); 57153a5a1b3Sopenharmony_ci return 0; 57253a5a1b3Sopenharmony_ci} 57353a5a1b3Sopenharmony_ci 57453a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_input_volume(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 57553a5a1b3Sopenharmony_ci const char *n, *v; 57653a5a1b3Sopenharmony_ci pa_sink_input *si; 57753a5a1b3Sopenharmony_ci pa_volume_t volume; 57853a5a1b3Sopenharmony_ci pa_cvolume cvolume; 57953a5a1b3Sopenharmony_ci uint32_t idx; 58053a5a1b3Sopenharmony_ci 58153a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 58253a5a1b3Sopenharmony_ci pa_assert(t); 58353a5a1b3Sopenharmony_ci pa_assert(buf); 58453a5a1b3Sopenharmony_ci pa_assert(fail); 58553a5a1b3Sopenharmony_ci 58653a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 58753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink input by its index.\n"); 58853a5a1b3Sopenharmony_ci return -1; 58953a5a1b3Sopenharmony_ci } 59053a5a1b3Sopenharmony_ci 59153a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 59253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 59353a5a1b3Sopenharmony_ci return -1; 59453a5a1b3Sopenharmony_ci } 59553a5a1b3Sopenharmony_ci 59653a5a1b3Sopenharmony_ci if (!(v = pa_tokenizer_get(t, 2))) { 59753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a volume >= 0. (0 is muted, 0x10000 is normal volume)\n"); 59853a5a1b3Sopenharmony_ci return -1; 59953a5a1b3Sopenharmony_ci } 60053a5a1b3Sopenharmony_ci 60153a5a1b3Sopenharmony_ci if (pa_atou(v, &volume) < 0) { 60253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse volume.\n"); 60353a5a1b3Sopenharmony_ci return -1; 60453a5a1b3Sopenharmony_ci } 60553a5a1b3Sopenharmony_ci 60653a5a1b3Sopenharmony_ci if (!PA_VOLUME_IS_VALID(volume)) { 60753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Volume outside permissible range.\n"); 60853a5a1b3Sopenharmony_ci return -1; 60953a5a1b3Sopenharmony_ci } 61053a5a1b3Sopenharmony_ci 61153a5a1b3Sopenharmony_ci if (!(si = pa_idxset_get_by_index(c->sink_inputs, idx))) { 61253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink input found with this index.\n"); 61353a5a1b3Sopenharmony_ci return -1; 61453a5a1b3Sopenharmony_ci } 61553a5a1b3Sopenharmony_ci 61653a5a1b3Sopenharmony_ci if (!si->volume_writable) { 61753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "This sink input's volume can't be changed.\n"); 61853a5a1b3Sopenharmony_ci return -1; 61953a5a1b3Sopenharmony_ci } 62053a5a1b3Sopenharmony_ci 62153a5a1b3Sopenharmony_ci pa_cvolume_set(&cvolume, 1, volume); 62253a5a1b3Sopenharmony_ci pa_sink_input_set_volume(si, &cvolume, true, true); 62353a5a1b3Sopenharmony_ci return 0; 62453a5a1b3Sopenharmony_ci} 62553a5a1b3Sopenharmony_ci 62653a5a1b3Sopenharmony_cistatic int pa_cli_command_source_volume(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 62753a5a1b3Sopenharmony_ci const char *n, *v; 62853a5a1b3Sopenharmony_ci pa_source *source; 62953a5a1b3Sopenharmony_ci uint32_t volume; 63053a5a1b3Sopenharmony_ci pa_cvolume cvolume; 63153a5a1b3Sopenharmony_ci 63253a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 63353a5a1b3Sopenharmony_ci pa_assert(t); 63453a5a1b3Sopenharmony_ci pa_assert(buf); 63553a5a1b3Sopenharmony_ci pa_assert(fail); 63653a5a1b3Sopenharmony_ci 63753a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 63853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source either by its name or its index.\n"); 63953a5a1b3Sopenharmony_ci return -1; 64053a5a1b3Sopenharmony_ci } 64153a5a1b3Sopenharmony_ci 64253a5a1b3Sopenharmony_ci if (!(v = pa_tokenizer_get(t, 2))) { 64353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a volume >= 0. (0 is muted, 0x10000 is normal volume)\n"); 64453a5a1b3Sopenharmony_ci return -1; 64553a5a1b3Sopenharmony_ci } 64653a5a1b3Sopenharmony_ci 64753a5a1b3Sopenharmony_ci if (pa_atou(v, &volume) < 0) { 64853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse volume.\n"); 64953a5a1b3Sopenharmony_ci return -1; 65053a5a1b3Sopenharmony_ci } 65153a5a1b3Sopenharmony_ci 65253a5a1b3Sopenharmony_ci if (!PA_VOLUME_IS_VALID(volume)) { 65353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Volume outside permissible range.\n"); 65453a5a1b3Sopenharmony_ci return -1; 65553a5a1b3Sopenharmony_ci } 65653a5a1b3Sopenharmony_ci 65753a5a1b3Sopenharmony_ci if (!(source = pa_namereg_get(c, n, PA_NAMEREG_SOURCE))) { 65853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source found by this name or index.\n"); 65953a5a1b3Sopenharmony_ci return -1; 66053a5a1b3Sopenharmony_ci } 66153a5a1b3Sopenharmony_ci 66253a5a1b3Sopenharmony_ci pa_cvolume_set(&cvolume, 1, volume); 66353a5a1b3Sopenharmony_ci pa_source_set_volume(source, &cvolume, true, true); 66453a5a1b3Sopenharmony_ci return 0; 66553a5a1b3Sopenharmony_ci} 66653a5a1b3Sopenharmony_ci 66753a5a1b3Sopenharmony_cistatic int pa_cli_command_source_output_volume(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 66853a5a1b3Sopenharmony_ci const char *n, *v; 66953a5a1b3Sopenharmony_ci pa_source_output *so; 67053a5a1b3Sopenharmony_ci pa_volume_t volume; 67153a5a1b3Sopenharmony_ci pa_cvolume cvolume; 67253a5a1b3Sopenharmony_ci uint32_t idx; 67353a5a1b3Sopenharmony_ci 67453a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 67553a5a1b3Sopenharmony_ci pa_assert(t); 67653a5a1b3Sopenharmony_ci pa_assert(buf); 67753a5a1b3Sopenharmony_ci pa_assert(fail); 67853a5a1b3Sopenharmony_ci 67953a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 68053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source output by its index.\n"); 68153a5a1b3Sopenharmony_ci return -1; 68253a5a1b3Sopenharmony_ci } 68353a5a1b3Sopenharmony_ci 68453a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 68553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 68653a5a1b3Sopenharmony_ci return -1; 68753a5a1b3Sopenharmony_ci } 68853a5a1b3Sopenharmony_ci 68953a5a1b3Sopenharmony_ci if (!(v = pa_tokenizer_get(t, 2))) { 69053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a volume >= 0. (0 is muted, 0x10000 is normal volume)\n"); 69153a5a1b3Sopenharmony_ci return -1; 69253a5a1b3Sopenharmony_ci } 69353a5a1b3Sopenharmony_ci 69453a5a1b3Sopenharmony_ci if (pa_atou(v, &volume) < 0) { 69553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse volume.\n"); 69653a5a1b3Sopenharmony_ci return -1; 69753a5a1b3Sopenharmony_ci } 69853a5a1b3Sopenharmony_ci 69953a5a1b3Sopenharmony_ci if (!PA_VOLUME_IS_VALID(volume)) { 70053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Volume outside permissible range.\n"); 70153a5a1b3Sopenharmony_ci return -1; 70253a5a1b3Sopenharmony_ci } 70353a5a1b3Sopenharmony_ci 70453a5a1b3Sopenharmony_ci if (!(so = pa_idxset_get_by_index(c->source_outputs, idx))) { 70553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source output found with this index.\n"); 70653a5a1b3Sopenharmony_ci return -1; 70753a5a1b3Sopenharmony_ci } 70853a5a1b3Sopenharmony_ci 70953a5a1b3Sopenharmony_ci if (!so->volume_writable) { 71053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "This source output's volume can't be changed.\n"); 71153a5a1b3Sopenharmony_ci return -1; 71253a5a1b3Sopenharmony_ci } 71353a5a1b3Sopenharmony_ci 71453a5a1b3Sopenharmony_ci pa_cvolume_set(&cvolume, 1, volume); 71553a5a1b3Sopenharmony_ci pa_source_output_set_volume(so, &cvolume, true, true); 71653a5a1b3Sopenharmony_ci return 0; 71753a5a1b3Sopenharmony_ci} 71853a5a1b3Sopenharmony_ci 71953a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_mute(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 72053a5a1b3Sopenharmony_ci const char *n, *m; 72153a5a1b3Sopenharmony_ci pa_sink *sink; 72253a5a1b3Sopenharmony_ci int mute; 72353a5a1b3Sopenharmony_ci 72453a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 72553a5a1b3Sopenharmony_ci pa_assert(t); 72653a5a1b3Sopenharmony_ci pa_assert(buf); 72753a5a1b3Sopenharmony_ci pa_assert(fail); 72853a5a1b3Sopenharmony_ci 72953a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 73053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink either by its name or its index.\n"); 73153a5a1b3Sopenharmony_ci return -1; 73253a5a1b3Sopenharmony_ci } 73353a5a1b3Sopenharmony_ci 73453a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 2))) { 73553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a mute switch setting (0/1).\n"); 73653a5a1b3Sopenharmony_ci return -1; 73753a5a1b3Sopenharmony_ci } 73853a5a1b3Sopenharmony_ci 73953a5a1b3Sopenharmony_ci if ((mute = pa_parse_boolean(m)) < 0) { 74053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse mute switch.\n"); 74153a5a1b3Sopenharmony_ci return -1; 74253a5a1b3Sopenharmony_ci } 74353a5a1b3Sopenharmony_ci 74453a5a1b3Sopenharmony_ci if (!(sink = pa_namereg_get(c, n, PA_NAMEREG_SINK))) { 74553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink found by this name or index.\n"); 74653a5a1b3Sopenharmony_ci return -1; 74753a5a1b3Sopenharmony_ci } 74853a5a1b3Sopenharmony_ci 74953a5a1b3Sopenharmony_ci pa_sink_set_mute(sink, mute, true); 75053a5a1b3Sopenharmony_ci return 0; 75153a5a1b3Sopenharmony_ci} 75253a5a1b3Sopenharmony_ci 75353a5a1b3Sopenharmony_cistatic int pa_cli_command_source_mute(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 75453a5a1b3Sopenharmony_ci const char *n, *m; 75553a5a1b3Sopenharmony_ci pa_source *source; 75653a5a1b3Sopenharmony_ci int mute; 75753a5a1b3Sopenharmony_ci 75853a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 75953a5a1b3Sopenharmony_ci pa_assert(t); 76053a5a1b3Sopenharmony_ci pa_assert(buf); 76153a5a1b3Sopenharmony_ci pa_assert(fail); 76253a5a1b3Sopenharmony_ci 76353a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 76453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source either by its name or its index.\n"); 76553a5a1b3Sopenharmony_ci return -1; 76653a5a1b3Sopenharmony_ci } 76753a5a1b3Sopenharmony_ci 76853a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 2))) { 76953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a mute switch setting (0/1).\n"); 77053a5a1b3Sopenharmony_ci return -1; 77153a5a1b3Sopenharmony_ci } 77253a5a1b3Sopenharmony_ci 77353a5a1b3Sopenharmony_ci if ((mute = pa_parse_boolean(m)) < 0) { 77453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse mute switch.\n"); 77553a5a1b3Sopenharmony_ci return -1; 77653a5a1b3Sopenharmony_ci } 77753a5a1b3Sopenharmony_ci 77853a5a1b3Sopenharmony_ci if (!(source = pa_namereg_get(c, n, PA_NAMEREG_SOURCE))) { 77953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink found by this name or index.\n"); 78053a5a1b3Sopenharmony_ci return -1; 78153a5a1b3Sopenharmony_ci } 78253a5a1b3Sopenharmony_ci 78353a5a1b3Sopenharmony_ci pa_source_set_mute(source, mute, true); 78453a5a1b3Sopenharmony_ci return 0; 78553a5a1b3Sopenharmony_ci} 78653a5a1b3Sopenharmony_ci 78753a5a1b3Sopenharmony_cistatic int pa_cli_command_update_sink_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 78853a5a1b3Sopenharmony_ci const char *n, *s; 78953a5a1b3Sopenharmony_ci pa_sink *sink; 79053a5a1b3Sopenharmony_ci pa_proplist *p; 79153a5a1b3Sopenharmony_ci 79253a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 79353a5a1b3Sopenharmony_ci pa_assert(t); 79453a5a1b3Sopenharmony_ci pa_assert(buf); 79553a5a1b3Sopenharmony_ci pa_assert(fail); 79653a5a1b3Sopenharmony_ci 79753a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 79853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink either by its name or its index.\n"); 79953a5a1b3Sopenharmony_ci return -1; 80053a5a1b3Sopenharmony_ci } 80153a5a1b3Sopenharmony_ci 80253a5a1b3Sopenharmony_ci if (!(s = pa_tokenizer_get(t, 2))) { 80353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a \"key=value\" argument.\n"); 80453a5a1b3Sopenharmony_ci return -1; 80553a5a1b3Sopenharmony_ci } 80653a5a1b3Sopenharmony_ci 80753a5a1b3Sopenharmony_ci if (!(sink = pa_namereg_get(c, n, PA_NAMEREG_SINK))) { 80853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink found by this name or index.\n"); 80953a5a1b3Sopenharmony_ci return -1; 81053a5a1b3Sopenharmony_ci } 81153a5a1b3Sopenharmony_ci 81253a5a1b3Sopenharmony_ci if (!(p = pa_proplist_from_string(s))) { 81353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse proplist.\n"); 81453a5a1b3Sopenharmony_ci return -1; 81553a5a1b3Sopenharmony_ci } 81653a5a1b3Sopenharmony_ci 81753a5a1b3Sopenharmony_ci pa_sink_update_proplist(sink, PA_UPDATE_REPLACE, p); 81853a5a1b3Sopenharmony_ci 81953a5a1b3Sopenharmony_ci pa_proplist_free(p); 82053a5a1b3Sopenharmony_ci 82153a5a1b3Sopenharmony_ci return 0; 82253a5a1b3Sopenharmony_ci} 82353a5a1b3Sopenharmony_ci 82453a5a1b3Sopenharmony_cistatic int pa_cli_command_update_source_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 82553a5a1b3Sopenharmony_ci const char *n, *s; 82653a5a1b3Sopenharmony_ci pa_source *source; 82753a5a1b3Sopenharmony_ci pa_proplist *p; 82853a5a1b3Sopenharmony_ci 82953a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 83053a5a1b3Sopenharmony_ci pa_assert(t); 83153a5a1b3Sopenharmony_ci pa_assert(buf); 83253a5a1b3Sopenharmony_ci pa_assert(fail); 83353a5a1b3Sopenharmony_ci 83453a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 83553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source either by its name or its index.\n"); 83653a5a1b3Sopenharmony_ci return -1; 83753a5a1b3Sopenharmony_ci } 83853a5a1b3Sopenharmony_ci 83953a5a1b3Sopenharmony_ci if (!(s = pa_tokenizer_get(t, 2))) { 84053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a \"key=value\" argument.\n"); 84153a5a1b3Sopenharmony_ci return -1; 84253a5a1b3Sopenharmony_ci } 84353a5a1b3Sopenharmony_ci 84453a5a1b3Sopenharmony_ci if (!(source = pa_namereg_get(c, n, PA_NAMEREG_SOURCE))) { 84553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source found by this name or index.\n"); 84653a5a1b3Sopenharmony_ci return -1; 84753a5a1b3Sopenharmony_ci } 84853a5a1b3Sopenharmony_ci 84953a5a1b3Sopenharmony_ci if (!(p = pa_proplist_from_string(s))) { 85053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse proplist.\n"); 85153a5a1b3Sopenharmony_ci return -1; 85253a5a1b3Sopenharmony_ci } 85353a5a1b3Sopenharmony_ci 85453a5a1b3Sopenharmony_ci pa_source_update_proplist(source, PA_UPDATE_REPLACE, p); 85553a5a1b3Sopenharmony_ci 85653a5a1b3Sopenharmony_ci pa_proplist_free(p); 85753a5a1b3Sopenharmony_ci 85853a5a1b3Sopenharmony_ci return 0; 85953a5a1b3Sopenharmony_ci} 86053a5a1b3Sopenharmony_ci 86153a5a1b3Sopenharmony_cistatic int pa_cli_command_update_sink_input_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 86253a5a1b3Sopenharmony_ci const char *n, *s; 86353a5a1b3Sopenharmony_ci pa_sink_input *si; 86453a5a1b3Sopenharmony_ci uint32_t idx; 86553a5a1b3Sopenharmony_ci pa_proplist *p; 86653a5a1b3Sopenharmony_ci 86753a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 86853a5a1b3Sopenharmony_ci pa_assert(t); 86953a5a1b3Sopenharmony_ci pa_assert(buf); 87053a5a1b3Sopenharmony_ci pa_assert(fail); 87153a5a1b3Sopenharmony_ci 87253a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 87353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink input either by index.\n"); 87453a5a1b3Sopenharmony_ci return -1; 87553a5a1b3Sopenharmony_ci } 87653a5a1b3Sopenharmony_ci 87753a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 87853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 87953a5a1b3Sopenharmony_ci return -1; 88053a5a1b3Sopenharmony_ci } 88153a5a1b3Sopenharmony_ci 88253a5a1b3Sopenharmony_ci if (!(s = pa_tokenizer_get(t, 2))) { 88353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a \"key=value\" argument.\n"); 88453a5a1b3Sopenharmony_ci return -1; 88553a5a1b3Sopenharmony_ci } 88653a5a1b3Sopenharmony_ci 88753a5a1b3Sopenharmony_ci if (!(si = pa_idxset_get_by_index(c->sink_inputs, (uint32_t) idx))) { 88853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink input found with this index.\n"); 88953a5a1b3Sopenharmony_ci return -1; 89053a5a1b3Sopenharmony_ci } 89153a5a1b3Sopenharmony_ci 89253a5a1b3Sopenharmony_ci if (!(p = pa_proplist_from_string(s))) { 89353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse proplist.\n"); 89453a5a1b3Sopenharmony_ci return -1; 89553a5a1b3Sopenharmony_ci } 89653a5a1b3Sopenharmony_ci 89753a5a1b3Sopenharmony_ci pa_sink_input_update_proplist(si, PA_UPDATE_REPLACE, p); 89853a5a1b3Sopenharmony_ci 89953a5a1b3Sopenharmony_ci pa_proplist_free(p); 90053a5a1b3Sopenharmony_ci 90153a5a1b3Sopenharmony_ci return 0; 90253a5a1b3Sopenharmony_ci} 90353a5a1b3Sopenharmony_ci 90453a5a1b3Sopenharmony_cistatic int pa_cli_command_update_source_output_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 90553a5a1b3Sopenharmony_ci const char *n, *s; 90653a5a1b3Sopenharmony_ci pa_source_output *so; 90753a5a1b3Sopenharmony_ci uint32_t idx; 90853a5a1b3Sopenharmony_ci pa_proplist *p; 90953a5a1b3Sopenharmony_ci 91053a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 91153a5a1b3Sopenharmony_ci pa_assert(t); 91253a5a1b3Sopenharmony_ci pa_assert(buf); 91353a5a1b3Sopenharmony_ci pa_assert(fail); 91453a5a1b3Sopenharmony_ci 91553a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 91653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source output by its index.\n"); 91753a5a1b3Sopenharmony_ci return -1; 91853a5a1b3Sopenharmony_ci } 91953a5a1b3Sopenharmony_ci 92053a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 92153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 92253a5a1b3Sopenharmony_ci return -1; 92353a5a1b3Sopenharmony_ci } 92453a5a1b3Sopenharmony_ci 92553a5a1b3Sopenharmony_ci if (!(s = pa_tokenizer_get(t, 2))) { 92653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a \"key=value\" argument.\n"); 92753a5a1b3Sopenharmony_ci return -1; 92853a5a1b3Sopenharmony_ci } 92953a5a1b3Sopenharmony_ci 93053a5a1b3Sopenharmony_ci if (!(so = pa_idxset_get_by_index(c->source_outputs, (uint32_t) idx))) { 93153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source output found with this index.\n"); 93253a5a1b3Sopenharmony_ci return -1; 93353a5a1b3Sopenharmony_ci } 93453a5a1b3Sopenharmony_ci 93553a5a1b3Sopenharmony_ci if (!(p = pa_proplist_from_string(s))) { 93653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse proplist.\n"); 93753a5a1b3Sopenharmony_ci return -1; 93853a5a1b3Sopenharmony_ci } 93953a5a1b3Sopenharmony_ci 94053a5a1b3Sopenharmony_ci pa_source_output_update_proplist(so, PA_UPDATE_REPLACE, p); 94153a5a1b3Sopenharmony_ci 94253a5a1b3Sopenharmony_ci pa_proplist_free(p); 94353a5a1b3Sopenharmony_ci 94453a5a1b3Sopenharmony_ci return 0; 94553a5a1b3Sopenharmony_ci} 94653a5a1b3Sopenharmony_ci 94753a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_input_mute(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 94853a5a1b3Sopenharmony_ci const char *n, *v; 94953a5a1b3Sopenharmony_ci pa_sink_input *si; 95053a5a1b3Sopenharmony_ci uint32_t idx; 95153a5a1b3Sopenharmony_ci int mute; 95253a5a1b3Sopenharmony_ci 95353a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 95453a5a1b3Sopenharmony_ci pa_assert(t); 95553a5a1b3Sopenharmony_ci pa_assert(buf); 95653a5a1b3Sopenharmony_ci pa_assert(fail); 95753a5a1b3Sopenharmony_ci 95853a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 95953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink input by its index.\n"); 96053a5a1b3Sopenharmony_ci return -1; 96153a5a1b3Sopenharmony_ci } 96253a5a1b3Sopenharmony_ci 96353a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 96453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 96553a5a1b3Sopenharmony_ci return -1; 96653a5a1b3Sopenharmony_ci } 96753a5a1b3Sopenharmony_ci 96853a5a1b3Sopenharmony_ci if (!(v = pa_tokenizer_get(t, 2))) { 96953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a mute switch setting (0/1).\n"); 97053a5a1b3Sopenharmony_ci return -1; 97153a5a1b3Sopenharmony_ci } 97253a5a1b3Sopenharmony_ci 97353a5a1b3Sopenharmony_ci if ((mute = pa_parse_boolean(v)) < 0) { 97453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse mute switch.\n"); 97553a5a1b3Sopenharmony_ci return -1; 97653a5a1b3Sopenharmony_ci } 97753a5a1b3Sopenharmony_ci 97853a5a1b3Sopenharmony_ci if (!(si = pa_idxset_get_by_index(c->sink_inputs, (uint32_t) idx))) { 97953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink input found with this index.\n"); 98053a5a1b3Sopenharmony_ci return -1; 98153a5a1b3Sopenharmony_ci } 98253a5a1b3Sopenharmony_ci 98353a5a1b3Sopenharmony_ci pa_sink_input_set_mute(si, mute, true); 98453a5a1b3Sopenharmony_ci return 0; 98553a5a1b3Sopenharmony_ci} 98653a5a1b3Sopenharmony_ci 98753a5a1b3Sopenharmony_cistatic int pa_cli_command_source_output_mute(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 98853a5a1b3Sopenharmony_ci const char *n, *v; 98953a5a1b3Sopenharmony_ci pa_source_output *so; 99053a5a1b3Sopenharmony_ci uint32_t idx; 99153a5a1b3Sopenharmony_ci int mute; 99253a5a1b3Sopenharmony_ci 99353a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 99453a5a1b3Sopenharmony_ci pa_assert(t); 99553a5a1b3Sopenharmony_ci pa_assert(buf); 99653a5a1b3Sopenharmony_ci pa_assert(fail); 99753a5a1b3Sopenharmony_ci 99853a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 99953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source output by its index.\n"); 100053a5a1b3Sopenharmony_ci return -1; 100153a5a1b3Sopenharmony_ci } 100253a5a1b3Sopenharmony_ci 100353a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 100453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 100553a5a1b3Sopenharmony_ci return -1; 100653a5a1b3Sopenharmony_ci } 100753a5a1b3Sopenharmony_ci 100853a5a1b3Sopenharmony_ci if (!(v = pa_tokenizer_get(t, 2))) { 100953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a mute switch setting (0/1).\n"); 101053a5a1b3Sopenharmony_ci return -1; 101153a5a1b3Sopenharmony_ci } 101253a5a1b3Sopenharmony_ci 101353a5a1b3Sopenharmony_ci if ((mute = pa_parse_boolean(v)) < 0) { 101453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse mute switch.\n"); 101553a5a1b3Sopenharmony_ci return -1; 101653a5a1b3Sopenharmony_ci } 101753a5a1b3Sopenharmony_ci 101853a5a1b3Sopenharmony_ci if (!(so = pa_idxset_get_by_index(c->source_outputs, (uint32_t) idx))) { 101953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source output found with this index.\n"); 102053a5a1b3Sopenharmony_ci return -1; 102153a5a1b3Sopenharmony_ci } 102253a5a1b3Sopenharmony_ci 102353a5a1b3Sopenharmony_ci pa_source_output_set_mute(so, mute, true); 102453a5a1b3Sopenharmony_ci return 0; 102553a5a1b3Sopenharmony_ci} 102653a5a1b3Sopenharmony_ci 102753a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_default(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 102853a5a1b3Sopenharmony_ci const char *n; 102953a5a1b3Sopenharmony_ci pa_sink *s; 103053a5a1b3Sopenharmony_ci 103153a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 103253a5a1b3Sopenharmony_ci pa_assert(t); 103353a5a1b3Sopenharmony_ci pa_assert(buf); 103453a5a1b3Sopenharmony_ci pa_assert(fail); 103553a5a1b3Sopenharmony_ci 103653a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 103753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink either by its name or its index.\n"); 103853a5a1b3Sopenharmony_ci return -1; 103953a5a1b3Sopenharmony_ci } 104053a5a1b3Sopenharmony_ci 104153a5a1b3Sopenharmony_ci if ((s = pa_namereg_get(c, n, PA_NAMEREG_SINK))) 104253a5a1b3Sopenharmony_ci pa_core_set_configured_default_sink(c, s->name); 104353a5a1b3Sopenharmony_ci else 104453a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Sink %s does not exist.\n", n); 104553a5a1b3Sopenharmony_ci 104653a5a1b3Sopenharmony_ci return 0; 104753a5a1b3Sopenharmony_ci} 104853a5a1b3Sopenharmony_ci 104953a5a1b3Sopenharmony_cistatic int pa_cli_command_source_default(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 105053a5a1b3Sopenharmony_ci const char *n; 105153a5a1b3Sopenharmony_ci pa_source *s; 105253a5a1b3Sopenharmony_ci 105353a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 105453a5a1b3Sopenharmony_ci pa_assert(t); 105553a5a1b3Sopenharmony_ci pa_assert(buf); 105653a5a1b3Sopenharmony_ci pa_assert(fail); 105753a5a1b3Sopenharmony_ci 105853a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 105953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source either by its name or its index.\n"); 106053a5a1b3Sopenharmony_ci return -1; 106153a5a1b3Sopenharmony_ci } 106253a5a1b3Sopenharmony_ci 106353a5a1b3Sopenharmony_ci if ((s = pa_namereg_get(c, n, PA_NAMEREG_SOURCE))) 106453a5a1b3Sopenharmony_ci pa_core_set_configured_default_source(c, s->name); 106553a5a1b3Sopenharmony_ci else 106653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Source %s does not exist.\n", n); 106753a5a1b3Sopenharmony_ci return 0; 106853a5a1b3Sopenharmony_ci} 106953a5a1b3Sopenharmony_ci 107053a5a1b3Sopenharmony_cistatic int pa_cli_command_kill_client(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 107153a5a1b3Sopenharmony_ci const char *n; 107253a5a1b3Sopenharmony_ci pa_client *client; 107353a5a1b3Sopenharmony_ci uint32_t idx; 107453a5a1b3Sopenharmony_ci 107553a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 107653a5a1b3Sopenharmony_ci pa_assert(t); 107753a5a1b3Sopenharmony_ci pa_assert(buf); 107853a5a1b3Sopenharmony_ci pa_assert(fail); 107953a5a1b3Sopenharmony_ci 108053a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 108153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a client by its index.\n"); 108253a5a1b3Sopenharmony_ci return -1; 108353a5a1b3Sopenharmony_ci } 108453a5a1b3Sopenharmony_ci 108553a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 108653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 108753a5a1b3Sopenharmony_ci return -1; 108853a5a1b3Sopenharmony_ci } 108953a5a1b3Sopenharmony_ci 109053a5a1b3Sopenharmony_ci if (!(client = pa_idxset_get_by_index(c->clients, idx))) { 109153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No client found by this index.\n"); 109253a5a1b3Sopenharmony_ci return -1; 109353a5a1b3Sopenharmony_ci } 109453a5a1b3Sopenharmony_ci 109553a5a1b3Sopenharmony_ci pa_client_kill(client); 109653a5a1b3Sopenharmony_ci return 0; 109753a5a1b3Sopenharmony_ci} 109853a5a1b3Sopenharmony_ci 109953a5a1b3Sopenharmony_cistatic int pa_cli_command_kill_sink_input(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 110053a5a1b3Sopenharmony_ci const char *n; 110153a5a1b3Sopenharmony_ci pa_sink_input *sink_input; 110253a5a1b3Sopenharmony_ci uint32_t idx; 110353a5a1b3Sopenharmony_ci 110453a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 110553a5a1b3Sopenharmony_ci pa_assert(t); 110653a5a1b3Sopenharmony_ci pa_assert(buf); 110753a5a1b3Sopenharmony_ci pa_assert(fail); 110853a5a1b3Sopenharmony_ci 110953a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 111053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink input by its index.\n"); 111153a5a1b3Sopenharmony_ci return -1; 111253a5a1b3Sopenharmony_ci } 111353a5a1b3Sopenharmony_ci 111453a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 111553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 111653a5a1b3Sopenharmony_ci return -1; 111753a5a1b3Sopenharmony_ci } 111853a5a1b3Sopenharmony_ci 111953a5a1b3Sopenharmony_ci if (!(sink_input = pa_idxset_get_by_index(c->sink_inputs, idx))) { 112053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink input found by this index.\n"); 112153a5a1b3Sopenharmony_ci return -1; 112253a5a1b3Sopenharmony_ci } 112353a5a1b3Sopenharmony_ci 112453a5a1b3Sopenharmony_ci pa_sink_input_kill(sink_input); 112553a5a1b3Sopenharmony_ci return 0; 112653a5a1b3Sopenharmony_ci} 112753a5a1b3Sopenharmony_ci 112853a5a1b3Sopenharmony_cistatic int pa_cli_command_kill_source_output(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 112953a5a1b3Sopenharmony_ci const char *n; 113053a5a1b3Sopenharmony_ci pa_source_output *source_output; 113153a5a1b3Sopenharmony_ci uint32_t idx; 113253a5a1b3Sopenharmony_ci 113353a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 113453a5a1b3Sopenharmony_ci pa_assert(t); 113553a5a1b3Sopenharmony_ci pa_assert(buf); 113653a5a1b3Sopenharmony_ci pa_assert(fail); 113753a5a1b3Sopenharmony_ci 113853a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 113953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source output by its index.\n"); 114053a5a1b3Sopenharmony_ci return -1; 114153a5a1b3Sopenharmony_ci } 114253a5a1b3Sopenharmony_ci 114353a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 114453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 114553a5a1b3Sopenharmony_ci return -1; 114653a5a1b3Sopenharmony_ci } 114753a5a1b3Sopenharmony_ci 114853a5a1b3Sopenharmony_ci if (!(source_output = pa_idxset_get_by_index(c->source_outputs, idx))) { 114953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source output found by this index.\n"); 115053a5a1b3Sopenharmony_ci return -1; 115153a5a1b3Sopenharmony_ci } 115253a5a1b3Sopenharmony_ci 115353a5a1b3Sopenharmony_ci pa_source_output_kill(source_output); 115453a5a1b3Sopenharmony_ci return 0; 115553a5a1b3Sopenharmony_ci} 115653a5a1b3Sopenharmony_ci 115753a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_list(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 115853a5a1b3Sopenharmony_ci char *s; 115953a5a1b3Sopenharmony_ci 116053a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 116153a5a1b3Sopenharmony_ci pa_assert(t); 116253a5a1b3Sopenharmony_ci pa_assert(buf); 116353a5a1b3Sopenharmony_ci pa_assert(fail); 116453a5a1b3Sopenharmony_ci 116553a5a1b3Sopenharmony_ci pa_assert_se(s = pa_scache_list_to_string(c)); 116653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, s); 116753a5a1b3Sopenharmony_ci pa_xfree(s); 116853a5a1b3Sopenharmony_ci 116953a5a1b3Sopenharmony_ci return 0; 117053a5a1b3Sopenharmony_ci} 117153a5a1b3Sopenharmony_ci 117253a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_play(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 117353a5a1b3Sopenharmony_ci const char *n, *sink_name; 117453a5a1b3Sopenharmony_ci pa_sink *sink; 117553a5a1b3Sopenharmony_ci uint32_t idx; 117653a5a1b3Sopenharmony_ci 117753a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 117853a5a1b3Sopenharmony_ci pa_assert(t); 117953a5a1b3Sopenharmony_ci pa_assert(buf); 118053a5a1b3Sopenharmony_ci pa_assert(fail); 118153a5a1b3Sopenharmony_ci 118253a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1)) || !(sink_name = pa_tokenizer_get(t, 2))) { 118353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sample name and a sink name.\n"); 118453a5a1b3Sopenharmony_ci return -1; 118553a5a1b3Sopenharmony_ci } 118653a5a1b3Sopenharmony_ci 118753a5a1b3Sopenharmony_ci if (!(sink = pa_namereg_get(c, sink_name, PA_NAMEREG_SINK))) { 118853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink by that name.\n"); 118953a5a1b3Sopenharmony_ci return -1; 119053a5a1b3Sopenharmony_ci } 119153a5a1b3Sopenharmony_ci 119253a5a1b3Sopenharmony_ci if (pa_scache_play_item(c, n, sink, PA_VOLUME_NORM, NULL, &idx) < 0) { 119353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to play sample.\n"); 119453a5a1b3Sopenharmony_ci return -1; 119553a5a1b3Sopenharmony_ci } 119653a5a1b3Sopenharmony_ci 119753a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Playing on sink input #%i\n", idx); 119853a5a1b3Sopenharmony_ci 119953a5a1b3Sopenharmony_ci return 0; 120053a5a1b3Sopenharmony_ci} 120153a5a1b3Sopenharmony_ci 120253a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_remove(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 120353a5a1b3Sopenharmony_ci const char *n; 120453a5a1b3Sopenharmony_ci 120553a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 120653a5a1b3Sopenharmony_ci pa_assert(t); 120753a5a1b3Sopenharmony_ci pa_assert(buf); 120853a5a1b3Sopenharmony_ci pa_assert(fail); 120953a5a1b3Sopenharmony_ci 121053a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 121153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sample name.\n"); 121253a5a1b3Sopenharmony_ci return -1; 121353a5a1b3Sopenharmony_ci } 121453a5a1b3Sopenharmony_ci 121553a5a1b3Sopenharmony_ci if (pa_scache_remove_item(c, n) < 0) { 121653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to remove sample.\n"); 121753a5a1b3Sopenharmony_ci return -1; 121853a5a1b3Sopenharmony_ci } 121953a5a1b3Sopenharmony_ci 122053a5a1b3Sopenharmony_ci return 0; 122153a5a1b3Sopenharmony_ci} 122253a5a1b3Sopenharmony_ci 122353a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_load(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 122453a5a1b3Sopenharmony_ci const char *fname, *n; 122553a5a1b3Sopenharmony_ci int r; 122653a5a1b3Sopenharmony_ci 122753a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 122853a5a1b3Sopenharmony_ci pa_assert(t); 122953a5a1b3Sopenharmony_ci pa_assert(buf); 123053a5a1b3Sopenharmony_ci pa_assert(fail); 123153a5a1b3Sopenharmony_ci 123253a5a1b3Sopenharmony_ci if (!(fname = pa_tokenizer_get(t, 2)) || !(n = pa_tokenizer_get(t, 1))) { 123353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a file name and a sample name.\n"); 123453a5a1b3Sopenharmony_ci return -1; 123553a5a1b3Sopenharmony_ci } 123653a5a1b3Sopenharmony_ci 123753a5a1b3Sopenharmony_ci if (strstr(pa_tokenizer_get(t, 0), "lazy")) 123853a5a1b3Sopenharmony_ci r = pa_scache_add_file_lazy(c, n, fname, NULL); 123953a5a1b3Sopenharmony_ci else 124053a5a1b3Sopenharmony_ci r = pa_scache_add_file(c, n, fname, NULL); 124153a5a1b3Sopenharmony_ci 124253a5a1b3Sopenharmony_ci if (r < 0) 124353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to load sound file.\n"); 124453a5a1b3Sopenharmony_ci 124553a5a1b3Sopenharmony_ci return 0; 124653a5a1b3Sopenharmony_ci} 124753a5a1b3Sopenharmony_ci 124853a5a1b3Sopenharmony_cistatic int pa_cli_command_scache_load_dir(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 124953a5a1b3Sopenharmony_ci const char *pname; 125053a5a1b3Sopenharmony_ci 125153a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 125253a5a1b3Sopenharmony_ci pa_assert(t); 125353a5a1b3Sopenharmony_ci pa_assert(buf); 125453a5a1b3Sopenharmony_ci pa_assert(fail); 125553a5a1b3Sopenharmony_ci 125653a5a1b3Sopenharmony_ci if (!(pname = pa_tokenizer_get(t, 1))) { 125753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a path name.\n"); 125853a5a1b3Sopenharmony_ci return -1; 125953a5a1b3Sopenharmony_ci } 126053a5a1b3Sopenharmony_ci 126153a5a1b3Sopenharmony_ci if (pa_scache_add_directory_lazy(c, pname) < 0) { 126253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to load directory.\n"); 126353a5a1b3Sopenharmony_ci return -1; 126453a5a1b3Sopenharmony_ci } 126553a5a1b3Sopenharmony_ci 126653a5a1b3Sopenharmony_ci return 0; 126753a5a1b3Sopenharmony_ci} 126853a5a1b3Sopenharmony_ci 126953a5a1b3Sopenharmony_cistatic int pa_cli_command_play_file(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 127053a5a1b3Sopenharmony_ci const char *fname, *sink_name; 127153a5a1b3Sopenharmony_ci pa_sink *sink; 127253a5a1b3Sopenharmony_ci 127353a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 127453a5a1b3Sopenharmony_ci pa_assert(t); 127553a5a1b3Sopenharmony_ci pa_assert(buf); 127653a5a1b3Sopenharmony_ci pa_assert(fail); 127753a5a1b3Sopenharmony_ci 127853a5a1b3Sopenharmony_ci if (!(fname = pa_tokenizer_get(t, 1)) || !(sink_name = pa_tokenizer_get(t, 2))) { 127953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a file name and a sink name.\n"); 128053a5a1b3Sopenharmony_ci return -1; 128153a5a1b3Sopenharmony_ci } 128253a5a1b3Sopenharmony_ci 128353a5a1b3Sopenharmony_ci if (!(sink = pa_namereg_get(c, sink_name, PA_NAMEREG_SINK))) { 128453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink by that name.\n"); 128553a5a1b3Sopenharmony_ci return -1; 128653a5a1b3Sopenharmony_ci } 128753a5a1b3Sopenharmony_ci#ifdef SNDFILE_ENABLE 128853a5a1b3Sopenharmony_ci if (pa_play_file(sink, fname, NULL) < 0) { 128953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to play sound file.\n"); 129053a5a1b3Sopenharmony_ci return -1; 129153a5a1b3Sopenharmony_ci } 129253a5a1b3Sopenharmony_ci#else 129353a5a1b3Sopenharmony_ci return -1; 129453a5a1b3Sopenharmony_ci#endif 129553a5a1b3Sopenharmony_ci return 0; 129653a5a1b3Sopenharmony_ci} 129753a5a1b3Sopenharmony_ci 129853a5a1b3Sopenharmony_cistatic int pa_cli_command_list_shared_props(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 129953a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 130053a5a1b3Sopenharmony_ci pa_assert(t); 130153a5a1b3Sopenharmony_ci pa_assert(buf); 130253a5a1b3Sopenharmony_ci pa_assert(fail); 130353a5a1b3Sopenharmony_ci 130453a5a1b3Sopenharmony_ci pa_shared_dump(c, buf); 130553a5a1b3Sopenharmony_ci return 0; 130653a5a1b3Sopenharmony_ci} 130753a5a1b3Sopenharmony_ci 130853a5a1b3Sopenharmony_cistatic int pa_cli_command_vacuum(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 130953a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 131053a5a1b3Sopenharmony_ci pa_assert(t); 131153a5a1b3Sopenharmony_ci pa_assert(buf); 131253a5a1b3Sopenharmony_ci pa_assert(fail); 131353a5a1b3Sopenharmony_ci 131453a5a1b3Sopenharmony_ci pa_mempool_vacuum(c->mempool); 131553a5a1b3Sopenharmony_ci 131653a5a1b3Sopenharmony_ci return 0; 131753a5a1b3Sopenharmony_ci} 131853a5a1b3Sopenharmony_ci 131953a5a1b3Sopenharmony_cistatic int pa_cli_command_move_sink_input(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 132053a5a1b3Sopenharmony_ci const char *n, *k; 132153a5a1b3Sopenharmony_ci pa_sink_input *si; 132253a5a1b3Sopenharmony_ci pa_sink *sink; 132353a5a1b3Sopenharmony_ci uint32_t idx; 132453a5a1b3Sopenharmony_ci 132553a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 132653a5a1b3Sopenharmony_ci pa_assert(t); 132753a5a1b3Sopenharmony_ci pa_assert(buf); 132853a5a1b3Sopenharmony_ci pa_assert(fail); 132953a5a1b3Sopenharmony_ci 133053a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 133153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink input by its index.\n"); 133253a5a1b3Sopenharmony_ci return -1; 133353a5a1b3Sopenharmony_ci } 133453a5a1b3Sopenharmony_ci 133553a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 133653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 133753a5a1b3Sopenharmony_ci return -1; 133853a5a1b3Sopenharmony_ci } 133953a5a1b3Sopenharmony_ci 134053a5a1b3Sopenharmony_ci if (!(k = pa_tokenizer_get(t, 2))) { 134153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink.\n"); 134253a5a1b3Sopenharmony_ci return -1; 134353a5a1b3Sopenharmony_ci } 134453a5a1b3Sopenharmony_ci 134553a5a1b3Sopenharmony_ci if (!(si = pa_idxset_get_by_index(c->sink_inputs, (uint32_t) idx))) { 134653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink input found with this index.\n"); 134753a5a1b3Sopenharmony_ci return -1; 134853a5a1b3Sopenharmony_ci } 134953a5a1b3Sopenharmony_ci 135053a5a1b3Sopenharmony_ci if (!(sink = pa_namereg_get(c, k, PA_NAMEREG_SINK))) { 135153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink found by this name or index.\n"); 135253a5a1b3Sopenharmony_ci return -1; 135353a5a1b3Sopenharmony_ci } 135453a5a1b3Sopenharmony_ci 135553a5a1b3Sopenharmony_ci if (pa_sink_input_move_to(si, sink, true) < 0) { 135653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Moved failed.\n"); 135753a5a1b3Sopenharmony_ci return -1; 135853a5a1b3Sopenharmony_ci } 135953a5a1b3Sopenharmony_ci return 0; 136053a5a1b3Sopenharmony_ci} 136153a5a1b3Sopenharmony_ci 136253a5a1b3Sopenharmony_cistatic int pa_cli_command_move_source_output(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 136353a5a1b3Sopenharmony_ci const char *n, *k; 136453a5a1b3Sopenharmony_ci pa_source_output *so; 136553a5a1b3Sopenharmony_ci pa_source *source; 136653a5a1b3Sopenharmony_ci uint32_t idx; 136753a5a1b3Sopenharmony_ci 136853a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 136953a5a1b3Sopenharmony_ci pa_assert(t); 137053a5a1b3Sopenharmony_ci pa_assert(buf); 137153a5a1b3Sopenharmony_ci pa_assert(fail); 137253a5a1b3Sopenharmony_ci 137353a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 137453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source output by its index.\n"); 137553a5a1b3Sopenharmony_ci return -1; 137653a5a1b3Sopenharmony_ci } 137753a5a1b3Sopenharmony_ci 137853a5a1b3Sopenharmony_ci if ((idx = parse_index(n)) == PA_IDXSET_INVALID) { 137953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse index.\n"); 138053a5a1b3Sopenharmony_ci return -1; 138153a5a1b3Sopenharmony_ci } 138253a5a1b3Sopenharmony_ci 138353a5a1b3Sopenharmony_ci if (!(k = pa_tokenizer_get(t, 2))) { 138453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source.\n"); 138553a5a1b3Sopenharmony_ci return -1; 138653a5a1b3Sopenharmony_ci } 138753a5a1b3Sopenharmony_ci 138853a5a1b3Sopenharmony_ci if (!(so = pa_idxset_get_by_index(c->source_outputs, (uint32_t) idx))) { 138953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source output found with this index.\n"); 139053a5a1b3Sopenharmony_ci return -1; 139153a5a1b3Sopenharmony_ci } 139253a5a1b3Sopenharmony_ci 139353a5a1b3Sopenharmony_ci if (!(source = pa_namereg_get(c, k, PA_NAMEREG_SOURCE))) { 139453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source found by this name or index.\n"); 139553a5a1b3Sopenharmony_ci return -1; 139653a5a1b3Sopenharmony_ci } 139753a5a1b3Sopenharmony_ci 139853a5a1b3Sopenharmony_ci if (pa_source_output_move_to(so, source, true) < 0) { 139953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Moved failed.\n"); 140053a5a1b3Sopenharmony_ci return -1; 140153a5a1b3Sopenharmony_ci } 140253a5a1b3Sopenharmony_ci return 0; 140353a5a1b3Sopenharmony_ci} 140453a5a1b3Sopenharmony_ci 140553a5a1b3Sopenharmony_cistatic int pa_cli_command_suspend_sink(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 140653a5a1b3Sopenharmony_ci const char *n, *m; 140753a5a1b3Sopenharmony_ci pa_sink *sink; 140853a5a1b3Sopenharmony_ci int suspend, r; 140953a5a1b3Sopenharmony_ci 141053a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 141153a5a1b3Sopenharmony_ci pa_assert(t); 141253a5a1b3Sopenharmony_ci pa_assert(buf); 141353a5a1b3Sopenharmony_ci pa_assert(fail); 141453a5a1b3Sopenharmony_ci 141553a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 141653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink either by its name or its index.\n"); 141753a5a1b3Sopenharmony_ci return -1; 141853a5a1b3Sopenharmony_ci } 141953a5a1b3Sopenharmony_ci 142053a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 2))) { 142153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a suspend switch setting (0/1).\n"); 142253a5a1b3Sopenharmony_ci return -1; 142353a5a1b3Sopenharmony_ci } 142453a5a1b3Sopenharmony_ci 142553a5a1b3Sopenharmony_ci if ((suspend = pa_parse_boolean(m)) < 0) { 142653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse suspend switch.\n"); 142753a5a1b3Sopenharmony_ci return -1; 142853a5a1b3Sopenharmony_ci } 142953a5a1b3Sopenharmony_ci 143053a5a1b3Sopenharmony_ci if (!(sink = pa_namereg_get(c, n, PA_NAMEREG_SINK))) { 143153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink found by this name or index.\n"); 143253a5a1b3Sopenharmony_ci return -1; 143353a5a1b3Sopenharmony_ci } 143453a5a1b3Sopenharmony_ci 143553a5a1b3Sopenharmony_ci pa_log_debug("%s of sink %s requested via CLI.", suspend ? "Suspending" : "Resuming", sink->name); 143653a5a1b3Sopenharmony_ci 143753a5a1b3Sopenharmony_ci if ((r = pa_sink_suspend(sink, suspend, PA_SUSPEND_USER)) < 0) 143853a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Failed to resume/suspend sink: %s\n", pa_strerror(r)); 143953a5a1b3Sopenharmony_ci 144053a5a1b3Sopenharmony_ci return 0; 144153a5a1b3Sopenharmony_ci} 144253a5a1b3Sopenharmony_ci 144353a5a1b3Sopenharmony_cistatic int pa_cli_command_suspend_source(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 144453a5a1b3Sopenharmony_ci const char *n, *m; 144553a5a1b3Sopenharmony_ci pa_source *source; 144653a5a1b3Sopenharmony_ci int suspend, r; 144753a5a1b3Sopenharmony_ci 144853a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 144953a5a1b3Sopenharmony_ci pa_assert(t); 145053a5a1b3Sopenharmony_ci pa_assert(buf); 145153a5a1b3Sopenharmony_ci pa_assert(fail); 145253a5a1b3Sopenharmony_ci 145353a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 145453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source either by its name or its index.\n"); 145553a5a1b3Sopenharmony_ci return -1; 145653a5a1b3Sopenharmony_ci } 145753a5a1b3Sopenharmony_ci 145853a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 2))) { 145953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a suspend switch setting (0/1).\n"); 146053a5a1b3Sopenharmony_ci return -1; 146153a5a1b3Sopenharmony_ci } 146253a5a1b3Sopenharmony_ci 146353a5a1b3Sopenharmony_ci if ((suspend = pa_parse_boolean(m)) < 0) { 146453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse suspend switch.\n"); 146553a5a1b3Sopenharmony_ci return -1; 146653a5a1b3Sopenharmony_ci } 146753a5a1b3Sopenharmony_ci 146853a5a1b3Sopenharmony_ci if (!(source = pa_namereg_get(c, n, PA_NAMEREG_SOURCE))) { 146953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source found by this name or index.\n"); 147053a5a1b3Sopenharmony_ci return -1; 147153a5a1b3Sopenharmony_ci } 147253a5a1b3Sopenharmony_ci 147353a5a1b3Sopenharmony_ci pa_log_debug("%s of source %s requested via CLI.", suspend ? "Suspending" : "Resuming", source->name); 147453a5a1b3Sopenharmony_ci 147553a5a1b3Sopenharmony_ci if ((r = pa_source_suspend(source, suspend, PA_SUSPEND_USER)) < 0) 147653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Failed to resume/suspend source: %s\n", pa_strerror(r)); 147753a5a1b3Sopenharmony_ci 147853a5a1b3Sopenharmony_ci return 0; 147953a5a1b3Sopenharmony_ci} 148053a5a1b3Sopenharmony_ci 148153a5a1b3Sopenharmony_cistatic int pa_cli_command_suspend(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 148253a5a1b3Sopenharmony_ci const char *m; 148353a5a1b3Sopenharmony_ci int suspend, r; 148453a5a1b3Sopenharmony_ci 148553a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 148653a5a1b3Sopenharmony_ci pa_assert(t); 148753a5a1b3Sopenharmony_ci pa_assert(buf); 148853a5a1b3Sopenharmony_ci pa_assert(fail); 148953a5a1b3Sopenharmony_ci 149053a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 1))) { 149153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a suspend switch setting (0/1).\n"); 149253a5a1b3Sopenharmony_ci return -1; 149353a5a1b3Sopenharmony_ci } 149453a5a1b3Sopenharmony_ci 149553a5a1b3Sopenharmony_ci if ((suspend = pa_parse_boolean(m)) < 0) { 149653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse suspend switch.\n"); 149753a5a1b3Sopenharmony_ci return -1; 149853a5a1b3Sopenharmony_ci } 149953a5a1b3Sopenharmony_ci 150053a5a1b3Sopenharmony_ci pa_log_debug("%s of all sinks and sources requested via CLI.", suspend ? "Suspending" : "Resuming"); 150153a5a1b3Sopenharmony_ci 150253a5a1b3Sopenharmony_ci if ((r = pa_sink_suspend_all(c, suspend, PA_SUSPEND_USER)) < 0) 150353a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Failed to resume/suspend all sinks: %s\n", pa_strerror(r)); 150453a5a1b3Sopenharmony_ci 150553a5a1b3Sopenharmony_ci if ((r = pa_source_suspend_all(c, suspend, PA_SUSPEND_USER)) < 0) 150653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Failed to resume/suspend all sources: %s\n", pa_strerror(r)); 150753a5a1b3Sopenharmony_ci 150853a5a1b3Sopenharmony_ci return 0; 150953a5a1b3Sopenharmony_ci} 151053a5a1b3Sopenharmony_ci 151153a5a1b3Sopenharmony_cistatic int pa_cli_command_log_target(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 151253a5a1b3Sopenharmony_ci const char *m; 151353a5a1b3Sopenharmony_ci pa_log_target *log_target = NULL; 151453a5a1b3Sopenharmony_ci 151553a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 151653a5a1b3Sopenharmony_ci pa_assert(t); 151753a5a1b3Sopenharmony_ci pa_assert(buf); 151853a5a1b3Sopenharmony_ci pa_assert(fail); 151953a5a1b3Sopenharmony_ci 152053a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 1))) { 152153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a log target (null|auto|syslog|stderr|file:PATH|newfile:PATH).\n"); 152253a5a1b3Sopenharmony_ci return -1; 152353a5a1b3Sopenharmony_ci } 152453a5a1b3Sopenharmony_ci 152553a5a1b3Sopenharmony_ci /* 'auto' is actually the effect with 'stderr' */ 152653a5a1b3Sopenharmony_ci if (pa_streq(m, "auto")) 152753a5a1b3Sopenharmony_ci log_target = pa_log_target_new(PA_LOG_STDERR, NULL); 152853a5a1b3Sopenharmony_ci else { 152953a5a1b3Sopenharmony_ci log_target = pa_log_parse_target(m); 153053a5a1b3Sopenharmony_ci 153153a5a1b3Sopenharmony_ci if (!log_target) { 153253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Invalid log target.\n"); 153353a5a1b3Sopenharmony_ci return -1; 153453a5a1b3Sopenharmony_ci } 153553a5a1b3Sopenharmony_ci } 153653a5a1b3Sopenharmony_ci 153753a5a1b3Sopenharmony_ci if (pa_log_set_target(log_target) < 0) { 153853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to set log target.\n"); 153953a5a1b3Sopenharmony_ci pa_log_target_free(log_target); 154053a5a1b3Sopenharmony_ci return -1; 154153a5a1b3Sopenharmony_ci } 154253a5a1b3Sopenharmony_ci 154353a5a1b3Sopenharmony_ci pa_log_target_free(log_target); 154453a5a1b3Sopenharmony_ci 154553a5a1b3Sopenharmony_ci return 0; 154653a5a1b3Sopenharmony_ci} 154753a5a1b3Sopenharmony_ci 154853a5a1b3Sopenharmony_cistatic int pa_cli_command_log_level(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 154953a5a1b3Sopenharmony_ci const char *m; 155053a5a1b3Sopenharmony_ci uint32_t level; 155153a5a1b3Sopenharmony_ci 155253a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 155353a5a1b3Sopenharmony_ci pa_assert(t); 155453a5a1b3Sopenharmony_ci pa_assert(buf); 155553a5a1b3Sopenharmony_ci pa_assert(fail); 155653a5a1b3Sopenharmony_ci 155753a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 1))) { 155853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a log level (0..4).\n"); 155953a5a1b3Sopenharmony_ci return -1; 156053a5a1b3Sopenharmony_ci } 156153a5a1b3Sopenharmony_ci 156253a5a1b3Sopenharmony_ci if (pa_atou(m, &level) < 0 || level >= PA_LOG_LEVEL_MAX) { 156353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse log level.\n"); 156453a5a1b3Sopenharmony_ci return -1; 156553a5a1b3Sopenharmony_ci } 156653a5a1b3Sopenharmony_ci 156753a5a1b3Sopenharmony_ci pa_log_set_level(level); 156853a5a1b3Sopenharmony_ci 156953a5a1b3Sopenharmony_ci return 0; 157053a5a1b3Sopenharmony_ci} 157153a5a1b3Sopenharmony_ci 157253a5a1b3Sopenharmony_cistatic int pa_cli_command_log_meta(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 157353a5a1b3Sopenharmony_ci const char *m; 157453a5a1b3Sopenharmony_ci int b; 157553a5a1b3Sopenharmony_ci 157653a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 157753a5a1b3Sopenharmony_ci pa_assert(t); 157853a5a1b3Sopenharmony_ci pa_assert(buf); 157953a5a1b3Sopenharmony_ci pa_assert(fail); 158053a5a1b3Sopenharmony_ci 158153a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 1))) { 158253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a boolean.\n"); 158353a5a1b3Sopenharmony_ci return -1; 158453a5a1b3Sopenharmony_ci } 158553a5a1b3Sopenharmony_ci 158653a5a1b3Sopenharmony_ci if ((b = pa_parse_boolean(m)) < 0) { 158753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse log meta switch.\n"); 158853a5a1b3Sopenharmony_ci return -1; 158953a5a1b3Sopenharmony_ci } 159053a5a1b3Sopenharmony_ci 159153a5a1b3Sopenharmony_ci pa_log_set_flags(PA_LOG_PRINT_META, b ? PA_LOG_SET : PA_LOG_UNSET); 159253a5a1b3Sopenharmony_ci 159353a5a1b3Sopenharmony_ci return 0; 159453a5a1b3Sopenharmony_ci} 159553a5a1b3Sopenharmony_ci 159653a5a1b3Sopenharmony_cistatic int pa_cli_command_log_time(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 159753a5a1b3Sopenharmony_ci const char *m; 159853a5a1b3Sopenharmony_ci int b; 159953a5a1b3Sopenharmony_ci 160053a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 160153a5a1b3Sopenharmony_ci pa_assert(t); 160253a5a1b3Sopenharmony_ci pa_assert(buf); 160353a5a1b3Sopenharmony_ci pa_assert(fail); 160453a5a1b3Sopenharmony_ci 160553a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 1))) { 160653a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a boolean.\n"); 160753a5a1b3Sopenharmony_ci return -1; 160853a5a1b3Sopenharmony_ci } 160953a5a1b3Sopenharmony_ci 161053a5a1b3Sopenharmony_ci if ((b = pa_parse_boolean(m)) < 0) { 161153a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse log meta switch.\n"); 161253a5a1b3Sopenharmony_ci return -1; 161353a5a1b3Sopenharmony_ci } 161453a5a1b3Sopenharmony_ci 161553a5a1b3Sopenharmony_ci pa_log_set_flags(PA_LOG_PRINT_TIME, b ? PA_LOG_SET : PA_LOG_UNSET); 161653a5a1b3Sopenharmony_ci 161753a5a1b3Sopenharmony_ci return 0; 161853a5a1b3Sopenharmony_ci} 161953a5a1b3Sopenharmony_ci 162053a5a1b3Sopenharmony_cistatic int pa_cli_command_log_backtrace(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 162153a5a1b3Sopenharmony_ci const char *m; 162253a5a1b3Sopenharmony_ci uint32_t nframes; 162353a5a1b3Sopenharmony_ci 162453a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 162553a5a1b3Sopenharmony_ci pa_assert(t); 162653a5a1b3Sopenharmony_ci pa_assert(buf); 162753a5a1b3Sopenharmony_ci pa_assert(fail); 162853a5a1b3Sopenharmony_ci 162953a5a1b3Sopenharmony_ci if (!(m = pa_tokenizer_get(t, 1))) { 163053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a backtrace level.\n"); 163153a5a1b3Sopenharmony_ci return -1; 163253a5a1b3Sopenharmony_ci } 163353a5a1b3Sopenharmony_ci 163453a5a1b3Sopenharmony_ci if (pa_atou(m, &nframes) < 0 || nframes >= 1000) { 163553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse backtrace level.\n"); 163653a5a1b3Sopenharmony_ci return -1; 163753a5a1b3Sopenharmony_ci } 163853a5a1b3Sopenharmony_ci 163953a5a1b3Sopenharmony_ci pa_log_set_show_backtrace(nframes); 164053a5a1b3Sopenharmony_ci 164153a5a1b3Sopenharmony_ci return 0; 164253a5a1b3Sopenharmony_ci} 164353a5a1b3Sopenharmony_ci 164453a5a1b3Sopenharmony_cistatic int pa_cli_command_card_profile(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 164553a5a1b3Sopenharmony_ci const char *n, *p; 164653a5a1b3Sopenharmony_ci pa_card *card; 164753a5a1b3Sopenharmony_ci pa_card_profile *profile; 164853a5a1b3Sopenharmony_ci 164953a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 165053a5a1b3Sopenharmony_ci pa_assert(t); 165153a5a1b3Sopenharmony_ci pa_assert(buf); 165253a5a1b3Sopenharmony_ci pa_assert(fail); 165353a5a1b3Sopenharmony_ci 165453a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 165553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a card either by its name or its index.\n"); 165653a5a1b3Sopenharmony_ci return -1; 165753a5a1b3Sopenharmony_ci } 165853a5a1b3Sopenharmony_ci 165953a5a1b3Sopenharmony_ci if (!(p = pa_tokenizer_get(t, 2))) { 166053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a profile by its name.\n"); 166153a5a1b3Sopenharmony_ci return -1; 166253a5a1b3Sopenharmony_ci } 166353a5a1b3Sopenharmony_ci 166453a5a1b3Sopenharmony_ci if (!(card = pa_namereg_get(c, n, PA_NAMEREG_CARD))) { 166553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No card found by this name or index.\n"); 166653a5a1b3Sopenharmony_ci return -1; 166753a5a1b3Sopenharmony_ci } 166853a5a1b3Sopenharmony_ci 166953a5a1b3Sopenharmony_ci if (!(profile = pa_hashmap_get(card->profiles, p))) { 167053a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "No such profile: %s\n", p); 167153a5a1b3Sopenharmony_ci return -1; 167253a5a1b3Sopenharmony_ci } 167353a5a1b3Sopenharmony_ci 167453a5a1b3Sopenharmony_ci if (pa_card_set_profile(card, profile, true) < 0) { 167553a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Failed to set card profile to '%s'.\n", p); 167653a5a1b3Sopenharmony_ci return -1; 167753a5a1b3Sopenharmony_ci } 167853a5a1b3Sopenharmony_ci 167953a5a1b3Sopenharmony_ci return 0; 168053a5a1b3Sopenharmony_ci} 168153a5a1b3Sopenharmony_ci 168253a5a1b3Sopenharmony_cistatic int pa_cli_command_sink_port(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 168353a5a1b3Sopenharmony_ci const char *n, *p; 168453a5a1b3Sopenharmony_ci pa_sink *sink; 168553a5a1b3Sopenharmony_ci 168653a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 168753a5a1b3Sopenharmony_ci pa_assert(t); 168853a5a1b3Sopenharmony_ci pa_assert(buf); 168953a5a1b3Sopenharmony_ci pa_assert(fail); 169053a5a1b3Sopenharmony_ci 169153a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 169253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a sink either by its name or its index.\n"); 169353a5a1b3Sopenharmony_ci return -1; 169453a5a1b3Sopenharmony_ci } 169553a5a1b3Sopenharmony_ci 169653a5a1b3Sopenharmony_ci if (!(p = pa_tokenizer_get(t, 2))) { 169753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a profile by its name.\n"); 169853a5a1b3Sopenharmony_ci return -1; 169953a5a1b3Sopenharmony_ci } 170053a5a1b3Sopenharmony_ci 170153a5a1b3Sopenharmony_ci if (!(sink = pa_namereg_get(c, n, PA_NAMEREG_SINK))) { 170253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No sink found by this name or index.\n"); 170353a5a1b3Sopenharmony_ci return -1; 170453a5a1b3Sopenharmony_ci } 170553a5a1b3Sopenharmony_ci 170653a5a1b3Sopenharmony_ci if (pa_sink_set_port(sink, p, true) < 0) { 170753a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Failed to set sink port to '%s'.\n", p); 170853a5a1b3Sopenharmony_ci return -1; 170953a5a1b3Sopenharmony_ci } 171053a5a1b3Sopenharmony_ci 171153a5a1b3Sopenharmony_ci return 0; 171253a5a1b3Sopenharmony_ci} 171353a5a1b3Sopenharmony_ci 171453a5a1b3Sopenharmony_cistatic int pa_cli_command_source_port(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 171553a5a1b3Sopenharmony_ci const char *n, *p; 171653a5a1b3Sopenharmony_ci pa_source *source; 171753a5a1b3Sopenharmony_ci 171853a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 171953a5a1b3Sopenharmony_ci pa_assert(t); 172053a5a1b3Sopenharmony_ci pa_assert(buf); 172153a5a1b3Sopenharmony_ci pa_assert(fail); 172253a5a1b3Sopenharmony_ci 172353a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 172453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a source either by its name or its index.\n"); 172553a5a1b3Sopenharmony_ci return -1; 172653a5a1b3Sopenharmony_ci } 172753a5a1b3Sopenharmony_ci 172853a5a1b3Sopenharmony_ci if (!(p = pa_tokenizer_get(t, 2))) { 172953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a profile by its name.\n"); 173053a5a1b3Sopenharmony_ci return -1; 173153a5a1b3Sopenharmony_ci } 173253a5a1b3Sopenharmony_ci 173353a5a1b3Sopenharmony_ci if (!(source = pa_namereg_get(c, n, PA_NAMEREG_SOURCE))) { 173453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No source found by this name or index.\n"); 173553a5a1b3Sopenharmony_ci return -1; 173653a5a1b3Sopenharmony_ci } 173753a5a1b3Sopenharmony_ci 173853a5a1b3Sopenharmony_ci if (pa_source_set_port(source, p, true) < 0) { 173953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Failed to set source port to '%s'.\n", p); 174053a5a1b3Sopenharmony_ci return -1; 174153a5a1b3Sopenharmony_ci } 174253a5a1b3Sopenharmony_ci 174353a5a1b3Sopenharmony_ci return 0; 174453a5a1b3Sopenharmony_ci} 174553a5a1b3Sopenharmony_ci 174653a5a1b3Sopenharmony_cistatic int pa_cli_command_port_offset(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 174753a5a1b3Sopenharmony_ci const char *n, *p, *l; 174853a5a1b3Sopenharmony_ci pa_device_port *port; 174953a5a1b3Sopenharmony_ci pa_card *card; 175053a5a1b3Sopenharmony_ci int32_t offset; 175153a5a1b3Sopenharmony_ci 175253a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 175353a5a1b3Sopenharmony_ci pa_assert(t); 175453a5a1b3Sopenharmony_ci pa_assert(buf); 175553a5a1b3Sopenharmony_ci pa_assert(fail); 175653a5a1b3Sopenharmony_ci 175753a5a1b3Sopenharmony_ci if (!(n = pa_tokenizer_get(t, 1))) { 175853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a card either by its name or its index.\n"); 175953a5a1b3Sopenharmony_ci return -1; 176053a5a1b3Sopenharmony_ci } 176153a5a1b3Sopenharmony_ci 176253a5a1b3Sopenharmony_ci if (!(p = pa_tokenizer_get(t, 2))) { 176353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a port by its name.\n"); 176453a5a1b3Sopenharmony_ci return -1; 176553a5a1b3Sopenharmony_ci } 176653a5a1b3Sopenharmony_ci 176753a5a1b3Sopenharmony_ci if (!(l = pa_tokenizer_get(t, 3))) { 176853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a latency offset.\n"); 176953a5a1b3Sopenharmony_ci return -1; 177053a5a1b3Sopenharmony_ci } 177153a5a1b3Sopenharmony_ci 177253a5a1b3Sopenharmony_ci if (pa_atoi(l, &offset) < 0) { 177353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "Failed to parse the latency offset.\n"); 177453a5a1b3Sopenharmony_ci return -1; 177553a5a1b3Sopenharmony_ci } 177653a5a1b3Sopenharmony_ci 177753a5a1b3Sopenharmony_ci if (!(card = pa_namereg_get(c, n, PA_NAMEREG_CARD))) { 177853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No card found by this name or index.\n"); 177953a5a1b3Sopenharmony_ci return -1; 178053a5a1b3Sopenharmony_ci } 178153a5a1b3Sopenharmony_ci 178253a5a1b3Sopenharmony_ci if (!(port = pa_hashmap_get(card->ports, p))) { 178353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "No port found by this name.\n"); 178453a5a1b3Sopenharmony_ci return -1; 178553a5a1b3Sopenharmony_ci } 178653a5a1b3Sopenharmony_ci 178753a5a1b3Sopenharmony_ci pa_device_port_set_latency_offset(port, offset); 178853a5a1b3Sopenharmony_ci 178953a5a1b3Sopenharmony_ci return 0; 179053a5a1b3Sopenharmony_ci} 179153a5a1b3Sopenharmony_ci 179253a5a1b3Sopenharmony_cistatic int pa_cli_command_send_message_to_object(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 179353a5a1b3Sopenharmony_ci const char *object_path, *message, *message_parameters; 179453a5a1b3Sopenharmony_ci char *response = NULL; 179553a5a1b3Sopenharmony_ci int ret; 179653a5a1b3Sopenharmony_ci 179753a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 179853a5a1b3Sopenharmony_ci pa_assert(t); 179953a5a1b3Sopenharmony_ci pa_assert(buf); 180053a5a1b3Sopenharmony_ci pa_assert(fail); 180153a5a1b3Sopenharmony_ci 180253a5a1b3Sopenharmony_ci 180353a5a1b3Sopenharmony_ci if (!(object_path = pa_tokenizer_get(t, 1))) { 180453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify an object path as recipient for the message.\n"); 180553a5a1b3Sopenharmony_ci return -1; 180653a5a1b3Sopenharmony_ci } 180753a5a1b3Sopenharmony_ci 180853a5a1b3Sopenharmony_ci if (!(message = pa_tokenizer_get(t, 2))) { 180953a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "You need to specify a message name.\n"); 181053a5a1b3Sopenharmony_ci return -1; 181153a5a1b3Sopenharmony_ci } 181253a5a1b3Sopenharmony_ci 181353a5a1b3Sopenharmony_ci /* parameters may be NULL */ 181453a5a1b3Sopenharmony_ci message_parameters = pa_tokenizer_get(t, 3); 181553a5a1b3Sopenharmony_ci 181653a5a1b3Sopenharmony_ci ret = pa_message_handler_send_message(c, object_path, message, message_parameters, &response); 181753a5a1b3Sopenharmony_ci 181853a5a1b3Sopenharmony_ci if (ret < 0) { 181953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Send message failed: %s\n", pa_strerror(ret)); 182053a5a1b3Sopenharmony_ci ret = -1; 182153a5a1b3Sopenharmony_ci 182253a5a1b3Sopenharmony_ci } else { 182353a5a1b3Sopenharmony_ci if (response) 182453a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, response); 182553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "\n"); 182653a5a1b3Sopenharmony_ci ret = 0; 182753a5a1b3Sopenharmony_ci } 182853a5a1b3Sopenharmony_ci 182953a5a1b3Sopenharmony_ci pa_xfree(response); 183053a5a1b3Sopenharmony_ci return ret; 183153a5a1b3Sopenharmony_ci} 183253a5a1b3Sopenharmony_ci 183353a5a1b3Sopenharmony_cistatic int pa_cli_command_dump(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 183453a5a1b3Sopenharmony_ci pa_module *m; 183553a5a1b3Sopenharmony_ci pa_sink *sink; 183653a5a1b3Sopenharmony_ci pa_source *source; 183753a5a1b3Sopenharmony_ci pa_card *card; 183853a5a1b3Sopenharmony_ci bool nl; 183953a5a1b3Sopenharmony_ci uint32_t idx; 184053a5a1b3Sopenharmony_ci time_t now; 184153a5a1b3Sopenharmony_ci#ifdef HAVE_CTIME_R 184253a5a1b3Sopenharmony_ci char txt[256]; 184353a5a1b3Sopenharmony_ci#endif 184453a5a1b3Sopenharmony_ci 184553a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 184653a5a1b3Sopenharmony_ci pa_assert(t); 184753a5a1b3Sopenharmony_ci pa_assert(buf); 184853a5a1b3Sopenharmony_ci pa_assert(fail); 184953a5a1b3Sopenharmony_ci 185053a5a1b3Sopenharmony_ci time(&now); 185153a5a1b3Sopenharmony_ci 185253a5a1b3Sopenharmony_ci#ifdef HAVE_CTIME_R 185353a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "### Configuration dump generated at %s\n", ctime_r(&now, txt)); 185453a5a1b3Sopenharmony_ci#else 185553a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "### Configuration dump generated at %s\n", ctime(&now)); 185653a5a1b3Sopenharmony_ci#endif 185753a5a1b3Sopenharmony_ci 185853a5a1b3Sopenharmony_ci PA_IDXSET_FOREACH(m, c->modules, idx) { 185953a5a1b3Sopenharmony_ci 186053a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "load-module %s", m->name); 186153a5a1b3Sopenharmony_ci 186253a5a1b3Sopenharmony_ci if (m->argument) 186353a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, " %s", m->argument); 186453a5a1b3Sopenharmony_ci 186553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "\n"); 186653a5a1b3Sopenharmony_ci } 186753a5a1b3Sopenharmony_ci 186853a5a1b3Sopenharmony_ci nl = false; 186953a5a1b3Sopenharmony_ci PA_IDXSET_FOREACH(sink, c->sinks, idx) { 187053a5a1b3Sopenharmony_ci 187153a5a1b3Sopenharmony_ci if (!nl) { 187253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "\n"); 187353a5a1b3Sopenharmony_ci nl = true; 187453a5a1b3Sopenharmony_ci } 187553a5a1b3Sopenharmony_ci 187653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "set-sink-volume %s 0x%03x\n", sink->name, pa_cvolume_max(pa_sink_get_volume(sink, false))); 187753a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "set-sink-mute %s %s\n", sink->name, pa_yes_no(pa_sink_get_mute(sink, false))); 187853a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "suspend-sink %s %s\n", sink->name, pa_yes_no(sink->state == PA_SINK_SUSPENDED)); 187953a5a1b3Sopenharmony_ci } 188053a5a1b3Sopenharmony_ci 188153a5a1b3Sopenharmony_ci nl = false; 188253a5a1b3Sopenharmony_ci PA_IDXSET_FOREACH(source, c->sources, idx) { 188353a5a1b3Sopenharmony_ci 188453a5a1b3Sopenharmony_ci if (!nl) { 188553a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "\n"); 188653a5a1b3Sopenharmony_ci nl = true; 188753a5a1b3Sopenharmony_ci } 188853a5a1b3Sopenharmony_ci 188953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "set-source-volume %s 0x%03x\n", source->name, pa_cvolume_max(pa_source_get_volume(source, false))); 189053a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "set-source-mute %s %s\n", source->name, pa_yes_no(pa_source_get_mute(source, false))); 189153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "suspend-source %s %s\n", source->name, pa_yes_no(source->state == PA_SOURCE_SUSPENDED)); 189253a5a1b3Sopenharmony_ci } 189353a5a1b3Sopenharmony_ci 189453a5a1b3Sopenharmony_ci nl = false; 189553a5a1b3Sopenharmony_ci PA_IDXSET_FOREACH(card, c->cards, idx) { 189653a5a1b3Sopenharmony_ci 189753a5a1b3Sopenharmony_ci if (!nl) { 189853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "\n"); 189953a5a1b3Sopenharmony_ci nl = true; 190053a5a1b3Sopenharmony_ci } 190153a5a1b3Sopenharmony_ci 190253a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "set-card-profile %s %s\n", card->name, card->active_profile->name); 190353a5a1b3Sopenharmony_ci } 190453a5a1b3Sopenharmony_ci 190553a5a1b3Sopenharmony_ci nl = false; 190653a5a1b3Sopenharmony_ci if (c->default_sink) { 190753a5a1b3Sopenharmony_ci if (!nl) { 190853a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "\n"); 190953a5a1b3Sopenharmony_ci nl = true; 191053a5a1b3Sopenharmony_ci } 191153a5a1b3Sopenharmony_ci 191253a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "set-default-sink %s\n", c->default_sink->name); 191353a5a1b3Sopenharmony_ci } 191453a5a1b3Sopenharmony_ci 191553a5a1b3Sopenharmony_ci if (c->default_source) { 191653a5a1b3Sopenharmony_ci if (!nl) 191753a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "\n"); 191853a5a1b3Sopenharmony_ci 191953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "set-default-source %s\n", c->default_source->name); 192053a5a1b3Sopenharmony_ci } 192153a5a1b3Sopenharmony_ci 192253a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "\n### EOF\n"); 192353a5a1b3Sopenharmony_ci 192453a5a1b3Sopenharmony_ci return 0; 192553a5a1b3Sopenharmony_ci} 192653a5a1b3Sopenharmony_ci 192753a5a1b3Sopenharmony_cistatic int pa_cli_command_dump_volumes(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, bool *fail) { 192853a5a1b3Sopenharmony_ci pa_sink *s; 192953a5a1b3Sopenharmony_ci pa_source *so; 193053a5a1b3Sopenharmony_ci pa_sink_input *i; 193153a5a1b3Sopenharmony_ci pa_source_output *o; 193253a5a1b3Sopenharmony_ci uint32_t s_idx, i_idx; 193353a5a1b3Sopenharmony_ci char v_str[PA_CVOLUME_SNPRINT_VERBOSE_MAX]; 193453a5a1b3Sopenharmony_ci pa_channel_map *map; 193553a5a1b3Sopenharmony_ci 193653a5a1b3Sopenharmony_ci pa_core_assert_ref(c); 193753a5a1b3Sopenharmony_ci pa_assert(t); 193853a5a1b3Sopenharmony_ci pa_assert(buf); 193953a5a1b3Sopenharmony_ci pa_assert(fail); 194053a5a1b3Sopenharmony_ci 194153a5a1b3Sopenharmony_ci PA_IDXSET_FOREACH(s, c->sinks, s_idx) { 194253a5a1b3Sopenharmony_ci map = &s->channel_map; 194353a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Sink %d: ", s_idx); 194453a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 194553a5a1b3Sopenharmony_ci "reference = %s, ", 194653a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, 194753a5a1b3Sopenharmony_ci sizeof(v_str), 194853a5a1b3Sopenharmony_ci &s->reference_volume, 194953a5a1b3Sopenharmony_ci map, 195053a5a1b3Sopenharmony_ci s->flags & PA_SINK_DECIBEL_VOLUME)); 195153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 195253a5a1b3Sopenharmony_ci "real = %s, ", 195353a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, 195453a5a1b3Sopenharmony_ci sizeof(v_str), 195553a5a1b3Sopenharmony_ci &s->real_volume, 195653a5a1b3Sopenharmony_ci &s->channel_map, 195753a5a1b3Sopenharmony_ci s->flags & PA_SINK_DECIBEL_VOLUME)); 195853a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "soft = %s, ", pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &s->soft_volume, map, true)); 195953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 196053a5a1b3Sopenharmony_ci "current_hw = %s, ", 196153a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, 196253a5a1b3Sopenharmony_ci sizeof(v_str), 196353a5a1b3Sopenharmony_ci &s->thread_info.current_hw_volume, 196453a5a1b3Sopenharmony_ci map, 196553a5a1b3Sopenharmony_ci s->flags & PA_SINK_DECIBEL_VOLUME)); 196653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "save = %s\n", pa_yes_no(s->save_volume)); 196753a5a1b3Sopenharmony_ci 196853a5a1b3Sopenharmony_ci PA_IDXSET_FOREACH(i, s->inputs, i_idx) { 196953a5a1b3Sopenharmony_ci map = &i->channel_map; 197053a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "\tInput %d: ", i_idx); 197153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "volume = %s, ", pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &i->volume, map, true)); 197253a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 197353a5a1b3Sopenharmony_ci "reference_ratio = %s, ", 197453a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &i->reference_ratio, map, true)); 197553a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 197653a5a1b3Sopenharmony_ci "real_ratio = %s, ", 197753a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &i->real_ratio, map, true)); 197853a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "soft = %s, ", pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &i->soft_volume, map, true)); 197953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 198053a5a1b3Sopenharmony_ci "volume_factor = %s, ", 198153a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &i->volume_factor, map, true)); 198253a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 198353a5a1b3Sopenharmony_ci "volume_factor_sink = %s, ", 198453a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, 198553a5a1b3Sopenharmony_ci sizeof(v_str), 198653a5a1b3Sopenharmony_ci &i->volume_factor_sink, 198753a5a1b3Sopenharmony_ci &i->sink->channel_map, 198853a5a1b3Sopenharmony_ci true)); 198953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "save = %s\n", pa_yes_no(i->save_volume)); 199053a5a1b3Sopenharmony_ci } 199153a5a1b3Sopenharmony_ci } 199253a5a1b3Sopenharmony_ci 199353a5a1b3Sopenharmony_ci PA_IDXSET_FOREACH(so, c->sources, s_idx) { 199453a5a1b3Sopenharmony_ci map = &so->channel_map; 199553a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Source %d: ", s_idx); 199653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 199753a5a1b3Sopenharmony_ci "reference = %s, ", 199853a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, 199953a5a1b3Sopenharmony_ci sizeof(v_str), 200053a5a1b3Sopenharmony_ci &so->reference_volume, 200153a5a1b3Sopenharmony_ci map, 200253a5a1b3Sopenharmony_ci so->flags & PA_SOURCE_DECIBEL_VOLUME)); 200353a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 200453a5a1b3Sopenharmony_ci "real = %s, ", 200553a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, 200653a5a1b3Sopenharmony_ci sizeof(v_str), 200753a5a1b3Sopenharmony_ci &so->real_volume, 200853a5a1b3Sopenharmony_ci map, 200953a5a1b3Sopenharmony_ci so->flags & PA_SOURCE_DECIBEL_VOLUME)); 201053a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "soft = %s, ", pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &so->soft_volume, map, true)); 201153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 201253a5a1b3Sopenharmony_ci "current_hw = %s, ", 201353a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, 201453a5a1b3Sopenharmony_ci sizeof(v_str), 201553a5a1b3Sopenharmony_ci &so->thread_info.current_hw_volume, 201653a5a1b3Sopenharmony_ci map, 201753a5a1b3Sopenharmony_ci so->flags & PA_SOURCE_DECIBEL_VOLUME)); 201853a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "save = %s\n", pa_yes_no(so->save_volume)); 201953a5a1b3Sopenharmony_ci 202053a5a1b3Sopenharmony_ci PA_IDXSET_FOREACH(o, so->outputs, i_idx) { 202153a5a1b3Sopenharmony_ci map = &o->channel_map; 202253a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "\tOutput %d: ", i_idx); 202353a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "volume = %s, ", pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &o->volume, map, true)); 202453a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 202553a5a1b3Sopenharmony_ci "reference_ratio = %s, ", 202653a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &o->reference_ratio, map, true)); 202753a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 202853a5a1b3Sopenharmony_ci "real_ratio = %s, ", 202953a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &o->real_ratio, map, true)); 203053a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "soft = %s, ", pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &o->soft_volume, map, true)); 203153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 203253a5a1b3Sopenharmony_ci "volume_factor = %s, ", 203353a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, sizeof(v_str), &o->volume_factor, map, true)); 203453a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, 203553a5a1b3Sopenharmony_ci "volume_factor_source = %s, ", 203653a5a1b3Sopenharmony_ci pa_cvolume_snprint_verbose(v_str, 203753a5a1b3Sopenharmony_ci sizeof(v_str), 203853a5a1b3Sopenharmony_ci &o->volume_factor_source, 203953a5a1b3Sopenharmony_ci &o->source->channel_map, 204053a5a1b3Sopenharmony_ci true)); 204153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "save = %s\n", pa_yes_no(o->save_volume)); 204253a5a1b3Sopenharmony_ci } 204353a5a1b3Sopenharmony_ci } 204453a5a1b3Sopenharmony_ci 204553a5a1b3Sopenharmony_ci return 0; 204653a5a1b3Sopenharmony_ci} 204753a5a1b3Sopenharmony_ci 204853a5a1b3Sopenharmony_ciint pa_cli_command_execute_line_stateful(pa_core *c, const char *s, pa_strbuf *buf, bool *fail, int *ifstate) { 204953a5a1b3Sopenharmony_ci const char *cs; 205053a5a1b3Sopenharmony_ci 205153a5a1b3Sopenharmony_ci pa_assert(c); 205253a5a1b3Sopenharmony_ci pa_assert(s); 205353a5a1b3Sopenharmony_ci pa_assert(buf); 205453a5a1b3Sopenharmony_ci 205553a5a1b3Sopenharmony_ci cs = s+strspn(s, whitespace); 205653a5a1b3Sopenharmony_ci 205753a5a1b3Sopenharmony_ci if (*cs == '#' || !*cs) 205853a5a1b3Sopenharmony_ci return 0; 205953a5a1b3Sopenharmony_ci else if (*cs == '.') { 206053a5a1b3Sopenharmony_ci if (!strcmp(cs, META_ELSE)) { 206153a5a1b3Sopenharmony_ci if (!ifstate || *ifstate == IFSTATE_NONE) { 206253a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Meta command %s is not valid in this context\n", cs); 206353a5a1b3Sopenharmony_ci return -1; 206453a5a1b3Sopenharmony_ci } else if (*ifstate == IFSTATE_TRUE) 206553a5a1b3Sopenharmony_ci *ifstate = IFSTATE_FALSE; 206653a5a1b3Sopenharmony_ci else 206753a5a1b3Sopenharmony_ci *ifstate = IFSTATE_TRUE; 206853a5a1b3Sopenharmony_ci return 0; 206953a5a1b3Sopenharmony_ci } else if (!strcmp(cs, META_ENDIF)) { 207053a5a1b3Sopenharmony_ci if (!ifstate || *ifstate == IFSTATE_NONE) { 207153a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Meta command %s is not valid in this context\n", cs); 207253a5a1b3Sopenharmony_ci return -1; 207353a5a1b3Sopenharmony_ci } else 207453a5a1b3Sopenharmony_ci *ifstate = IFSTATE_NONE; 207553a5a1b3Sopenharmony_ci return 0; 207653a5a1b3Sopenharmony_ci } 207753a5a1b3Sopenharmony_ci if (ifstate && *ifstate == IFSTATE_FALSE) 207853a5a1b3Sopenharmony_ci return 0; 207953a5a1b3Sopenharmony_ci if (!strcmp(cs, META_FAIL)) 208053a5a1b3Sopenharmony_ci *fail = true; 208153a5a1b3Sopenharmony_ci else if (!strcmp(cs, META_NOFAIL)) 208253a5a1b3Sopenharmony_ci *fail = false; 208353a5a1b3Sopenharmony_ci else { 208453a5a1b3Sopenharmony_ci size_t l; 208553a5a1b3Sopenharmony_ci l = strcspn(cs, whitespace); 208653a5a1b3Sopenharmony_ci 208753a5a1b3Sopenharmony_ci if (l == sizeof(META_INCLUDE)-1 && !strncmp(cs, META_INCLUDE, l)) { 208853a5a1b3Sopenharmony_ci struct stat st; 208953a5a1b3Sopenharmony_ci const char *fn = cs+l+strspn(cs+l, whitespace); 209053a5a1b3Sopenharmony_ci 209153a5a1b3Sopenharmony_ci char *filename; 209253a5a1b3Sopenharmony_ci#ifdef OS_IS_WIN32 209353a5a1b3Sopenharmony_ci if (strncmp(fn, PA_DEFAULT_CONFIG_DIR, strlen(PA_DEFAULT_CONFIG_DIR)) == 0) 209453a5a1b3Sopenharmony_ci filename = pa_sprintf_malloc("%s" PA_PATH_SEP "etc" PA_PATH_SEP "pulse" PA_PATH_SEP "%s", 209553a5a1b3Sopenharmony_ci pa_win32_get_toplevel(NULL), 209653a5a1b3Sopenharmony_ci fn + strlen(PA_DEFAULT_CONFIG_DIR)); 209753a5a1b3Sopenharmony_ci else 209853a5a1b3Sopenharmony_ci#endif 209953a5a1b3Sopenharmony_ci filename = pa_xstrdup(fn); 210053a5a1b3Sopenharmony_ci 210153a5a1b3Sopenharmony_ci if (stat(filename, &st) < 0) { 210253a5a1b3Sopenharmony_ci pa_log_warn("stat('%s'): %s", filename, pa_cstrerror(errno)); 210353a5a1b3Sopenharmony_ci if (*fail) { 210453a5a1b3Sopenharmony_ci pa_xfree(filename); 210553a5a1b3Sopenharmony_ci return -1; 210653a5a1b3Sopenharmony_ci } 210753a5a1b3Sopenharmony_ci } else { 210853a5a1b3Sopenharmony_ci if (S_ISDIR(st.st_mode)) { 210953a5a1b3Sopenharmony_ci DIR *d; 211053a5a1b3Sopenharmony_ci 211153a5a1b3Sopenharmony_ci if (!(d = opendir(filename))) { 211253a5a1b3Sopenharmony_ci pa_log_warn("Failed to read '%s': %s", filename, pa_cstrerror(errno)); 211353a5a1b3Sopenharmony_ci if (*fail) { 211453a5a1b3Sopenharmony_ci pa_xfree(filename); 211553a5a1b3Sopenharmony_ci return -1; 211653a5a1b3Sopenharmony_ci } 211753a5a1b3Sopenharmony_ci } else { 211853a5a1b3Sopenharmony_ci unsigned i, count; 211953a5a1b3Sopenharmony_ci char **sorted_files; 212053a5a1b3Sopenharmony_ci struct dirent *de; 212153a5a1b3Sopenharmony_ci bool failed = false; 212253a5a1b3Sopenharmony_ci pa_dynarray *files = pa_dynarray_new(NULL); 212353a5a1b3Sopenharmony_ci 212453a5a1b3Sopenharmony_ci while ((de = readdir(d))) { 212553a5a1b3Sopenharmony_ci char *extn; 212653a5a1b3Sopenharmony_ci size_t flen = strlen(de->d_name); 212753a5a1b3Sopenharmony_ci 212853a5a1b3Sopenharmony_ci if (flen < 4) 212953a5a1b3Sopenharmony_ci continue; 213053a5a1b3Sopenharmony_ci 213153a5a1b3Sopenharmony_ci extn = &de->d_name[flen-3]; 213253a5a1b3Sopenharmony_ci if (strncmp(extn, ".pa", 3) == 0) 213353a5a1b3Sopenharmony_ci pa_dynarray_append(files, pa_sprintf_malloc("%s" PA_PATH_SEP "%s", filename, de->d_name)); 213453a5a1b3Sopenharmony_ci } 213553a5a1b3Sopenharmony_ci 213653a5a1b3Sopenharmony_ci closedir(d); 213753a5a1b3Sopenharmony_ci if ((count = pa_dynarray_size(files))) { 213853a5a1b3Sopenharmony_ci sorted_files = pa_xnew(char*, count); 213953a5a1b3Sopenharmony_ci for (i = 0; i < count; ++i) 214053a5a1b3Sopenharmony_ci sorted_files[i] = pa_dynarray_get(files, i); 214153a5a1b3Sopenharmony_ci pa_dynarray_free(files); 214253a5a1b3Sopenharmony_ci 214353a5a1b3Sopenharmony_ci for (i = 0; i < count; ++i) { 214453a5a1b3Sopenharmony_ci for (unsigned j = 0; j < count; ++j) { 214553a5a1b3Sopenharmony_ci if (strcmp(sorted_files[i], sorted_files[j]) < 0) { 214653a5a1b3Sopenharmony_ci char *tmp = sorted_files[i]; 214753a5a1b3Sopenharmony_ci sorted_files[i] = sorted_files[j]; 214853a5a1b3Sopenharmony_ci sorted_files[j] = tmp; 214953a5a1b3Sopenharmony_ci } 215053a5a1b3Sopenharmony_ci } 215153a5a1b3Sopenharmony_ci } 215253a5a1b3Sopenharmony_ci 215353a5a1b3Sopenharmony_ci for (i = 0; i < count; ++i) { 215453a5a1b3Sopenharmony_ci if (!failed) { 215553a5a1b3Sopenharmony_ci if (pa_cli_command_execute_file(c, sorted_files[i], buf, fail) < 0 && *fail) 215653a5a1b3Sopenharmony_ci failed = true; 215753a5a1b3Sopenharmony_ci } 215853a5a1b3Sopenharmony_ci 215953a5a1b3Sopenharmony_ci pa_xfree(sorted_files[i]); 216053a5a1b3Sopenharmony_ci } 216153a5a1b3Sopenharmony_ci pa_xfree(sorted_files); 216253a5a1b3Sopenharmony_ci if (failed) { 216353a5a1b3Sopenharmony_ci pa_xfree(filename); 216453a5a1b3Sopenharmony_ci return -1; 216553a5a1b3Sopenharmony_ci } 216653a5a1b3Sopenharmony_ci } 216753a5a1b3Sopenharmony_ci } 216853a5a1b3Sopenharmony_ci } else if (pa_cli_command_execute_file(c, filename, buf, fail) < 0 && *fail) { 216953a5a1b3Sopenharmony_ci pa_xfree(filename); 217053a5a1b3Sopenharmony_ci return -1; 217153a5a1b3Sopenharmony_ci } 217253a5a1b3Sopenharmony_ci } 217353a5a1b3Sopenharmony_ci pa_xfree(filename); 217453a5a1b3Sopenharmony_ci } else if (l == sizeof(META_IFEXISTS)-1 && !strncmp(cs, META_IFEXISTS, l)) { 217553a5a1b3Sopenharmony_ci if (!ifstate) { 217653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Meta command %s is not valid in this context\n", cs); 217753a5a1b3Sopenharmony_ci return -1; 217853a5a1b3Sopenharmony_ci } else if (*ifstate != IFSTATE_NONE) { 217953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Nested %s commands not supported\n", cs); 218053a5a1b3Sopenharmony_ci return -1; 218153a5a1b3Sopenharmony_ci } else { 218253a5a1b3Sopenharmony_ci const char *filename = cs+l+strspn(cs+l, whitespace); 218353a5a1b3Sopenharmony_ci *ifstate = pa_module_exists(filename) ? IFSTATE_TRUE : IFSTATE_FALSE; 218453a5a1b3Sopenharmony_ci } 218553a5a1b3Sopenharmony_ci } else { 218653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Invalid meta command: %s\n", cs); 218753a5a1b3Sopenharmony_ci if (*fail) return -1; 218853a5a1b3Sopenharmony_ci } 218953a5a1b3Sopenharmony_ci } 219053a5a1b3Sopenharmony_ci } else { 219153a5a1b3Sopenharmony_ci const struct command*command; 219253a5a1b3Sopenharmony_ci int unknown = 1; 219353a5a1b3Sopenharmony_ci size_t l; 219453a5a1b3Sopenharmony_ci 219553a5a1b3Sopenharmony_ci if (ifstate && *ifstate == IFSTATE_FALSE) 219653a5a1b3Sopenharmony_ci return 0; 219753a5a1b3Sopenharmony_ci 219853a5a1b3Sopenharmony_ci l = strcspn(cs, whitespace); 219953a5a1b3Sopenharmony_ci 220053a5a1b3Sopenharmony_ci for (command = commands; command->name; command++) 220153a5a1b3Sopenharmony_ci if (strlen(command->name) == l && !strncmp(cs, command->name, l)) { 220253a5a1b3Sopenharmony_ci int ret; 220353a5a1b3Sopenharmony_ci pa_tokenizer *t = pa_tokenizer_new(cs, command->args); 220453a5a1b3Sopenharmony_ci pa_assert(t); 220553a5a1b3Sopenharmony_ci ret = command->proc(c, t, buf, fail); 220653a5a1b3Sopenharmony_ci pa_tokenizer_free(t); 220753a5a1b3Sopenharmony_ci unknown = 0; 220853a5a1b3Sopenharmony_ci 220953a5a1b3Sopenharmony_ci if (ret < 0 && *fail) 221053a5a1b3Sopenharmony_ci return -1; 221153a5a1b3Sopenharmony_ci 221253a5a1b3Sopenharmony_ci break; 221353a5a1b3Sopenharmony_ci } 221453a5a1b3Sopenharmony_ci 221553a5a1b3Sopenharmony_ci if (unknown) { 221653a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "Unknown command: %s\n", cs); 221753a5a1b3Sopenharmony_ci if (*fail) 221853a5a1b3Sopenharmony_ci return -1; 221953a5a1b3Sopenharmony_ci } 222053a5a1b3Sopenharmony_ci } 222153a5a1b3Sopenharmony_ci 222253a5a1b3Sopenharmony_ci return 0; 222353a5a1b3Sopenharmony_ci} 222453a5a1b3Sopenharmony_ci 222553a5a1b3Sopenharmony_ciint pa_cli_command_execute_line(pa_core *c, const char *s, pa_strbuf *buf, bool *fail) { 222653a5a1b3Sopenharmony_ci return pa_cli_command_execute_line_stateful(c, s, buf, fail, NULL); 222753a5a1b3Sopenharmony_ci} 222853a5a1b3Sopenharmony_ci 222953a5a1b3Sopenharmony_ciint pa_cli_command_execute_file_stream(pa_core *c, FILE *f, pa_strbuf *buf, bool *fail) { 223053a5a1b3Sopenharmony_ci char line[2048]; 223153a5a1b3Sopenharmony_ci int ifstate = IFSTATE_NONE; 223253a5a1b3Sopenharmony_ci int ret = -1; 223353a5a1b3Sopenharmony_ci bool _fail = true; 223453a5a1b3Sopenharmony_ci 223553a5a1b3Sopenharmony_ci pa_assert(c); 223653a5a1b3Sopenharmony_ci pa_assert(f); 223753a5a1b3Sopenharmony_ci pa_assert(buf); 223853a5a1b3Sopenharmony_ci 223953a5a1b3Sopenharmony_ci if (!fail) 224053a5a1b3Sopenharmony_ci fail = &_fail; 224153a5a1b3Sopenharmony_ci 224253a5a1b3Sopenharmony_ci while (fgets(line, sizeof(line), f)) { 224353a5a1b3Sopenharmony_ci pa_strip_nl(line); 224453a5a1b3Sopenharmony_ci 224553a5a1b3Sopenharmony_ci if (pa_cli_command_execute_line_stateful(c, line, buf, fail, &ifstate) < 0 && *fail) 224653a5a1b3Sopenharmony_ci goto fail; 224753a5a1b3Sopenharmony_ci } 224853a5a1b3Sopenharmony_ci 224953a5a1b3Sopenharmony_ci ret = 0; 225053a5a1b3Sopenharmony_ci 225153a5a1b3Sopenharmony_cifail: 225253a5a1b3Sopenharmony_ci 225353a5a1b3Sopenharmony_ci return ret; 225453a5a1b3Sopenharmony_ci} 225553a5a1b3Sopenharmony_ci 225653a5a1b3Sopenharmony_ciint pa_cli_command_execute_file(pa_core *c, const char *fn, pa_strbuf *buf, bool *fail) { 225753a5a1b3Sopenharmony_ci FILE *f = NULL; 225853a5a1b3Sopenharmony_ci int ret = -1; 225953a5a1b3Sopenharmony_ci bool _fail = true; 226053a5a1b3Sopenharmony_ci 226153a5a1b3Sopenharmony_ci pa_assert(c); 226253a5a1b3Sopenharmony_ci pa_assert(fn); 226353a5a1b3Sopenharmony_ci pa_assert(buf); 226453a5a1b3Sopenharmony_ci 226553a5a1b3Sopenharmony_ci if (!fail) 226653a5a1b3Sopenharmony_ci fail = &_fail; 226753a5a1b3Sopenharmony_ci 226853a5a1b3Sopenharmony_ci if (!(f = pa_fopen_cloexec(fn, "r"))) { 226953a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "open('%s') failed: %s\n", fn, pa_cstrerror(errno)); 227053a5a1b3Sopenharmony_ci if (!*fail) 227153a5a1b3Sopenharmony_ci ret = 0; 227253a5a1b3Sopenharmony_ci goto fail; 227353a5a1b3Sopenharmony_ci } 227453a5a1b3Sopenharmony_ci 227553a5a1b3Sopenharmony_ci pa_log_debug("Parsing script '%s'", fn); 227653a5a1b3Sopenharmony_ci ret = pa_cli_command_execute_file_stream(c, f, buf, fail); 227753a5a1b3Sopenharmony_ci 227853a5a1b3Sopenharmony_cifail: 227953a5a1b3Sopenharmony_ci if (f) 228053a5a1b3Sopenharmony_ci fclose(f); 228153a5a1b3Sopenharmony_ci 228253a5a1b3Sopenharmony_ci return ret; 228353a5a1b3Sopenharmony_ci} 228453a5a1b3Sopenharmony_ci 228553a5a1b3Sopenharmony_ciint pa_cli_command_execute(pa_core *c, const char *s, pa_strbuf *buf, bool *fail) { 228653a5a1b3Sopenharmony_ci const char *p; 228753a5a1b3Sopenharmony_ci int ifstate = IFSTATE_NONE; 228853a5a1b3Sopenharmony_ci bool _fail = true; 228953a5a1b3Sopenharmony_ci 229053a5a1b3Sopenharmony_ci pa_assert(c); 229153a5a1b3Sopenharmony_ci pa_assert(s); 229253a5a1b3Sopenharmony_ci pa_assert(buf); 229353a5a1b3Sopenharmony_ci 229453a5a1b3Sopenharmony_ci if (!fail) 229553a5a1b3Sopenharmony_ci fail = &_fail; 229653a5a1b3Sopenharmony_ci 229753a5a1b3Sopenharmony_ci p = s; 229853a5a1b3Sopenharmony_ci while (*p) { 229953a5a1b3Sopenharmony_ci size_t l = strcspn(p, linebreak); 230053a5a1b3Sopenharmony_ci char *line = pa_xstrndup(p, l); 230153a5a1b3Sopenharmony_ci 230253a5a1b3Sopenharmony_ci if (pa_cli_command_execute_line_stateful(c, line, buf, fail, &ifstate) < 0 && *fail) { 230353a5a1b3Sopenharmony_ci pa_xfree(line); 230453a5a1b3Sopenharmony_ci return -1; 230553a5a1b3Sopenharmony_ci } 230653a5a1b3Sopenharmony_ci pa_xfree(line); 230753a5a1b3Sopenharmony_ci 230853a5a1b3Sopenharmony_ci p += l; 230953a5a1b3Sopenharmony_ci p += strspn(p, linebreak); 231053a5a1b3Sopenharmony_ci } 231153a5a1b3Sopenharmony_ci 231253a5a1b3Sopenharmony_ci return 0; 231353a5a1b3Sopenharmony_ci} 2314