mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -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-device
|
||||
load-module libpipewire-module-access
|
||||
load-module libpipewire-module-audio-dsp
|
||||
load-module libpipewire-module-adapter
|
||||
load-module libpipewire-module-link-factory
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
struct session *sess = node->manager;
|
||||
|
|
@ -254,7 +244,9 @@ static int on_node_idle(struct impl *impl, struct node *node)
|
|||
switch (node->type) {
|
||||
case NODE_TYPE_DSP:
|
||||
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;
|
||||
|
||||
case NODE_TYPE_DEVICE:
|
||||
|
|
@ -269,54 +261,6 @@ static int on_node_idle(struct impl *impl, struct node *node)
|
|||
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)
|
||||
{
|
||||
struct session *sess = node->manager;
|
||||
|
|
@ -327,7 +271,7 @@ static int on_node_running(struct impl *impl, struct node *node)
|
|||
switch (node->type) {
|
||||
case NODE_TYPE_DSP:
|
||||
pw_log_debug(NAME" %p: dsp running for session %d", impl, sess->id);
|
||||
link_session_dsp(impl, sess);
|
||||
remove_idle_timeout(sess);
|
||||
break;
|
||||
|
||||
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);
|
||||
if ((str = pw_properties_get(props, PW_KEY_DEVICE_NICK)) == NULL)
|
||||
str = node->info->name;
|
||||
pw_properties_set(props, "audio-dsp.name", str);
|
||||
pw_properties_setf(props, "audio-dsp.direction", "%d", sess->direction);
|
||||
pw_properties_setf(props, "audio-dsp.maxbuffer", "%zd", MAX_QUANTUM_SIZE * sizeof(float));
|
||||
pw_properties_set(props, PW_KEY_NODE_NAME, str);
|
||||
if (sess->direction == PW_DIRECTION_OUTPUT)
|
||||
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);
|
||||
|
||||
sess->dsp_proxy = pw_core_proxy_create_object(impl->core_proxy,
|
||||
"audio-dsp",
|
||||
"adapter",
|
||||
PW_TYPE_INTERFACE_Node,
|
||||
PW_VERSION_NODE_PROXY,
|
||||
&props->dict,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue