(API Change) libobs: Make obs_service refcounted
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user