From 94e7be18459568fb6a5631f0551c0a858f00e2be Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 2 Jul 2019 17:39:04 +0200 Subject: [PATCH] media-session: use adapter around sink Don't use the DSP nodes anymore, use the adapter instead and wrap it around a sink/source. --- pipewire-pulseaudio | 2 +- src/daemon/pipewire.conf.in | 2 +- src/examples/media-session.c | 74 +++++------------------------------- 3 files changed, 12 insertions(+), 66 deletions(-) diff --git a/pipewire-pulseaudio b/pipewire-pulseaudio index d00b9f163..67c1dca89 160000 --- a/pipewire-pulseaudio +++ b/pipewire-pulseaudio @@ -1 +1 @@ -Subproject commit d00b9f163594b76a3107fcfeee06982f93ac40b7 +Subproject commit 67c1dca8978dcc69111058c2638be5dc03db158d diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in index 3aba3ae24..373698fdd 100644 --- a/src/daemon/pipewire.conf.in +++ b/src/daemon/pipewire.conf.in @@ -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 diff --git a/src/examples/media-session.c b/src/examples/media-session.c index 3e72e1f6c..390d5cdd0 100644 --- a/src/examples/media-session.c +++ b/src/examples/media-session.c @@ -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,