mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
Fix leaks
Add some docs Add properties to loop objects for future use
This commit is contained in:
parent
600055bd68
commit
eeda53dbef
25 changed files with 92 additions and 53 deletions
|
|
@ -26,22 +26,32 @@ extern "C" {
|
||||||
|
|
||||||
#include <spa/list.h>
|
#include <spa/list.h>
|
||||||
|
|
||||||
|
/** \class spa_hook
|
||||||
|
*
|
||||||
|
* \brief a list of hooks
|
||||||
|
*
|
||||||
|
* The hook list provides a way to keep track of hooks.
|
||||||
|
*/
|
||||||
|
/** A list of hooks */
|
||||||
struct spa_hook_list {
|
struct spa_hook_list {
|
||||||
struct spa_list list;
|
struct spa_list list;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** A hook, contains the structure with functions and the data passed
|
||||||
|
* to the functions. */
|
||||||
struct spa_hook {
|
struct spa_hook {
|
||||||
struct spa_list link;
|
struct spa_list link;
|
||||||
const void *funcs;
|
const void *funcs;
|
||||||
void *data;
|
void *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Initialize a hook list */
|
||||||
static inline void spa_hook_list_init(struct spa_hook_list *list)
|
static inline void spa_hook_list_init(struct spa_hook_list *list)
|
||||||
{
|
{
|
||||||
spa_list_init(&list->list);
|
spa_list_init(&list->list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Add a hook \memberof spa_hook */
|
/** Append a hook \memberof spa_hook */
|
||||||
static inline void spa_hook_list_append(struct spa_hook_list *list,
|
static inline void spa_hook_list_append(struct spa_hook_list *list,
|
||||||
struct spa_hook *hook,
|
struct spa_hook *hook,
|
||||||
const void *funcs, void *data)
|
const void *funcs, void *data)
|
||||||
|
|
@ -51,6 +61,7 @@ static inline void spa_hook_list_append(struct spa_hook_list *list,
|
||||||
spa_list_append(&list->list, &hook->link);
|
spa_list_append(&list->list, &hook->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Prepend a hook \memberof spa_hook */
|
||||||
static inline void spa_hook_list_prepend(struct spa_hook_list *list,
|
static inline void spa_hook_list_prepend(struct spa_hook_list *list,
|
||||||
struct spa_hook *hook,
|
struct spa_hook *hook,
|
||||||
const void *funcs, void *data)
|
const void *funcs, void *data)
|
||||||
|
|
@ -60,12 +71,14 @@ static inline void spa_hook_list_prepend(struct spa_hook_list *list,
|
||||||
spa_list_prepend(&list->list, &hook->link);
|
spa_list_prepend(&list->list, &hook->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Remove a listener \memberof spa_hook */
|
/** Remove a hook \memberof spa_hook */
|
||||||
static inline void spa_hook_remove(struct spa_hook *hook)
|
static inline void spa_hook_remove(struct spa_hook *hook)
|
||||||
{
|
{
|
||||||
spa_list_remove(&hook->link);
|
spa_list_remove(&hook->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Call all hooks in a list, starting from the given one and optionally stopping
|
||||||
|
* after calling the first non-NULL function */
|
||||||
#define spa_hook_list_do_call(l,start,type,method,once,...) ({ \
|
#define spa_hook_list_do_call(l,start,type,method,once,...) ({ \
|
||||||
struct spa_hook_list *list = l; \
|
struct spa_hook_list *list = l; \
|
||||||
struct spa_list *s = start ? (struct spa_list *)start : &list->list; \
|
struct spa_list *s = start ? (struct spa_list *)start : &list->list; \
|
||||||
|
|
|
||||||
|
|
@ -686,6 +686,7 @@ static int impl_clear(struct spa_handle *handle)
|
||||||
spa_list_for_each_safe(source, tmp, &impl->destroy_list, link)
|
spa_list_for_each_safe(source, tmp, &impl->destroy_list, link)
|
||||||
free(source);
|
free(source);
|
||||||
|
|
||||||
|
close(impl->ack_fd);
|
||||||
close(impl->epoll_fd);
|
close(impl->epoll_fd);
|
||||||
|
|
||||||
return SPA_RESULT_OK;
|
return SPA_RESULT_OK;
|
||||||
|
|
|
||||||
|
|
@ -41,11 +41,11 @@ int main(int argc, char *argv[])
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
loop = pw_main_loop_new();
|
|
||||||
|
|
||||||
props = pw_properties_new("pipewire.core.name", "pipewire-0",
|
props = pw_properties_new("pipewire.core.name", "pipewire-0",
|
||||||
"pipewire.daemon", "1", NULL);
|
"pipewire.daemon", "1", NULL);
|
||||||
|
|
||||||
|
loop = pw_main_loop_new(props);
|
||||||
|
|
||||||
core = pw_core_new(pw_main_loop_get_loop(loop), props);
|
core = pw_core_new(pw_main_loop_get_loop(loop), props);
|
||||||
|
|
||||||
pw_daemon_config_run_commands(config, core);
|
pw_daemon_config_run_commands(config, core);
|
||||||
|
|
|
||||||
|
|
@ -473,7 +473,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
pw_init(&argc, &argv);
|
pw_init(&argc, &argv);
|
||||||
|
|
||||||
data.loop = pw_loop_new();
|
data.loop = pw_loop_new(NULL);
|
||||||
data.running = true;
|
data.running = true;
|
||||||
data.core = pw_core_new(data.loop, NULL);
|
data.core = pw_core_new(data.loop, NULL);
|
||||||
data.t = pw_core_get_type(data.core);
|
data.t = pw_core_get_type(data.core);
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
pw_init(&argc, &argv);
|
pw_init(&argc, &argv);
|
||||||
|
|
||||||
data.loop = pw_loop_new();
|
data.loop = pw_loop_new(NULL);
|
||||||
data.running = true;
|
data.running = true;
|
||||||
data.core = pw_core_new(data.loop, NULL);
|
data.core = pw_core_new(data.loop, NULL);
|
||||||
data.t = pw_core_get_type(data.core);
|
data.t = pw_core_get_type(data.core);
|
||||||
|
|
|
||||||
|
|
@ -437,7 +437,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
pw_init(&argc, &argv);
|
pw_init(&argc, &argv);
|
||||||
|
|
||||||
data.loop = pw_loop_new();
|
data.loop = pw_loop_new(NULL);
|
||||||
data.running = true;
|
data.running = true;
|
||||||
data.core = pw_core_new(data.loop, NULL);
|
data.core = pw_core_new(data.loop, NULL);
|
||||||
data.t = pw_core_get_type(data.core);
|
data.t = pw_core_get_type(data.core);
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ static void handle_events(struct data *data)
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
exit(0);
|
data->running = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -385,7 +385,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
pw_init(&argc, &argv);
|
pw_init(&argc, &argv);
|
||||||
|
|
||||||
data.loop = pw_loop_new();
|
data.loop = pw_loop_new(NULL);
|
||||||
data.running = true;
|
data.running = true;
|
||||||
data.core = pw_core_new(data.loop, NULL);
|
data.core = pw_core_new(data.loop, NULL);
|
||||||
data.t = pw_core_get_type(data.core);
|
data.t = pw_core_get_type(data.core);
|
||||||
|
|
@ -418,6 +418,7 @@ int main(int argc, char *argv[])
|
||||||
pw_loop_leave(data.loop);
|
pw_loop_leave(data.loop);
|
||||||
|
|
||||||
pw_remote_destroy(data.remote);
|
pw_remote_destroy(data.remote);
|
||||||
|
pw_core_destroy(data.core);
|
||||||
pw_loop_destroy(data.loop);
|
pw_loop_destroy(data.loop);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -281,7 +281,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
pw_init(&argc, &argv);
|
pw_init(&argc, &argv);
|
||||||
|
|
||||||
data.loop = pw_loop_new();
|
data.loop = pw_loop_new(NULL);
|
||||||
data.running = true;
|
data.running = true;
|
||||||
data.core = pw_core_new(data.loop, NULL);
|
data.core = pw_core_new(data.loop, NULL);
|
||||||
data.t = pw_core_get_type(data.core);
|
data.t = pw_core_get_type(data.core);
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,12 @@ struct pw_client_node_transport {
|
||||||
void *output_data; /**< output memory for ringbuffer */
|
void *output_data; /**< output memory for ringbuffer */
|
||||||
struct spa_ringbuffer *output_buffer; /**< ringbuffer for output memory */
|
struct spa_ringbuffer *output_buffer; /**< ringbuffer for output memory */
|
||||||
|
|
||||||
|
/** Destroy a transport
|
||||||
|
* \param trans a transport to destroy
|
||||||
|
* \memberof pw_client_node_transport
|
||||||
|
*/
|
||||||
|
void (*destroy) (struct pw_client_node_transport *trans);
|
||||||
|
|
||||||
/** Add a message to the transport
|
/** Add a message to the transport
|
||||||
* \param trans the transport to send the message on
|
* \param trans the transport to send the message on
|
||||||
* \param message the message to add
|
* \param message the message to add
|
||||||
|
|
@ -98,6 +104,7 @@ struct pw_client_node_transport {
|
||||||
int (*parse_message) (struct pw_client_node_transport *trans, void *message);
|
int (*parse_message) (struct pw_client_node_transport *trans, void *message);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define pw_client_node_transport_destroy(t) ((t)->destroy((t)))
|
||||||
#define pw_client_node_transport_add_message(t,m) ((t)->add_message((t), (m)))
|
#define pw_client_node_transport_add_message(t,m) ((t)->add_message((t), (m)))
|
||||||
#define pw_client_node_transport_next_message(t,m) ((t)->next_message((t), (m)))
|
#define pw_client_node_transport_next_message(t,m) ((t)->next_message((t), (m)))
|
||||||
#define pw_client_node_transport_parse_message(t,m) ((t)->parse_message((t), (m)))
|
#define pw_client_node_transport_parse_message(t,m) ((t)->parse_message((t), (m)))
|
||||||
|
|
|
||||||
|
|
@ -426,7 +426,7 @@ gst_pipewire_device_provider_probe (GstDeviceProvider * provider)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "starting probe");
|
GST_DEBUG_OBJECT (self, "starting probe");
|
||||||
|
|
||||||
if (!(l = pw_loop_new ()))
|
if (!(l = pw_loop_new (NULL)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!(c = pw_core_new (l, NULL)))
|
if (!(c = pw_core_new (l, NULL)))
|
||||||
|
|
@ -503,7 +503,7 @@ gst_pipewire_device_provider_start (GstDeviceProvider * provider)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "starting provider");
|
GST_DEBUG_OBJECT (self, "starting provider");
|
||||||
|
|
||||||
self->loop = pw_loop_new ();
|
self->loop = pw_loop_new (NULL);
|
||||||
self->list_only = FALSE;
|
self->list_only = FALSE;
|
||||||
|
|
||||||
if (!(self->main_loop = pw_thread_loop_new (self->loop, "pipewire-device-monitor"))) {
|
if (!(self->main_loop = pw_thread_loop_new (self->loop, "pipewire-device-monitor"))) {
|
||||||
|
|
@ -590,6 +590,8 @@ gst_pipewire_device_provider_stop (GstDeviceProvider * provider)
|
||||||
{
|
{
|
||||||
GstPipeWireDeviceProvider *self = GST_PIPEWIRE_DEVICE_PROVIDER (provider);
|
GstPipeWireDeviceProvider *self = GST_PIPEWIRE_DEVICE_PROVIDER (provider);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (self, "stopping provider");
|
||||||
|
|
||||||
if (self->remote) {
|
if (self->remote) {
|
||||||
pw_remote_disconnect (self->remote);
|
pw_remote_disconnect (self->remote);
|
||||||
pw_remote_destroy (self->remote);
|
pw_remote_destroy (self->remote);
|
||||||
|
|
|
||||||
|
|
@ -302,7 +302,7 @@ gst_pipewire_sink_init (GstPipeWireSink * sink)
|
||||||
|
|
||||||
g_queue_init (&sink->queue);
|
g_queue_init (&sink->queue);
|
||||||
|
|
||||||
sink->loop = pw_loop_new ();
|
sink->loop = pw_loop_new (NULL);
|
||||||
sink->main_loop = pw_thread_loop_new (sink->loop, "pipewire-sink-loop");
|
sink->main_loop = pw_thread_loop_new (sink->loop, "pipewire-sink-loop");
|
||||||
sink->core = pw_core_new (sink->loop, NULL);
|
sink->core = pw_core_new (sink->loop, NULL);
|
||||||
sink->type = pw_core_get_type (sink->core);
|
sink->type = pw_core_get_type (sink->core);
|
||||||
|
|
|
||||||
|
|
@ -308,7 +308,7 @@ gst_pipewire_src_init (GstPipeWireSrc * src)
|
||||||
src->client_name = pw_get_client_name ();
|
src->client_name = pw_get_client_name ();
|
||||||
src->buf_ids = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) gst_buffer_unref);
|
src->buf_ids = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) gst_buffer_unref);
|
||||||
|
|
||||||
src->loop = pw_loop_new ();
|
src->loop = pw_loop_new (NULL);
|
||||||
src->main_loop = pw_thread_loop_new (src->loop, "pipewire-main-loop");
|
src->main_loop = pw_thread_loop_new (src->loop, "pipewire-main-loop");
|
||||||
src->core = pw_core_new (src->loop, NULL);
|
src->core = pw_core_new (src->loop, NULL);
|
||||||
src->type = pw_core_get_type (src->core);
|
src->type = pw_core_get_type (src->core);
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,16 @@ static void transport_reset_area(struct pw_client_node_transport *trans)
|
||||||
spa_ringbuffer_init(trans->output_buffer, OUTPUT_BUFFER_SIZE);
|
spa_ringbuffer_init(trans->output_buffer, OUTPUT_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void destroy(struct pw_client_node_transport *trans)
|
||||||
|
{
|
||||||
|
struct transport *impl = (struct transport *) trans;
|
||||||
|
|
||||||
|
pw_log_debug("transport %p: destroy", trans);
|
||||||
|
|
||||||
|
pw_memblock_free(&impl->mem);
|
||||||
|
free(impl);
|
||||||
|
}
|
||||||
|
|
||||||
static int add_message(struct pw_client_node_transport *trans, struct pw_client_node_message *message)
|
static int add_message(struct pw_client_node_transport *trans, struct pw_client_node_message *message)
|
||||||
{
|
{
|
||||||
struct transport *impl = (struct transport *) trans;
|
struct transport *impl = (struct transport *) trans;
|
||||||
|
|
@ -194,6 +204,7 @@ pw_client_node_transport_new(uint32_t max_input_ports, uint32_t max_output_ports
|
||||||
transport_setup_area(impl->mem.ptr, trans);
|
transport_setup_area(impl->mem.ptr, trans);
|
||||||
transport_reset_area(trans);
|
transport_reset_area(trans);
|
||||||
|
|
||||||
|
trans->destroy = destroy;
|
||||||
trans->add_message = add_message;
|
trans->add_message = add_message;
|
||||||
trans->next_message = next_message;
|
trans->next_message = next_message;
|
||||||
trans->parse_message = parse_message;
|
trans->parse_message = parse_message;
|
||||||
|
|
@ -236,6 +247,7 @@ pw_client_node_transport_new_from_info(struct pw_client_node_transport_info *inf
|
||||||
trans->output_data = trans->input_data;
|
trans->output_data = trans->input_data;
|
||||||
trans->input_data = tmp;
|
trans->input_data = tmp;
|
||||||
|
|
||||||
|
trans->destroy = destroy;
|
||||||
trans->add_message = add_message;
|
trans->add_message = add_message;
|
||||||
trans->next_message = next_message;
|
trans->next_message = next_message;
|
||||||
trans->parse_message = parse_message;
|
trans->parse_message = parse_message;
|
||||||
|
|
@ -247,20 +259,6 @@ pw_client_node_transport_new_from_info(struct pw_client_node_transport_info *inf
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Destroy a transport
|
|
||||||
* \param trans a transport to destroy
|
|
||||||
* \memberof pw_client_node_transport
|
|
||||||
*/
|
|
||||||
void pw_client_node_transport_destroy(struct pw_client_node_transport *trans)
|
|
||||||
{
|
|
||||||
struct transport *impl = (struct transport *) trans;
|
|
||||||
|
|
||||||
pw_log_debug("transport %p: destroy", trans);
|
|
||||||
|
|
||||||
pw_memblock_free(&impl->mem);
|
|
||||||
free(impl);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Get transport info
|
/** Get transport info
|
||||||
* \param trans the transport to get info of
|
* \param trans the transport to get info of
|
||||||
* \param[out] info transport info
|
* \param[out] info transport info
|
||||||
|
|
|
||||||
|
|
@ -44,9 +44,6 @@ pw_client_node_transport_new(uint32_t max_input_ports, uint32_t max_output_ports
|
||||||
struct pw_client_node_transport *
|
struct pw_client_node_transport *
|
||||||
pw_client_node_transport_new_from_info(struct pw_client_node_transport_info *info);
|
pw_client_node_transport_new_from_info(struct pw_client_node_transport_info *info);
|
||||||
|
|
||||||
void
|
|
||||||
pw_client_node_transport_destroy(struct pw_client_node_transport *trans);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pw_client_node_transport_get_info(struct pw_client_node_transport *trans,
|
pw_client_node_transport_get_info(struct pw_client_node_transport *trans,
|
||||||
struct pw_client_node_transport_info *info);
|
struct pw_client_node_transport_info *info);
|
||||||
|
|
|
||||||
|
|
@ -347,7 +347,7 @@ struct pw_core *pw_core_new(struct pw_loop *main_loop, struct pw_properties *pro
|
||||||
if (this == NULL)
|
if (this == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
this->data_loop_impl = pw_data_loop_new();
|
this->data_loop_impl = pw_data_loop_new(properties);
|
||||||
if (this->data_loop_impl == NULL)
|
if (this->data_loop_impl == NULL)
|
||||||
goto no_data_loop;
|
goto no_data_loop;
|
||||||
|
|
||||||
|
|
@ -400,9 +400,13 @@ struct pw_core *pw_core_new(struct pw_loop *main_loop, struct pw_properties *pro
|
||||||
this->info.name = pw_properties_get(properties, "pipewire.core.name");
|
this->info.name = pw_properties_get(properties, "pipewire.core.name");
|
||||||
this->properties = properties;
|
this->properties = properties;
|
||||||
|
|
||||||
this->global = pw_core_add_global(this, NULL, NULL, this->type.core, PW_VERSION_CORE,
|
this->global = pw_core_add_global(this,
|
||||||
core_bind_func, this);
|
NULL,
|
||||||
|
NULL,
|
||||||
|
this->type.core,
|
||||||
|
PW_VERSION_CORE,
|
||||||
|
core_bind_func,
|
||||||
|
this);
|
||||||
return this;
|
return this;
|
||||||
|
|
||||||
no_data_loop:
|
no_data_loop:
|
||||||
|
|
@ -418,11 +422,18 @@ struct pw_core *pw_core_new(struct pw_loop *main_loop, struct pw_properties *pro
|
||||||
*/
|
*/
|
||||||
void pw_core_destroy(struct pw_core *core)
|
void pw_core_destroy(struct pw_core *core)
|
||||||
{
|
{
|
||||||
|
struct pw_global *global, *t;
|
||||||
|
|
||||||
pw_log_debug("core %p: destroy", core);
|
pw_log_debug("core %p: destroy", core);
|
||||||
spa_hook_list_call(&core->listener_list, struct pw_core_events, destroy, core);
|
spa_hook_list_call(&core->listener_list, struct pw_core_events, destroy, core);
|
||||||
|
|
||||||
|
spa_list_for_each_safe(global, t, &core->global_list, link)
|
||||||
|
pw_global_destroy(global);
|
||||||
|
|
||||||
pw_data_loop_destroy(core->data_loop_impl);
|
pw_data_loop_destroy(core->data_loop_impl);
|
||||||
|
|
||||||
|
pw_properties_free(core->properties);
|
||||||
|
|
||||||
pw_map_clear(&core->globals);
|
pw_map_clear(&core->globals);
|
||||||
|
|
||||||
pw_log_debug("core %p: free", core);
|
pw_log_debug("core %p: free", core);
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,7 @@ static void do_stop(struct spa_loop_utils *utils, struct spa_source *source, uin
|
||||||
*
|
*
|
||||||
* \memberof pw_data_loop
|
* \memberof pw_data_loop
|
||||||
*/
|
*/
|
||||||
struct pw_data_loop *pw_data_loop_new(void)
|
struct pw_data_loop *pw_data_loop_new(struct pw_properties *properties)
|
||||||
{
|
{
|
||||||
struct pw_data_loop *this;
|
struct pw_data_loop *this;
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@ struct pw_data_loop *pw_data_loop_new(void)
|
||||||
|
|
||||||
pw_log_debug("data-loop %p: new", this);
|
pw_log_debug("data-loop %p: new", this);
|
||||||
|
|
||||||
this->loop = pw_loop_new();
|
this->loop = pw_loop_new(properties);
|
||||||
if (this->loop == NULL)
|
if (this->loop == NULL)
|
||||||
goto no_loop;
|
goto no_loop;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ struct pw_data_loop_events {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pw_data_loop *
|
struct pw_data_loop *
|
||||||
pw_data_loop_new(void);
|
pw_data_loop_new(struct pw_properties *properties);
|
||||||
|
|
||||||
void pw_data_loop_add_listener(struct pw_data_loop *loop,
|
void pw_data_loop_add_listener(struct pw_data_loop *loop,
|
||||||
struct spa_hook *listener,
|
struct spa_hook *listener,
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ struct impl {
|
||||||
* \returns a newly allocated loop
|
* \returns a newly allocated loop
|
||||||
* \memberof pw_loop
|
* \memberof pw_loop
|
||||||
*/
|
*/
|
||||||
struct pw_loop *pw_loop_new(void)
|
struct pw_loop *pw_loop_new(struct pw_properties *properties)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
struct impl *impl;
|
struct impl *impl;
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ extern "C" {
|
||||||
|
|
||||||
#include <spa/loop.h>
|
#include <spa/loop.h>
|
||||||
|
|
||||||
|
#include <pipewire/properties.h>
|
||||||
|
|
||||||
/** \class pw_loop
|
/** \class pw_loop
|
||||||
*
|
*
|
||||||
|
|
@ -40,7 +41,7 @@ struct pw_loop {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pw_loop *
|
struct pw_loop *
|
||||||
pw_loop_new(void);
|
pw_loop_new(struct pw_properties *properties);
|
||||||
|
|
||||||
void
|
void
|
||||||
pw_loop_destroy(struct pw_loop *loop);
|
pw_loop_destroy(struct pw_loop *loop);
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
*
|
*
|
||||||
* \memberof pw_main_loop
|
* \memberof pw_main_loop
|
||||||
*/
|
*/
|
||||||
struct pw_main_loop *pw_main_loop_new(void)
|
struct pw_main_loop *pw_main_loop_new(struct pw_properties *properties)
|
||||||
{
|
{
|
||||||
struct pw_main_loop *this;
|
struct pw_main_loop *this;
|
||||||
|
|
||||||
|
|
@ -36,7 +36,7 @@ struct pw_main_loop *pw_main_loop_new(void)
|
||||||
|
|
||||||
pw_log_debug("main-loop %p: new", this);
|
pw_log_debug("main-loop %p: new", this);
|
||||||
|
|
||||||
this->loop = pw_loop_new();
|
this->loop = pw_loop_new(properties);
|
||||||
if (this->loop == NULL)
|
if (this->loop == NULL)
|
||||||
goto no_loop;
|
goto no_loop;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ struct pw_main_loop_events {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pw_main_loop *
|
struct pw_main_loop *
|
||||||
pw_main_loop_new(void);
|
pw_main_loop_new(struct pw_properties *properties);
|
||||||
|
|
||||||
void pw_main_loop_add_listener(struct pw_main_loop *loop,
|
void pw_main_loop_add_listener(struct pw_main_loop *loop,
|
||||||
struct spa_hook *listener,
|
struct spa_hook *listener,
|
||||||
|
|
|
||||||
|
|
@ -271,7 +271,7 @@ void pw_remote_destroy(struct pw_remote *remote)
|
||||||
pw_remote_disconnect(remote);
|
pw_remote_disconnect(remote);
|
||||||
|
|
||||||
spa_list_for_each_safe(stream, s2, &remote->stream_list, link)
|
spa_list_for_each_safe(stream, s2, &remote->stream_list, link)
|
||||||
pw_stream_destroy(stream);
|
pw_stream_destroy(stream);
|
||||||
|
|
||||||
pw_protocol_connection_destroy (remote->conn);
|
pw_protocol_connection_destroy (remote->conn);
|
||||||
|
|
||||||
|
|
@ -1005,7 +1005,10 @@ struct pw_proxy *pw_remote_export(struct pw_remote *remote,
|
||||||
|
|
||||||
pw_node_add_listener(node, &data->node_listener, &node_events, data);
|
pw_node_add_listener(node, &data->node_listener, &node_events, data);
|
||||||
|
|
||||||
pw_client_node_proxy_add_listener(data->node_proxy, &data->proxy_listener, &client_node_events, proxy);
|
pw_client_node_proxy_add_listener(data->node_proxy,
|
||||||
|
&data->proxy_listener,
|
||||||
|
&client_node_events,
|
||||||
|
proxy);
|
||||||
do_node_init(proxy);
|
do_node_init(proxy);
|
||||||
|
|
||||||
return proxy;
|
return proxy;
|
||||||
|
|
|
||||||
|
|
@ -260,7 +260,6 @@ do_remove_sources(struct spa_loop *loop,
|
||||||
struct stream *impl = user_data;
|
struct stream *impl = user_data;
|
||||||
struct pw_stream *stream = &impl->this;
|
struct pw_stream *stream = &impl->this;
|
||||||
|
|
||||||
printf("removing sources\n");
|
|
||||||
if (impl->rtsocket_source) {
|
if (impl->rtsocket_source) {
|
||||||
pw_loop_destroy_source(stream->remote->core->data_loop, impl->rtsocket_source);
|
pw_loop_destroy_source(stream->remote->core->data_loop, impl->rtsocket_source);
|
||||||
impl->rtsocket_source = NULL;
|
impl->rtsocket_source = NULL;
|
||||||
|
|
@ -328,13 +327,13 @@ void pw_stream_destroy(struct pw_stream *stream)
|
||||||
|
|
||||||
spa_hook_list_call(&stream->listener_list, struct pw_stream_events, destroy);
|
spa_hook_list_call(&stream->listener_list, struct pw_stream_events, destroy);
|
||||||
|
|
||||||
unhandle_socket(stream);
|
|
||||||
|
|
||||||
spa_list_remove(&stream->link);
|
|
||||||
|
|
||||||
if (impl->node_proxy)
|
if (impl->node_proxy)
|
||||||
spa_hook_remove(&impl->proxy_listener);
|
spa_hook_remove(&impl->proxy_listener);
|
||||||
|
|
||||||
|
pw_stream_disconnect(stream);
|
||||||
|
|
||||||
|
spa_list_remove(&stream->link);
|
||||||
|
|
||||||
set_possible_formats(stream, 0, NULL);
|
set_possible_formats(stream, 0, NULL);
|
||||||
set_params(stream, 0, NULL);
|
set_params(stream, 0, NULL);
|
||||||
|
|
||||||
|
|
@ -872,6 +871,8 @@ static void client_node_transport(void *data, uint32_t node_id,
|
||||||
|
|
||||||
stream->node_id = node_id;
|
stream->node_id = node_id;
|
||||||
|
|
||||||
|
if (impl->trans)
|
||||||
|
pw_client_node_transport_destroy(impl->trans);
|
||||||
impl->trans = transport;
|
impl->trans = transport;
|
||||||
|
|
||||||
pw_log_info("stream %p: create client transport %p with fds %d %d for node %u",
|
pw_log_info("stream %p: create client transport %p with fds %d %d for node %u",
|
||||||
|
|
@ -903,7 +904,6 @@ static void on_node_proxy_destroy(void *data)
|
||||||
|
|
||||||
impl->disconnecting = false;
|
impl->disconnecting = false;
|
||||||
impl->node_proxy = NULL;
|
impl->node_proxy = NULL;
|
||||||
|
|
||||||
spa_hook_remove(&impl->proxy_listener);
|
spa_hook_remove(&impl->proxy_listener);
|
||||||
|
|
||||||
stream_set_state(this, PW_STREAM_STATE_UNCONNECTED, NULL);
|
stream_set_state(this, PW_STREAM_STATE_UNCONNECTED, NULL);
|
||||||
|
|
@ -994,6 +994,10 @@ void pw_stream_disconnect(struct pw_stream *stream)
|
||||||
pw_client_node_proxy_destroy(impl->node_proxy);
|
pw_client_node_proxy_destroy(impl->node_proxy);
|
||||||
impl->node_proxy = NULL;
|
impl->node_proxy = NULL;
|
||||||
}
|
}
|
||||||
|
if (impl->trans) {
|
||||||
|
pw_client_node_transport_destroy(impl->trans);
|
||||||
|
impl->trans = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pw_stream_get_time(struct pw_stream *stream, struct pw_time *time)
|
bool pw_stream_get_time(struct pw_stream *stream, struct pw_time *time)
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,8 @@ static void do_stop(struct spa_loop_utils *utils, struct spa_source *source, uin
|
||||||
*
|
*
|
||||||
* \memberof pw_thread_loop
|
* \memberof pw_thread_loop
|
||||||
*/
|
*/
|
||||||
struct pw_thread_loop *pw_thread_loop_new(struct pw_loop *loop, const char *name)
|
struct pw_thread_loop *pw_thread_loop_new(struct pw_loop *loop,
|
||||||
|
const char *name)
|
||||||
{
|
{
|
||||||
struct pw_thread_loop *this;
|
struct pw_thread_loop *this;
|
||||||
pthread_mutexattr_t attr;
|
pthread_mutexattr_t attr;
|
||||||
|
|
|
||||||
|
|
@ -385,7 +385,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
pw_init(&argc, &argv);
|
pw_init(&argc, &argv);
|
||||||
|
|
||||||
data.loop = pw_loop_new();
|
data.loop = pw_loop_new(NULL);
|
||||||
data.running = true;
|
data.running = true;
|
||||||
data.core = pw_core_new(data.loop, NULL);
|
data.core = pw_core_new(data.loop, NULL);
|
||||||
data.remote = pw_remote_new(data.core, NULL);
|
data.remote = pw_remote_new(data.core, NULL);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue