(API Change) libobs: Make obs_service refcounted

This commit is contained in:
Palana
2015-05-04 02:07:43 +02:00
parent ba0b8eb0e1
commit 71abed387f
7 changed files with 138 additions and 13 deletions

View File

@@ -60,6 +60,9 @@ obs_service_t *obs_service_create(const char *id, const char *name,
return NULL;
}
service->control = bzalloc(sizeof(obs_weak_service_t));
service->control->service = service;
obs_context_data_insert(&service->context,
&obs->data.services_mutex,
&obs->data.first_service);
@@ -247,3 +250,78 @@ void obs_service_apply_encoder_settings(obs_service_t *service,
service->info.apply_encoder_settings(service->context.data,
video_encoder_settings, audio_encoder_settings);
}
void obs_service_addref(obs_service_t *service)
{
if (!service)
return;
obs_ref_addref(&service->control->ref);
}
void obs_service_release(obs_service_t *service)
{
if (!service)
return;
obs_weak_service_t *control = service->control;
if (obs_ref_release(&control->ref)) {
// The order of operations is important here since
// get_context_by_name in obs.c relies on weak refs
// being alive while the context is listed
obs_service_destroy(service);
obs_weak_service_release(control);
}
}
void obs_weak_service_addref(obs_weak_service_t *weak)
{
if (!weak)
return;
obs_weak_ref_addref(&weak->ref);
}
void obs_weak_service_release(obs_weak_service_t *weak)
{
if (!weak)
return;
if (obs_weak_ref_release(&weak->ref))
bfree(weak);
}
obs_service_t *obs_service_get_ref(obs_service_t *service)
{
if (!service)
return NULL;
return obs_weak_service_get_service(service->control);
}
obs_weak_service_t *obs_service_get_weak_service(obs_service_t *service)
{
if (!service)
return NULL;
obs_weak_service_t *weak = service->control;
obs_weak_service_addref(weak);
return weak;
}
obs_service_t *obs_weak_service_get_service(obs_weak_service_t *weak)
{
if (!weak)
return NULL;
if (obs_weak_ref_get_ref(&weak->ref))
return weak->service;
return NULL;
}
bool obs_weak_service_references_service(obs_weak_service_t *weak,
obs_service_t *service)
{
return weak && service && weak->service == service;
}