From 77a35e93ea53b92d1fffadb234d8bad0b668a246 Mon Sep 17 00:00:00 2001 From: Jim Date: Mon, 24 Jan 2022 11:59:17 -0800 Subject: [PATCH] libobs: Use get_ref calls for obs.hpp helper classes --- libobs/obs.hpp | 67 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/libobs/obs.hpp b/libobs/obs.hpp index 2fac266f4..2cbb1650c 100644 --- a/libobs/obs.hpp +++ b/libobs/obs.hpp @@ -25,19 +25,23 @@ template class OBSRefAutoRelease; template class OBSRef; +template class OBSSafeRef; -using OBSSource = OBSRef; -using OBSScene = OBSRef; +using OBSSource = + OBSSafeRef; +using OBSScene = + OBSSafeRef; using OBSSceneItem = OBSRef; using OBSData = OBSRef; using OBSDataArray = OBSRef; -using OBSOutput = OBSRef; +using OBSOutput = + OBSSafeRef; using OBSEncoder = - OBSRef; + OBSSafeRef; using OBSService = - OBSRef; + OBSSafeRef; using OBSWeakSource = OBSRef; @@ -150,19 +154,58 @@ public: inline OBSRef &operator=(const OBSRef &ref) { return Replace(ref.val); } inline OBSRef &operator=(T valIn) { return Replace(valIn); } - friend OBSSource OBSGetStrongRef(obs_weak_source_t *weak); friend OBSWeakSource OBSGetWeakRef(obs_source_t *source); - - friend OBSOutput OBSGetStrongRef(obs_weak_output_t *weak); friend OBSWeakOutput OBSGetWeakRef(obs_output_t *output); - - friend OBSEncoder OBSGetStrongRef(obs_weak_encoder_t *weak); friend OBSWeakEncoder OBSGetWeakRef(obs_encoder_t *encoder); - - friend OBSService OBSGetStrongRef(obs_weak_service_t *weak); friend OBSWeakService OBSGetWeakRef(obs_service_t *service); }; +template +class OBSSafeRef : public OBSRefAutoRelease { + + inline OBSSafeRef &Replace(T valIn) + { + T newVal = getref(valIn); + release(this->val); + this->val = newVal; + return *this; + } + + struct TakeOwnership { + }; + inline OBSSafeRef(T val_, TakeOwnership) + : OBSRefAutoRelease::OBSRefAutoRelease(val_) + { + } + +public: + inline OBSSafeRef() + : OBSRefAutoRelease::OBSRefAutoRelease(nullptr) + { + } + inline OBSSafeRef(const OBSSafeRef &ref) + : OBSRefAutoRelease::OBSRefAutoRelease(ref.val) + { + this->val = getref(ref.val); + } + inline OBSSafeRef(T val_) + : OBSRefAutoRelease::OBSRefAutoRelease(val_) + { + this->val = getref(this->val); + } + + inline OBSSafeRef &operator=(const OBSSafeRef &ref) + { + return Replace(ref.val); + } + inline OBSSafeRef &operator=(T valIn) { return Replace(valIn); } + + friend OBSSource OBSGetStrongRef(obs_weak_source_t *weak); + friend OBSOutput OBSGetStrongRef(obs_weak_output_t *weak); + friend OBSEncoder OBSGetStrongRef(obs_weak_encoder_t *weak); + friend OBSService OBSGetStrongRef(obs_weak_service_t *weak); +}; + inline OBSSource OBSGetStrongRef(obs_weak_source_t *weak) { return {obs_weak_source_get_source(weak), OBSSource::TakeOwnership()};