mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
pulse-server: implement OBJECT_LINGER
Use OBJECT_LINGER in module-load to make sure the module stays loaded after the client disconnects. Implement linger in adapter and node-factory
This commit is contained in:
parent
0fe77d39ce
commit
1934df7307
3 changed files with 15 additions and 3 deletions
|
|
@ -69,6 +69,7 @@ struct node_data {
|
||||||
struct pw_resource *resource;
|
struct pw_resource *resource;
|
||||||
struct spa_hook resource_listener;
|
struct spa_hook resource_listener;
|
||||||
uint32_t new_id;
|
uint32_t new_id;
|
||||||
|
unsigned int linger;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void resource_destroy(void *data)
|
static void resource_destroy(void *data)
|
||||||
|
|
@ -77,7 +78,7 @@ static void resource_destroy(void *data)
|
||||||
|
|
||||||
pw_log_debug(NAME" %p: destroy %p", nd, nd->adapter);
|
pw_log_debug(NAME" %p: destroy %p", nd, nd->adapter);
|
||||||
spa_hook_remove(&nd->resource_listener);
|
spa_hook_remove(&nd->resource_listener);
|
||||||
if (nd->adapter)
|
if (nd->adapter && !nd->linger)
|
||||||
pw_impl_node_destroy(nd->adapter);
|
pw_impl_node_destroy(nd->adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -156,6 +157,7 @@ static void *create_object(void *_data,
|
||||||
const char *str, *factory_name;
|
const char *str, *factory_name;
|
||||||
int res;
|
int res;
|
||||||
struct node_data *nd;
|
struct node_data *nd;
|
||||||
|
bool linger;
|
||||||
|
|
||||||
if (properties == NULL)
|
if (properties == NULL)
|
||||||
goto error_properties;
|
goto error_properties;
|
||||||
|
|
@ -178,6 +180,9 @@ static void *create_object(void *_data,
|
||||||
|
|
||||||
pw_properties_setf(properties, "audio.adapt.follower", "pointer:%p", follower);
|
pw_properties_setf(properties, "audio.adapt.follower", "pointer:%p", follower);
|
||||||
}
|
}
|
||||||
|
str = pw_properties_get(properties, PW_KEY_OBJECT_LINGER);
|
||||||
|
linger = str ? pw_properties_parse_bool(str) : false;
|
||||||
|
|
||||||
if (follower == NULL) {
|
if (follower == NULL) {
|
||||||
factory_name = pw_properties_get(properties, SPA_KEY_FACTORY_NAME);
|
factory_name = pw_properties_get(properties, SPA_KEY_FACTORY_NAME);
|
||||||
if (factory_name == NULL)
|
if (factory_name == NULL)
|
||||||
|
|
@ -211,6 +216,7 @@ static void *create_object(void *_data,
|
||||||
nd->follower = follower;
|
nd->follower = follower;
|
||||||
nd->resource = resource;
|
nd->resource = resource;
|
||||||
nd->new_id = new_id;
|
nd->new_id = new_id;
|
||||||
|
nd->linger = linger;
|
||||||
spa_list_append(&d->node_list, &nd->link);
|
spa_list_append(&d->node_list, &nd->link);
|
||||||
|
|
||||||
pw_impl_node_add_listener(adapter, &nd->adapter_listener, &node_events, nd);
|
pw_impl_node_add_listener(adapter, &nd->adapter_listener, &node_events, nd);
|
||||||
|
|
|
||||||
|
|
@ -176,6 +176,7 @@ static int load_module(struct client *client, const char *name, const char *argu
|
||||||
pw_properties_set(props, "device.description", NULL);
|
pw_properties_set(props, "device.description", NULL);
|
||||||
}
|
}
|
||||||
pw_properties_set(props, "factory.name", "support.null-audio-sink");
|
pw_properties_set(props, "factory.name", "support.null-audio-sink");
|
||||||
|
pw_properties_set(props, PW_KEY_OBJECT_LINGER, "1");
|
||||||
|
|
||||||
module = calloc(1, sizeof(struct module));
|
module = calloc(1, sizeof(struct module));
|
||||||
module->client = client;
|
module->client = client;
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ struct node_data {
|
||||||
struct pw_impl_node *node;
|
struct pw_impl_node *node;
|
||||||
struct spa_hook node_listener;
|
struct spa_hook node_listener;
|
||||||
struct spa_hook resource_listener;
|
struct spa_hook resource_listener;
|
||||||
|
unsigned int linger:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void resource_destroy(void *data)
|
static void resource_destroy(void *data)
|
||||||
|
|
@ -70,7 +71,7 @@ static void resource_destroy(void *data)
|
||||||
struct node_data *nd = data;
|
struct node_data *nd = data;
|
||||||
pw_log_debug("node %p", nd);
|
pw_log_debug("node %p", nd);
|
||||||
spa_hook_remove(&nd->resource_listener);
|
spa_hook_remove(&nd->resource_listener);
|
||||||
if (nd->node)
|
if (nd->node && !nd->linger)
|
||||||
pw_impl_node_destroy(nd->node);
|
pw_impl_node_destroy(nd->node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,10 +104,11 @@ static void *create_object(void *_data,
|
||||||
struct factory_data *data = _data;
|
struct factory_data *data = _data;
|
||||||
struct pw_context *context = data->context;
|
struct pw_context *context = data->context;
|
||||||
struct pw_impl_node *node;
|
struct pw_impl_node *node;
|
||||||
const char *factory_name;
|
const char *factory_name, *str;
|
||||||
struct node_data *nd;
|
struct node_data *nd;
|
||||||
int res;
|
int res;
|
||||||
struct pw_impl_client *client;
|
struct pw_impl_client *client;
|
||||||
|
bool linger;
|
||||||
|
|
||||||
if (properties == NULL)
|
if (properties == NULL)
|
||||||
goto error_properties;
|
goto error_properties;
|
||||||
|
|
@ -124,6 +126,8 @@ static void *create_object(void *_data,
|
||||||
pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d",
|
pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d",
|
||||||
pw_global_get_id(pw_impl_client_get_global(client)));
|
pw_global_get_id(pw_impl_client_get_global(client)));
|
||||||
}
|
}
|
||||||
|
str = pw_properties_get(properties, PW_KEY_OBJECT_LINGER);
|
||||||
|
linger = str ? pw_properties_parse_bool(str) : false;
|
||||||
|
|
||||||
node = pw_spa_node_load(context,
|
node = pw_spa_node_load(context,
|
||||||
factory_name,
|
factory_name,
|
||||||
|
|
@ -136,6 +140,7 @@ static void *create_object(void *_data,
|
||||||
nd = pw_spa_node_get_user_data(node);
|
nd = pw_spa_node_get_user_data(node);
|
||||||
nd->data = data;
|
nd->data = data;
|
||||||
nd->node = node;
|
nd->node = node;
|
||||||
|
nd->linger = linger;
|
||||||
spa_list_append(&data->node_list, &nd->link);
|
spa_list_append(&data->node_list, &nd->link);
|
||||||
|
|
||||||
pw_impl_node_add_listener(node, &nd->node_listener, &node_events, nd);
|
pw_impl_node_add_listener(node, &nd->node_listener, &node_events, nd);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue