mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04: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