mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-08 13:30:08 -05:00
media-session: improve cleanup
This commit is contained in:
parent
2a4c57798d
commit
147f488514
11 changed files with 301 additions and 162 deletions
|
|
@ -65,6 +65,8 @@ struct metadata {
|
|||
struct spa_interface iface;
|
||||
|
||||
struct sm_media_session *session;
|
||||
struct spa_hook session_listener;
|
||||
|
||||
struct spa_hook_list hooks;
|
||||
|
||||
struct pw_properties *properties;
|
||||
|
|
@ -180,11 +182,33 @@ struct pw_metadata_methods impl_metadata = {
|
|||
.clear = impl_clear,
|
||||
};
|
||||
|
||||
void *sm_metadata_start(struct sm_media_session *sess)
|
||||
static void session_destroy(void *data)
|
||||
{
|
||||
struct metadata *this = data;
|
||||
|
||||
spa_hook_remove(&this->session_listener);
|
||||
pw_proxy_destroy(this->proxy);
|
||||
|
||||
clear_items(this);
|
||||
pw_array_clear(&this->metadata);
|
||||
pw_properties_free(this->properties);
|
||||
free(this);
|
||||
}
|
||||
|
||||
static const struct sm_media_session_events session_events = {
|
||||
SM_VERSION_MEDIA_SESSION_EVENTS,
|
||||
.destroy = session_destroy,
|
||||
};
|
||||
|
||||
int sm_metadata_start(struct sm_media_session *sess)
|
||||
{
|
||||
struct metadata *md;
|
||||
int res;
|
||||
|
||||
md = calloc(1, sizeof(*md));
|
||||
if (md == NULL)
|
||||
return -errno;
|
||||
|
||||
md->session = sess;
|
||||
md->properties = pw_properties_new(NULL, NULL);
|
||||
pw_array_init(&md->metadata, 4096);
|
||||
|
|
@ -200,18 +224,18 @@ void *sm_metadata_start(struct sm_media_session *sess)
|
|||
NULL,
|
||||
md,
|
||||
0);
|
||||
return md;
|
||||
}
|
||||
if (md->proxy == NULL) {
|
||||
res = -errno;
|
||||
goto error_free;
|
||||
}
|
||||
|
||||
int sm_metadata_stop(void *data)
|
||||
{
|
||||
struct metadata *this = data;
|
||||
|
||||
pw_proxy_destroy(this->proxy);
|
||||
|
||||
clear_items(this);
|
||||
pw_array_clear(&this->metadata);
|
||||
pw_properties_free(this->properties);
|
||||
free(this);
|
||||
sm_media_session_add_listener(sess, &md->session_listener,
|
||||
&session_events, md);
|
||||
return 0;
|
||||
|
||||
error_free:
|
||||
pw_array_clear(&md->metadata);
|
||||
pw_properties_free(md->properties);
|
||||
free(md);
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue