mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	jack: support port matching with regex
This commit is contained in:
		
							parent
							
								
									c6c3b73ee3
								
							
						
					
					
						commit
						9902886ba5
					
				
					 1 changed files with 24 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -24,6 +24,7 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <sys/mman.h>
 | 
			
		||||
#include <regex.h>
 | 
			
		||||
 | 
			
		||||
#include <jack/jack.h>
 | 
			
		||||
#include <jack/session.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -2381,28 +2382,41 @@ const char ** jack_get_ports (jack_client_t *client,
 | 
			
		|||
	struct object *o;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	uint32_t id;
 | 
			
		||||
	regex_t port_regex, type_regex;
 | 
			
		||||
 | 
			
		||||
	if ((str = getenv("PIPEWIRE_NODE")) != NULL)
 | 
			
		||||
		id = pw_properties_parse_int(str);
 | 
			
		||||
	else
 | 
			
		||||
		id = SPA_ID_INVALID;
 | 
			
		||||
 | 
			
		||||
	if (port_name_pattern && port_name_pattern[0])
 | 
			
		||||
		regcomp(&port_regex, port_name_pattern, REG_EXTENDED | REG_NOSUB);
 | 
			
		||||
	if (type_name_pattern && type_name_pattern[0])
 | 
			
		||||
		regcomp(&type_regex, type_name_pattern, REG_EXTENDED | REG_NOSUB);
 | 
			
		||||
 | 
			
		||||
	pw_thread_loop_lock(c->context.loop);
 | 
			
		||||
 | 
			
		||||
	pw_log_debug("ports %d %s %s %08lx", id, port_name_pattern, type_name_pattern, flags);
 | 
			
		||||
 | 
			
		||||
	spa_list_for_each(o, &c->context.ports, link) {
 | 
			
		||||
		pw_log_debug("check port %s", o->port.name);
 | 
			
		||||
		pw_log_debug("check port %s %d %lu",
 | 
			
		||||
				o->port.name, o->port.type_id, o->port.flags);
 | 
			
		||||
		if (o->port.type_id == 2)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (!SPA_FLAG_CHECK(o->port.flags, flags))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (id != SPA_ID_INVALID && o->parent_id != id)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (type_name_pattern && strcmp(type_to_string(o->port.type_id), type_name_pattern))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (port_name_pattern && strcmp(o->port.name, port_name_pattern))
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if (port_name_pattern && port_name_pattern[0]) {
 | 
			
		||||
			if (regexec(&port_regex, o->port.name, 0, NULL, 0) == REG_NOMATCH)
 | 
			
		||||
				continue;
 | 
			
		||||
		}
 | 
			
		||||
		if (type_name_pattern && type_name_pattern[0]) {
 | 
			
		||||
			if (regexec(&type_regex, type_to_string(o->port.type_id),
 | 
			
		||||
						0, NULL, 0) == REG_NOMATCH)
 | 
			
		||||
				continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pw_log_debug("add port %d %s", count, o->port.name);
 | 
			
		||||
		res[count++] = o->port.name;
 | 
			
		||||
| 
						 | 
				
			
			@ -2417,6 +2431,11 @@ const char ** jack_get_ports (jack_client_t *client,
 | 
			
		|||
	} else
 | 
			
		||||
		res[count] = NULL;
 | 
			
		||||
 | 
			
		||||
	if (port_name_pattern && port_name_pattern[0])
 | 
			
		||||
		regfree(&port_regex);
 | 
			
		||||
	if (type_name_pattern && type_name_pattern[0])
 | 
			
		||||
		regfree(&type_regex);
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue