mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	pw-link: make mode a proper enum
This commit is contained in:
		
							parent
							
								
									8947ba504e
								
							
						
					
					
						commit
						431a201d6c
					
				
					 1 changed files with 42 additions and 26 deletions
				
			
		| 
						 | 
					@ -52,17 +52,25 @@ struct target_link {
 | 
				
			||||||
	int result;
 | 
						int result;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum mode {
 | 
				
			||||||
 | 
						MODE_CONNECT,
 | 
				
			||||||
 | 
						MODE_DISCONNECT,
 | 
				
			||||||
 | 
						MODE_LIST,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum list_target {
 | 
				
			||||||
 | 
						LIST_OUTPUT = 1 << 0,
 | 
				
			||||||
 | 
						LIST_INPUT = 1 << 1,
 | 
				
			||||||
 | 
						LIST_PORTS = LIST_OUTPUT | LIST_INPUT,
 | 
				
			||||||
 | 
						LIST_LINKS = 1 << 2,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct data {
 | 
					struct data {
 | 
				
			||||||
	struct pw_main_loop *loop;
 | 
						struct pw_main_loop *loop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const char *opt_remote;
 | 
						const char *opt_remote;
 | 
				
			||||||
#define MODE_LIST_OUTPUT	(1<<0)
 | 
						enum mode opt_mode;
 | 
				
			||||||
#define MODE_LIST_INPUT		(1<<1)
 | 
						enum list_target opt_list; /* for `MODE_LIST` */
 | 
				
			||||||
#define MODE_LIST_PORTS		(MODE_LIST_OUTPUT|MODE_LIST_INPUT)
 | 
					 | 
				
			||||||
#define MODE_LIST_LINKS		(1<<2)
 | 
					 | 
				
			||||||
#define MODE_LIST		(MODE_LIST_PORTS|MODE_LIST_LINKS)
 | 
					 | 
				
			||||||
#define MODE_DISCONNECT		(1<<3)
 | 
					 | 
				
			||||||
	uint32_t opt_mode;
 | 
					 | 
				
			||||||
	bool opt_id;
 | 
						bool opt_id;
 | 
				
			||||||
	bool opt_verbose;
 | 
						bool opt_verbose;
 | 
				
			||||||
	bool opt_wait;
 | 
						bool opt_wait;
 | 
				
			||||||
| 
						 | 
					@ -302,7 +310,7 @@ static void do_list_port_links(struct data *data, struct object *node, struct ob
 | 
				
			||||||
	struct object *o;
 | 
						struct object *o;
 | 
				
			||||||
	bool first = false;
 | 
						bool first = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((data->opt_mode & MODE_LIST_PORTS) == 0)
 | 
						if (!(data->opt_list & LIST_PORTS))
 | 
				
			||||||
		first = true;
 | 
							first = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_for_each(o, &data->objects, link) {
 | 
						spa_list_for_each(o, &data->objects, link) {
 | 
				
			||||||
| 
						 | 
					@ -387,9 +395,9 @@ static void do_list_ports(struct data *data, struct object *node,
 | 
				
			||||||
		if (regex && !port_regex(data, node, o, regex))
 | 
							if (regex && !port_regex(data, node, o, regex))
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (data->opt_mode & MODE_LIST_PORTS)
 | 
							if (data->opt_list & LIST_PORTS)
 | 
				
			||||||
			print_port(data, "", node, o, data->opt_verbose);
 | 
								print_port(data, "", node, o, data->opt_verbose);
 | 
				
			||||||
		if (data->opt_mode & MODE_LIST_LINKS)
 | 
							if (data->opt_list & LIST_LINKS)
 | 
				
			||||||
			do_list_port_links(data, node, o);
 | 
								do_list_port_links(data, node, o);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -613,7 +621,7 @@ static int do_monitor_link(struct data *data, struct object *link)
 | 
				
			||||||
	char buffer1[1024], buffer2[1024], id[64] = "";
 | 
						char buffer1[1024], buffer2[1024], id[64] = "";
 | 
				
			||||||
	struct object *n1, *n2, *p1, *p2;
 | 
						struct object *n1, *n2, *p1, *p2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(data->opt_mode & MODE_LIST_LINKS))
 | 
						if (!(data->opt_list & LIST_LINKS))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((p1 = find_object(data, OBJECT_PORT, link->data.link.output_port)) == NULL)
 | 
						if ((p1 = find_object(data, OBJECT_PORT, link->data.link.output_port)) == NULL)
 | 
				
			||||||
| 
						 | 
					@ -751,7 +759,7 @@ static void on_core_done(void *data, uint32_t id, int seq)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Connect mode, look for our targets. */
 | 
						/* Connect mode, look for our targets. */
 | 
				
			||||||
	if ((d->opt_mode & (MODE_LIST|MODE_DISCONNECT)) == 0) {
 | 
						if (d->opt_mode == MODE_CONNECT) {
 | 
				
			||||||
		d->nb_links = create_link_proxies(d);
 | 
							d->nb_links = create_link_proxies(d);
 | 
				
			||||||
		/* In wait mode, if none exist, keep running. */
 | 
							/* In wait mode, if none exist, keep running. */
 | 
				
			||||||
		if (d->opt_wait && d->nb_links == -ENOENT) {
 | 
							if (d->opt_wait && d->nb_links == -ENOENT) {
 | 
				
			||||||
| 
						 | 
					@ -814,7 +822,9 @@ static void show_help(struct data *data, const char *name, bool error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct data data = { 0, };
 | 
						struct data data = {
 | 
				
			||||||
 | 
							.opt_mode = MODE_CONNECT,
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
	int res = 0, c;
 | 
						int res = 0, c;
 | 
				
			||||||
	regex_t out_port_regex;
 | 
						regex_t out_port_regex;
 | 
				
			||||||
	regex_t in_port_regex;
 | 
						regex_t in_port_regex;
 | 
				
			||||||
| 
						 | 
					@ -866,13 +876,16 @@ int main(int argc, char *argv[])
 | 
				
			||||||
			data.opt_remote = optarg;
 | 
								data.opt_remote = optarg;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'o':
 | 
							case 'o':
 | 
				
			||||||
			data.opt_mode |= MODE_LIST_OUTPUT;
 | 
								data.opt_mode = MODE_LIST;
 | 
				
			||||||
 | 
								data.opt_list |= LIST_OUTPUT;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'i':
 | 
							case 'i':
 | 
				
			||||||
			data.opt_mode |= MODE_LIST_INPUT;
 | 
								data.opt_mode = MODE_LIST;
 | 
				
			||||||
 | 
								data.opt_list |= LIST_INPUT;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'l':
 | 
							case 'l':
 | 
				
			||||||
			data.opt_mode |= MODE_LIST_LINKS;
 | 
								data.opt_mode = MODE_LIST;
 | 
				
			||||||
 | 
								data.opt_list |= LIST_LINKS;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'm':
 | 
							case 'm':
 | 
				
			||||||
			data.opt_monitor = true;
 | 
								data.opt_monitor = true;
 | 
				
			||||||
| 
						 | 
					@ -893,7 +906,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
			pw_properties_update_string(data.props, optarg, strlen(optarg));
 | 
								pw_properties_update_string(data.props, optarg, strlen(optarg));
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'd':
 | 
							case 'd':
 | 
				
			||||||
			data.opt_mode |= MODE_DISCONNECT;
 | 
								data.opt_mode = MODE_DISCONNECT;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'w':
 | 
							case 'w':
 | 
				
			||||||
			data.opt_wait = true;
 | 
								data.opt_wait = true;
 | 
				
			||||||
| 
						 | 
					@ -906,7 +919,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
	if (argc == 1)
 | 
						if (argc == 1)
 | 
				
			||||||
		show_help(&data, argv[0], true);
 | 
							show_help(&data, argv[0], true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (data.opt_id && (data.opt_mode & MODE_LIST) == 0) {
 | 
						if (data.opt_id && data.opt_mode != MODE_LIST) {
 | 
				
			||||||
		fprintf(stderr, "-I option needs one or more of -l, -i or -o\n");
 | 
							fprintf(stderr, "-I option needs one or more of -l, -i or -o\n");
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -919,8 +932,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
	if (optind < argc)
 | 
						if (optind < argc)
 | 
				
			||||||
		data.opt_input = argv[optind++];
 | 
							data.opt_input = argv[optind++];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((data.opt_mode & (MODE_LIST|MODE_DISCONNECT)) == 0 &&
 | 
						if (data.opt_mode == MODE_CONNECT && (data.opt_output == NULL || data.opt_input == NULL)) {
 | 
				
			||||||
	    (data.opt_output == NULL || data.opt_input == NULL)) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "missing output and input port names to connect\n");
 | 
							fprintf(stderr, "missing output and input port names to connect\n");
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -964,11 +976,11 @@ int main(int argc, char *argv[])
 | 
				
			||||||
	core_sync(&data);
 | 
						core_sync(&data);
 | 
				
			||||||
	pw_main_loop_run(data.loop);
 | 
						pw_main_loop_run(data.loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((data.opt_mode & (MODE_LIST_PORTS|MODE_LIST_LINKS)) == MODE_LIST_LINKS)
 | 
						if ((data.opt_list & (LIST_PORTS|LIST_LINKS)) == LIST_LINKS)
 | 
				
			||||||
		data.list_inputs = data.list_outputs = true;
 | 
							data.list_inputs = data.list_outputs = true;
 | 
				
			||||||
	if ((data.opt_mode & MODE_LIST_INPUT) == MODE_LIST_INPUT)
 | 
						if ((data.opt_list & LIST_INPUT) == LIST_INPUT)
 | 
				
			||||||
		data.list_inputs = true;
 | 
							data.list_inputs = true;
 | 
				
			||||||
	if ((data.opt_mode & MODE_LIST_OUTPUT) == MODE_LIST_OUTPUT)
 | 
						if ((data.opt_list & LIST_OUTPUT) == LIST_OUTPUT)
 | 
				
			||||||
		data.list_outputs = true;
 | 
							data.list_outputs = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (data.opt_output) {
 | 
						if (data.opt_output) {
 | 
				
			||||||
| 
						 | 
					@ -980,9 +992,11 @@ int main(int argc, char *argv[])
 | 
				
			||||||
			data.in_regex = &in_port_regex;
 | 
								data.in_regex = &in_port_regex;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (data.opt_mode & (MODE_LIST)) {
 | 
						switch (data.opt_mode) {
 | 
				
			||||||
 | 
						case MODE_LIST:
 | 
				
			||||||
		do_list(&data);
 | 
							do_list(&data);
 | 
				
			||||||
	} else if (data.opt_mode & MODE_DISCONNECT) {
 | 
							break;
 | 
				
			||||||
 | 
						case MODE_DISCONNECT:
 | 
				
			||||||
		if (data.opt_output == NULL) {
 | 
							if (data.opt_output == NULL) {
 | 
				
			||||||
			fprintf(stderr, "missing link-id or output and input port names to disconnect\n");
 | 
								fprintf(stderr, "missing link-id or output and input port names to disconnect\n");
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
| 
						 | 
					@ -991,7 +1005,8 @@ int main(int argc, char *argv[])
 | 
				
			||||||
			fprintf(stderr, "failed to unlink ports: %s\n", spa_strerror(res));
 | 
								fprintf(stderr, "failed to unlink ports: %s\n", spa_strerror(res));
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
							break;
 | 
				
			||||||
 | 
						case MODE_CONNECT:
 | 
				
			||||||
		if (data.nb_links < 0) {
 | 
							if (data.nb_links < 0) {
 | 
				
			||||||
			fprintf(stderr, "failed to link ports: %s\n", spa_strerror(data.nb_links));
 | 
								fprintf(stderr, "failed to link ports: %s\n", spa_strerror(data.nb_links));
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
| 
						 | 
					@ -1009,6 +1024,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (data.opt_monitor) {
 | 
						if (data.opt_monitor) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue