mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
media-session: use adapter around sink
Don't use the DSP nodes anymore, use the adapter instead and wrap it around a sink/source.
This commit is contained in:
parent
aba81455ff
commit
94e7be1845
3 changed files with 12 additions and 66 deletions
|
|
@ -1 +1 @@
|
||||||
Subproject commit d00b9f163594b76a3107fcfeee06982f93ac40b7
|
Subproject commit 67c1dca8978dcc69111058c2638be5dc03db158d
|
||||||
|
|
@ -17,6 +17,6 @@ load-module libpipewire-module-spa-monitor api.bluez5.monitor bluez5
|
||||||
load-module libpipewire-module-client-node
|
load-module libpipewire-module-client-node
|
||||||
load-module libpipewire-module-client-device
|
load-module libpipewire-module-client-device
|
||||||
load-module libpipewire-module-access
|
load-module libpipewire-module-access
|
||||||
load-module libpipewire-module-audio-dsp
|
load-module libpipewire-module-adapter
|
||||||
load-module libpipewire-module-link-factory
|
load-module libpipewire-module-link-factory
|
||||||
exec build/src/examples/media-session
|
exec build/src/examples/media-session
|
||||||
|
|
|
||||||
|
|
@ -234,16 +234,6 @@ static void add_idle_timeout(struct session *sess)
|
||||||
pw_loop_update_timer(main_loop, sess->idle_timeout, &value, NULL, false);
|
pw_loop_update_timer(main_loop, sess->idle_timeout, &value, NULL, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int unlink_session_dsp(struct impl *impl, struct session *session)
|
|
||||||
{
|
|
||||||
if (session->link_proxy != NULL) {
|
|
||||||
pw_log_debug(NAME " %p: destroy session dsp link %p", impl, session->link_proxy);
|
|
||||||
pw_proxy_destroy(session->link_proxy);
|
|
||||||
session->link_proxy = NULL;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int on_node_idle(struct impl *impl, struct node *node)
|
static int on_node_idle(struct impl *impl, struct node *node)
|
||||||
{
|
{
|
||||||
struct session *sess = node->manager;
|
struct session *sess = node->manager;
|
||||||
|
|
@ -254,7 +244,9 @@ static int on_node_idle(struct impl *impl, struct node *node)
|
||||||
switch (node->type) {
|
switch (node->type) {
|
||||||
case NODE_TYPE_DSP:
|
case NODE_TYPE_DSP:
|
||||||
pw_log_debug(NAME" %p: dsp idle for session %d", impl, sess->id);
|
pw_log_debug(NAME" %p: dsp idle for session %d", impl, sess->id);
|
||||||
unlink_session_dsp(impl, sess);
|
sess->busy = false;
|
||||||
|
sess->exclusive = false;
|
||||||
|
add_idle_timeout(sess);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NODE_TYPE_DEVICE:
|
case NODE_TYPE_DEVICE:
|
||||||
|
|
@ -269,54 +261,6 @@ static int on_node_idle(struct impl *impl, struct node *node)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void link_proxy_destroy(void *data)
|
|
||||||
{
|
|
||||||
struct session *s = data;
|
|
||||||
pw_log_debug(NAME " %p: proxy destroy session link", s);
|
|
||||||
s->link_proxy = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct pw_proxy_events link_proxy_events = {
|
|
||||||
PW_VERSION_PROXY_EVENTS,
|
|
||||||
.destroy = link_proxy_destroy,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int link_session_dsp(struct impl *impl, struct session *session)
|
|
||||||
{
|
|
||||||
struct pw_properties *props;
|
|
||||||
|
|
||||||
if (session->link_proxy != NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
pw_log_debug(NAME " %p: link session dsp '%d'", impl, session->id);
|
|
||||||
|
|
||||||
props = pw_properties_new(NULL, NULL);
|
|
||||||
pw_properties_set(props, PW_KEY_LINK_PASSIVE, "true");
|
|
||||||
if (session->direction == PW_DIRECTION_OUTPUT) {
|
|
||||||
pw_properties_setf(props, PW_KEY_LINK_OUTPUT_NODE, "%d", session->dsp->info->id);
|
|
||||||
pw_properties_setf(props, PW_KEY_LINK_OUTPUT_PORT, "%d", -1);
|
|
||||||
pw_properties_setf(props, PW_KEY_LINK_INPUT_NODE, "%d", session->node->info->id);
|
|
||||||
pw_properties_setf(props, PW_KEY_LINK_INPUT_PORT, "%d", -1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pw_properties_setf(props, PW_KEY_LINK_OUTPUT_NODE, "%d", session->node->info->id);
|
|
||||||
pw_properties_setf(props, PW_KEY_LINK_OUTPUT_PORT, "%d", -1);
|
|
||||||
pw_properties_setf(props, PW_KEY_LINK_INPUT_NODE, "%d", session->dsp->info->id);
|
|
||||||
pw_properties_setf(props, PW_KEY_LINK_INPUT_PORT, "%d", -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
session->link_proxy = pw_core_proxy_create_object(impl->core_proxy,
|
|
||||||
"link-factory",
|
|
||||||
PW_TYPE_INTERFACE_Link,
|
|
||||||
PW_VERSION_LINK_PROXY,
|
|
||||||
&props->dict,
|
|
||||||
0);
|
|
||||||
pw_proxy_add_listener(session->link_proxy, &session->link_listener, &link_proxy_events, session);
|
|
||||||
pw_properties_free(props);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int on_node_running(struct impl *impl, struct node *node)
|
static int on_node_running(struct impl *impl, struct node *node)
|
||||||
{
|
{
|
||||||
struct session *sess = node->manager;
|
struct session *sess = node->manager;
|
||||||
|
|
@ -327,7 +271,7 @@ static int on_node_running(struct impl *impl, struct node *node)
|
||||||
switch (node->type) {
|
switch (node->type) {
|
||||||
case NODE_TYPE_DSP:
|
case NODE_TYPE_DSP:
|
||||||
pw_log_debug(NAME" %p: dsp running for session %d", impl, sess->id);
|
pw_log_debug(NAME" %p: dsp running for session %d", impl, sess->id);
|
||||||
link_session_dsp(impl, sess);
|
remove_idle_timeout(sess);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NODE_TYPE_DEVICE:
|
case NODE_TYPE_DEVICE:
|
||||||
|
|
@ -1250,14 +1194,16 @@ static void rescan_session(struct impl *impl, struct session *sess)
|
||||||
props = pw_properties_new_dict(node->info->props);
|
props = pw_properties_new_dict(node->info->props);
|
||||||
if ((str = pw_properties_get(props, PW_KEY_DEVICE_NICK)) == NULL)
|
if ((str = pw_properties_get(props, PW_KEY_DEVICE_NICK)) == NULL)
|
||||||
str = node->info->name;
|
str = node->info->name;
|
||||||
pw_properties_set(props, "audio-dsp.name", str);
|
pw_properties_set(props, PW_KEY_NODE_NAME, str);
|
||||||
pw_properties_setf(props, "audio-dsp.direction", "%d", sess->direction);
|
if (sess->direction == PW_DIRECTION_OUTPUT)
|
||||||
pw_properties_setf(props, "audio-dsp.maxbuffer", "%zd", MAX_QUANTUM_SIZE * sizeof(float));
|
pw_properties_setf(props, "factory.name", "api.alsa.pcm.sink");
|
||||||
|
else
|
||||||
|
pw_properties_setf(props, "factory.name", "api.alsa.pcm.source");
|
||||||
|
|
||||||
pw_log_debug(NAME" %p: making audio dsp for session %d", impl, sess->id);
|
pw_log_debug(NAME" %p: making audio dsp for session %d", impl, sess->id);
|
||||||
|
|
||||||
sess->dsp_proxy = pw_core_proxy_create_object(impl->core_proxy,
|
sess->dsp_proxy = pw_core_proxy_create_object(impl->core_proxy,
|
||||||
"audio-dsp",
|
"adapter",
|
||||||
PW_TYPE_INTERFACE_Node,
|
PW_TYPE_INTERFACE_Node,
|
||||||
PW_VERSION_NODE_PROXY,
|
PW_VERSION_NODE_PROXY,
|
||||||
&props->dict,
|
&props->dict,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue