mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	alsa plugin: allow specifying a media.role on the virtual device name
So that we can do: aplay -D pipewire:ROLE=Music music.wav aplay -D pipewire:ROLE=Notification notice.wav
This commit is contained in:
		
							parent
							
								
									575d4456e1
								
							
						
					
					
						commit
						5ee9133b60
					
				
					 2 changed files with 23 additions and 2 deletions
				
			
		| 
						 | 
					@ -59,6 +59,7 @@ typedef struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char *node_name;
 | 
						char *node_name;
 | 
				
			||||||
	char *target;
 | 
						char *target;
 | 
				
			||||||
 | 
						char *role;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int fd;
 | 
						int fd;
 | 
				
			||||||
	int error;
 | 
						int error;
 | 
				
			||||||
| 
						 | 
					@ -509,6 +510,9 @@ static int snd_pcm_pipewire_prepare(snd_pcm_ioplug_t *io)
 | 
				
			||||||
		pw_properties_set(props, PW_KEY_MEDIA_CATEGORY,
 | 
							pw_properties_set(props, PW_KEY_MEDIA_CATEGORY,
 | 
				
			||||||
				io->stream == SND_PCM_STREAM_PLAYBACK ?
 | 
									io->stream == SND_PCM_STREAM_PLAYBACK ?
 | 
				
			||||||
				"Playback" : "Capture");
 | 
									"Playback" : "Capture");
 | 
				
			||||||
 | 
						if (pw->role != NULL &&
 | 
				
			||||||
 | 
							pw_properties_get(props, PW_KEY_MEDIA_ROLE) == NULL)
 | 
				
			||||||
 | 
							pw_properties_setf(props, PW_KEY_MEDIA_ROLE, "%s", pw->role);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw->stream = pw_stream_new(pw->core, pw->node_name, props);
 | 
						pw->stream = pw_stream_new(pw->core, pw->node_name, props);
 | 
				
			||||||
	if (pw->stream == NULL)
 | 
						if (pw->stream == NULL)
 | 
				
			||||||
| 
						 | 
					@ -958,6 +962,7 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
 | 
				
			||||||
				const char *server_name,
 | 
									const char *server_name,
 | 
				
			||||||
				const char *playback_node,
 | 
									const char *playback_node,
 | 
				
			||||||
				const char *capture_node,
 | 
									const char *capture_node,
 | 
				
			||||||
 | 
									const char *role,
 | 
				
			||||||
				snd_pcm_stream_t stream,
 | 
									snd_pcm_stream_t stream,
 | 
				
			||||||
				int mode,
 | 
									int mode,
 | 
				
			||||||
				uint32_t flags,
 | 
									uint32_t flags,
 | 
				
			||||||
| 
						 | 
					@ -1013,6 +1018,8 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
 | 
				
			||||||
			pw->target = capture_node ? strdup(capture_node) : NULL;
 | 
								pw->target = capture_node ? strdup(capture_node) : NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pw->role = (role && *role) ? strdup(role) : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw->main_loop = pw_thread_loop_new("alsa-pipewire", NULL);
 | 
						pw->main_loop = pw_thread_loop_new("alsa-pipewire", NULL);
 | 
				
			||||||
	if (pw->main_loop == NULL) {
 | 
						if (pw->main_loop == NULL) {
 | 
				
			||||||
		err = -errno;
 | 
							err = -errno;
 | 
				
			||||||
| 
						 | 
					@ -1091,6 +1098,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
 | 
				
			||||||
	const char *server_name = NULL;
 | 
						const char *server_name = NULL;
 | 
				
			||||||
	const char *playback_node = NULL;
 | 
						const char *playback_node = NULL;
 | 
				
			||||||
	const char *capture_node = NULL;
 | 
						const char *capture_node = NULL;
 | 
				
			||||||
 | 
						const char *role = NULL;
 | 
				
			||||||
	snd_pcm_format_t format = SND_PCM_FORMAT_UNKNOWN;
 | 
						snd_pcm_format_t format = SND_PCM_FORMAT_UNKNOWN;
 | 
				
			||||||
	int rate = 0;
 | 
						int rate = 0;
 | 
				
			||||||
	int channels = 0;
 | 
						int channels = 0;
 | 
				
			||||||
| 
						 | 
					@ -1125,6 +1133,10 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
 | 
				
			||||||
			snd_config_get_string(n, &capture_node);
 | 
								snd_config_get_string(n, &capture_node);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (spa_streq(id, "role")) {
 | 
				
			||||||
 | 
								snd_config_get_string(n, &role);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (spa_streq(id, "exclusive")) {
 | 
							if (spa_streq(id, "exclusive")) {
 | 
				
			||||||
			if (snd_config_get_bool(n))
 | 
								if (snd_config_get_bool(n))
 | 
				
			||||||
				flags |= PW_STREAM_FLAG_EXCLUSIVE;
 | 
									flags |= PW_STREAM_FLAG_EXCLUSIVE;
 | 
				
			||||||
| 
						 | 
					@ -1174,7 +1186,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = snd_pcm_pipewire_open(pcmp, name, node_name, server_name, playback_node,
 | 
						err = snd_pcm_pipewire_open(pcmp, name, node_name, server_name, playback_node,
 | 
				
			||||||
			capture_node, stream, mode, flags, rate, format,
 | 
								capture_node, role, stream, mode, flags, rate, format,
 | 
				
			||||||
			channels, period_bytes);
 | 
								channels, period_bytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,9 +3,10 @@
 | 
				
			||||||
defaults.pipewire.server "pipewire-0"
 | 
					defaults.pipewire.server "pipewire-0"
 | 
				
			||||||
defaults.pipewire.node "-1"
 | 
					defaults.pipewire.node "-1"
 | 
				
			||||||
defaults.pipewire.exclusive false
 | 
					defaults.pipewire.exclusive false
 | 
				
			||||||
 | 
					defaults.pipewire.role ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pcm.pipewire {
 | 
					pcm.pipewire {
 | 
				
			||||||
	@args [ SERVER NODE EXCLUSIVE ]
 | 
						@args [ SERVER NODE EXCLUSIVE ROLE ]
 | 
				
			||||||
	@args.SERVER {
 | 
						@args.SERVER {
 | 
				
			||||||
		type string
 | 
							type string
 | 
				
			||||||
		default {
 | 
							default {
 | 
				
			||||||
| 
						 | 
					@ -27,6 +28,13 @@ pcm.pipewire {
 | 
				
			||||||
			name defaults.pipewire.exclusive
 | 
								name defaults.pipewire.exclusive
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						@args.ROLE {
 | 
				
			||||||
 | 
							type string
 | 
				
			||||||
 | 
							default {
 | 
				
			||||||
 | 
								@func refer
 | 
				
			||||||
 | 
								name defaults.pipewire.role
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	type pipewire
 | 
						type pipewire
 | 
				
			||||||
| 
						 | 
					@ -34,6 +42,7 @@ pcm.pipewire {
 | 
				
			||||||
	playback_node $NODE
 | 
						playback_node $NODE
 | 
				
			||||||
	capture_node $NODE
 | 
						capture_node $NODE
 | 
				
			||||||
	exclusive $EXCLUSIVE
 | 
						exclusive $EXCLUSIVE
 | 
				
			||||||
 | 
						role $ROLE
 | 
				
			||||||
	hint {
 | 
						hint {
 | 
				
			||||||
		show on
 | 
							show on
 | 
				
			||||||
		description "PipeWire Sound Server"
 | 
							description "PipeWire Sound Server"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue