obs-source: Deprecate obs::source due to stability issues

This should be replaced with a class inheriting from std::shared_ptr.
This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2019-12-21 17:43:12 +01:00
parent 6ce6ffe5bd
commit cbada3e438
8 changed files with 215 additions and 149 deletions

View file

@ -76,7 +76,7 @@ void filter::dynamic_mask::dynamic_mask_instance::update(obs_data_t* settings)
{ {
// Update source. // Update source.
try { try {
_input = std::make_shared<obs::source>(obs_data_get_string(settings, ST_INPUT)); _input = std::make_shared<obs::deprecated_source>(obs_data_get_string(settings, ST_INPUT));
_input_capture = std::make_shared<gfx::source_texture>(_input, _self); _input_capture = std::make_shared<gfx::source_texture>(_input, _self);
_input->events.rename += std::bind(&filter::dynamic_mask::dynamic_mask_instance::input_renamed, this, _input->events.rename += std::bind(&filter::dynamic_mask::dynamic_mask_instance::input_renamed, this,
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
@ -169,7 +169,7 @@ void filter::dynamic_mask::dynamic_mask_instance::save(obs_data_t* settings)
} }
} }
void filter::dynamic_mask::dynamic_mask_instance::input_renamed(obs::source*, std::string old_name, void filter::dynamic_mask::dynamic_mask_instance::input_renamed(obs::deprecated_source*, std::string old_name,
std::string new_name) std::string new_name)
{ {
obs_data_t* settings = obs_source_get_settings(_self); obs_data_t* settings = obs_source_get_settings(_self);

View file

@ -53,10 +53,10 @@ namespace filter {
std::shared_ptr<gs::rendertarget> _filter_rt; std::shared_ptr<gs::rendertarget> _filter_rt;
std::shared_ptr<gs::texture> _filter_texture; std::shared_ptr<gs::texture> _filter_texture;
bool _have_input_texture; bool _have_input_texture;
std::shared_ptr<obs::source> _input; std::shared_ptr<obs::deprecated_source> _input;
std::shared_ptr<gfx::source_texture> _input_capture; std::shared_ptr<gfx::source_texture> _input_capture;
std::shared_ptr<gs::texture> _input_texture; std::shared_ptr<gs::texture> _input_texture;
bool _have_final_texture; bool _have_final_texture;
std::shared_ptr<gs::rendertarget> _final_rt; std::shared_ptr<gs::rendertarget> _final_rt;
@ -83,7 +83,7 @@ namespace filter {
virtual void load(obs_data_t* settings) override; virtual void load(obs_data_t* settings) override;
virtual void save(obs_data_t* settings) override; virtual void save(obs_data_t* settings) override;
void input_renamed(obs::source* src, std::string old_name, std::string new_name); void input_renamed(obs::deprecated_source* src, std::string old_name, std::string new_name);
static bool modified(void* self, obs_properties_t* properties, obs_property_t* property, static bool modified(void* self, obs_properties_t* properties, obs_property_t* property,
obs_data_t* settings) noexcept; obs_data_t* settings) noexcept;

View file

@ -33,7 +33,7 @@ gfx::source_texture::source_texture(obs_source_t* parent)
if (!parent) { if (!parent) {
throw std::invalid_argument("_parent must not be null"); throw std::invalid_argument("_parent must not be null");
} }
_parent = std::make_shared<obs::source>(parent, false, false); _parent = std::make_shared<obs::deprecated_source>(parent, false, false);
_rt = std::make_shared<gs::rendertarget>(GS_RGBA, GS_ZS_NONE); _rt = std::make_shared<gs::rendertarget>(GS_RGBA, GS_ZS_NONE);
} }
@ -45,7 +45,7 @@ gfx::source_texture::source_texture(obs_source_t* _source, obs_source_t* _parent
if (!obs_source_add_active_child(_parent, _source)) { if (!obs_source_add_active_child(_parent, _source)) {
throw std::runtime_error("_parent is contained in _child"); throw std::runtime_error("_parent is contained in _child");
} }
_child = std::make_shared<obs::source>(_source, true, true); _child = std::make_shared<obs::deprecated_source>(_source, true, true);
} }
gfx::source_texture::source_texture(const char* _name, obs_source_t* _parent) : source_texture(_parent) gfx::source_texture::source_texture(const char* _name, obs_source_t* _parent) : source_texture(_parent)
@ -53,7 +53,7 @@ gfx::source_texture::source_texture(const char* _name, obs_source_t* _parent) :
if (!_name) { if (!_name) {
throw std::invalid_argument("name must not be null"); throw std::invalid_argument("name must not be null");
} }
_child = std::make_shared<obs::source>(_name, true, true); _child = std::make_shared<obs::deprecated_source>(_name, true, true);
if (!obs_source_add_active_child(_parent, _child->get())) { if (!obs_source_add_active_child(_parent, _child->get())) {
throw std::runtime_error("_parent is contained in _child"); throw std::runtime_error("_parent is contained in _child");
} }
@ -62,7 +62,8 @@ gfx::source_texture::source_texture(const char* _name, obs_source_t* _parent) :
gfx::source_texture::source_texture(std::string _name, obs_source_t* _parent) : source_texture(_name.c_str(), _parent) gfx::source_texture::source_texture(std::string _name, obs_source_t* _parent) : source_texture(_name.c_str(), _parent)
{} {}
gfx::source_texture::source_texture(std::shared_ptr<obs::source> pchild, std::shared_ptr<obs::source> pparent) gfx::source_texture::source_texture(std::shared_ptr<obs::deprecated_source> pchild,
std::shared_ptr<obs::deprecated_source> pparent)
{ {
if (!pchild) { if (!pchild) {
throw std::invalid_argument("_child must not be null"); throw std::invalid_argument("_child must not be null");
@ -78,8 +79,8 @@ gfx::source_texture::source_texture(std::shared_ptr<obs::source> pchild, std::sh
this->_rt = std::make_shared<gs::rendertarget>(GS_RGBA, GS_ZS_NONE); this->_rt = std::make_shared<gs::rendertarget>(GS_RGBA, GS_ZS_NONE);
} }
gfx::source_texture::source_texture(std::shared_ptr<obs::source> _child, obs_source_t* _parent) gfx::source_texture::source_texture(std::shared_ptr<obs::deprecated_source> _child, obs_source_t* _parent)
: source_texture(_child, std::make_shared<obs::source>(_parent, false, false)) : source_texture(_child, std::make_shared<obs::deprecated_source>(_parent, false, false))
{} {}
obs_source_t* gfx::source_texture::get_object() obs_source_t* gfx::source_texture::get_object()

View file

@ -16,6 +16,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#pragma once #pragma once
#include <map>
#include <memory> #include <memory>
#include <string> #include <string>
#include "obs/gs/gs-rendertarget.hpp" #include "obs/gs/gs-rendertarget.hpp"
@ -34,8 +35,8 @@
namespace gfx { namespace gfx {
class source_texture { class source_texture {
std::shared_ptr<obs::source> _parent; std::shared_ptr<obs::deprecated_source> _parent;
std::shared_ptr<obs::source> _child; std::shared_ptr<obs::deprecated_source> _child;
std::shared_ptr<gs::rendertarget> _rt; std::shared_ptr<gs::rendertarget> _rt;
@ -47,8 +48,8 @@ namespace gfx {
source_texture(const char* name, obs_source_t* parent); source_texture(const char* name, obs_source_t* parent);
source_texture(std::string name, obs_source_t* parent); source_texture(std::string name, obs_source_t* parent);
source_texture(std::shared_ptr<obs::source> child, std::shared_ptr<obs::source> parent); source_texture(std::shared_ptr<obs::deprecated_source> child, std::shared_ptr<obs::deprecated_source> parent);
source_texture(std::shared_ptr<obs::source> child, obs_source_t* parent); source_texture(std::shared_ptr<obs::deprecated_source> child, obs_source_t* parent);
public /*copy*/: public /*copy*/:
source_texture(source_texture const& other) = delete; source_texture(source_texture const& other) = delete;
@ -67,4 +68,38 @@ namespace gfx {
obs_source_t* get_object(); obs_source_t* get_object();
obs_source_t* get_parent(); obs_source_t* get_parent();
}; };
class source_texture_factory {
friend class source_texture;
std::map<std::shared_ptr<obs_weak_source_t>, std::weak_ptr<source_texture>> _cache;
public:
source_texture_factory();
~source_texture_factory();
std::shared_ptr<source_texture> get_source_texture(std::shared_ptr<obs_source_t> source);
protected:
void free_source_texture(std::shared_ptr<obs_source_t> source);
private: // Singleton
static std::shared_ptr<source_texture_factory> factory_instance;
public: // Singleton
static void initialize()
{
factory_instance = std::make_shared<source_texture_factory>();
}
static void finalize()
{
factory_instance.reset();
}
static std::shared_ptr<source_texture_factory> get()
{
return factory_instance;
}
};
} // namespace gfx } // namespace gfx

View file

@ -21,8 +21,9 @@
#include <stdexcept> #include <stdexcept>
#include "plugin.hpp" #include "plugin.hpp"
void obs::source::handle_destroy(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_destroy(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
obs_source_t* source; obs_source_t* source;
if (!calldata_get_ptr(calldata, "source", &source)) { if (!calldata_get_ptr(calldata, "source", &source)) {
@ -43,8 +44,9 @@ void obs::source::handle_destroy(void* p, calldata_t* calldata) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_remove(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_remove(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.remove) { if (!self->events.remove) {
return; return;
} }
@ -55,8 +57,9 @@ void obs::source::handle_remove(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_save(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_save(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.save) { if (!self->events.save) {
return; return;
} }
@ -67,8 +70,9 @@ void obs::source::handle_save(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_load(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_load(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.load) { if (!self->events.load) {
return; return;
} }
@ -79,8 +83,9 @@ void obs::source::handle_load(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_activate(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_activate(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.activate) { if (!self->events.activate) {
return; return;
} }
@ -91,8 +96,9 @@ void obs::source::handle_activate(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_deactivate(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_deactivate(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.deactivate) { if (!self->events.deactivate) {
return; return;
} }
@ -103,8 +109,9 @@ void obs::source::handle_deactivate(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_show(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_show(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.show) { if (!self->events.show) {
return; return;
} }
@ -115,8 +122,9 @@ void obs::source::handle_show(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_hide(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_hide(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.hide) { if (!self->events.hide) {
return; return;
} }
@ -127,8 +135,9 @@ void obs::source::handle_hide(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_enable(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_enable(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.enable) { if (!self->events.enable) {
return; return;
} }
@ -145,8 +154,9 @@ void obs::source::handle_enable(void* p, calldata_t* calldata) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_push_to_mute_changed(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_push_to_mute_changed(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.push_to_mute_changed) { if (!self->events.push_to_mute_changed) {
return; return;
} }
@ -163,8 +173,9 @@ void obs::source::handle_push_to_mute_changed(void* p, calldata_t* calldata) noe
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_push_to_mute_delay(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_push_to_mute_delay(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.push_to_mute_delay) { if (!self->events.push_to_mute_delay) {
return; return;
} }
@ -181,8 +192,9 @@ void obs::source::handle_push_to_mute_delay(void* p, calldata_t* calldata) noexc
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_push_to_talk_changed(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_push_to_talk_changed(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.push_to_talk_changed) { if (!self->events.push_to_talk_changed) {
return; return;
} }
@ -199,8 +211,9 @@ void obs::source::handle_push_to_talk_changed(void* p, calldata_t* calldata) noe
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_push_to_talk_delay(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_push_to_talk_delay(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.push_to_talk_delay) { if (!self->events.push_to_talk_delay) {
return; return;
} }
@ -217,8 +230,9 @@ void obs::source::handle_push_to_talk_delay(void* p, calldata_t* calldata) noexc
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_rename(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_rename(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.enable) { if (!self->events.enable) {
return; return;
} }
@ -240,8 +254,9 @@ void obs::source::handle_rename(void* p, calldata_t* calldata) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_update_properties(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_update_properties(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.update_properties) { if (!self->events.update_properties) {
return; return;
} }
@ -252,8 +267,9 @@ void obs::source::handle_update_properties(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_update_flags(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_update_flags(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.update_flags) { if (!self->events.update_flags) {
return; return;
} }
@ -270,8 +286,9 @@ void obs::source::handle_update_flags(void* p, calldata_t* calldata) noexcept tr
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_mute(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_mute(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.mute) { if (!self->events.mute) {
return; return;
} }
@ -288,8 +305,9 @@ void obs::source::handle_mute(void* p, calldata_t* calldata) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_volume(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_volume(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.volume) { if (!self->events.volume) {
return; return;
} }
@ -308,8 +326,9 @@ void obs::source::handle_volume(void* p, calldata_t* calldata) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_audio_sync(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_audio_sync(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.audio_sync) { if (!self->events.audio_sync) {
return; return;
} }
@ -328,8 +347,9 @@ void obs::source::handle_audio_sync(void* p, calldata_t* calldata) noexcept try
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_audio_mixers(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_audio_mixers(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.audio_mixers) { if (!self->events.audio_mixers) {
return; return;
} }
@ -348,8 +368,9 @@ void obs::source::handle_audio_mixers(void* p, calldata_t* calldata) noexcept tr
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_audio_data(void* p, obs_source_t*, const audio_data* audio, bool muted) noexcept try { void obs::deprecated_source::handle_audio_data(void* p, obs_source_t*, const audio_data* audio, bool muted) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.audio_data) { if (!self->events.audio_data) {
return; return;
} }
@ -361,8 +382,9 @@ void obs::source::handle_audio_data(void* p, obs_source_t*, const audio_data* au
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_filter_add(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_filter_add(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.filter_add) { if (!self->events.filter_add) {
return; return;
} }
@ -379,8 +401,9 @@ void obs::source::handle_filter_add(void* p, calldata_t* calldata) noexcept try
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_filter_remove(void* p, calldata_t* calldata) noexcept try { void obs::deprecated_source::handle_filter_remove(void* p, calldata_t* calldata) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.filter_remove) { if (!self->events.filter_remove) {
return; return;
} }
@ -397,8 +420,9 @@ void obs::source::handle_filter_remove(void* p, calldata_t* calldata) noexcept t
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_reorder_filters(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_reorder_filters(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.reorder_filters) { if (!self->events.reorder_filters) {
return; return;
} }
@ -409,8 +433,9 @@ void obs::source::handle_reorder_filters(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_transition_start(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_transition_start(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.transition_start) { if (!self->events.transition_start) {
return; return;
} }
@ -421,8 +446,9 @@ void obs::source::handle_transition_start(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_transition_video_stop(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_transition_video_stop(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.transition_video_stop) { if (!self->events.transition_video_stop) {
return; return;
} }
@ -433,8 +459,9 @@ void obs::source::handle_transition_video_stop(void* p, calldata_t*) noexcept tr
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
void obs::source::handle_transition_stop(void* p, calldata_t*) noexcept try { void obs::deprecated_source::handle_transition_stop(void* p, calldata_t*) noexcept
obs::source* self = reinterpret_cast<obs::source*>(p); try {
obs::deprecated_source* self = reinterpret_cast<obs::deprecated_source*>(p);
if (!self->events.transition_stop) { if (!self->events.transition_stop) {
return; return;
} }
@ -445,7 +472,7 @@ void obs::source::handle_transition_stop(void* p, calldata_t*) noexcept try {
P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__); P_LOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
} }
obs::source::~source() obs::deprecated_source::~deprecated_source()
{ {
#ifdef auto_signal_d #ifdef auto_signal_d
#undef auto_signal_d #undef auto_signal_d
@ -486,29 +513,29 @@ obs::source::~source()
this->_self = nullptr; this->_self = nullptr;
} }
obs::source::source() obs::deprecated_source::deprecated_source()
{ {
#ifdef auto_signal_c #ifdef auto_signal_c
#undef auto_signal_c #undef auto_signal_c
#endif #endif
#define auto_signal_c(SIGNAL) \ #define auto_signal_c(SIGNAL) \
{ \ { \
this->events.SIGNAL.set_listen_callback([this]() noexcept { \ this->events.SIGNAL.set_listen_callback([this]() noexcept { \
if (!this->_self) \ if (!this->_self) \
return; \ return; \
auto sh = obs_source_get_signal_handler(this->_self); \ auto sh = obs_source_get_signal_handler(this->_self); \
if (sh) { \ if (sh) { \
signal_handler_connect(sh, "" #SIGNAL, obs::source::handle_##SIGNAL, this); \ signal_handler_connect(sh, "" #SIGNAL, obs::deprecated_source::handle_##SIGNAL, this); \
} \ } \
}); \ }); \
this->events.SIGNAL.set_silence_callback([this]() noexcept { \ this->events.SIGNAL.set_silence_callback([this]() noexcept { \
if (!this->_self) \ if (!this->_self) \
return; \ return; \
auto sh = obs_source_get_signal_handler(this->_self); \ auto sh = obs_source_get_signal_handler(this->_self); \
if (sh) { \ if (sh) { \
signal_handler_disconnect(sh, "" #SIGNAL, obs::source::handle_##SIGNAL, this); \ signal_handler_disconnect(sh, "" #SIGNAL, obs::deprecated_source::handle_##SIGNAL, this); \
} \ } \
}); \ }); \
} }
auto_signal_c(destroy) auto_signal_c(remove) auto_signal_c(save) auto_signal_c(load) auto_signal_c(activate) auto_signal_c(destroy) auto_signal_c(remove) auto_signal_c(save) auto_signal_c(load) auto_signal_c(activate)
auto_signal_c(deactivate) auto_signal_c(show) auto_signal_c(hide) auto_signal_c(mute) auto_signal_c(deactivate) auto_signal_c(show) auto_signal_c(hide) auto_signal_c(mute)
@ -526,17 +553,18 @@ obs::source::source()
this->events.audio_data.set_listen_callback([this]() noexcept { this->events.audio_data.set_listen_callback([this]() noexcept {
if (!this->_self) if (!this->_self)
return; return;
obs_source_add_audio_capture_callback(this->_self, obs::source::handle_audio_data, this); obs_source_add_audio_capture_callback(this->_self, obs::deprecated_source::handle_audio_data, this);
}); });
this->events.audio_data.set_silence_callback([this]() noexcept { this->events.audio_data.set_silence_callback([this]() noexcept {
if (!this->_self) if (!this->_self)
return; return;
obs_source_remove_audio_capture_callback(this->_self, obs::source::handle_audio_data, this); obs_source_remove_audio_capture_callback(this->_self, obs::deprecated_source::handle_audio_data, this);
}); });
} }
} }
obs::source::source(std::string name, bool ptrack_ownership, bool add_reference) : ::obs::source::source() obs::deprecated_source::deprecated_source(std::string name, bool ptrack_ownership, bool add_reference)
: ::obs::deprecated_source::deprecated_source()
{ {
this->_self = obs_get_source_by_name(name.c_str()); this->_self = obs_get_source_by_name(name.c_str());
if (!this->_self) { if (!this->_self) {
@ -549,7 +577,8 @@ obs::source::source(std::string name, bool ptrack_ownership, bool add_reference)
} }
} }
obs::source::source(obs_source_t* source, bool ptrack_ownership, bool add_reference) : ::obs::source::source() obs::deprecated_source::deprecated_source(obs_source_t* source, bool ptrack_ownership, bool add_reference)
: ::obs::deprecated_source::deprecated_source()
{ {
this->_self = source; this->_self = source;
if (!this->_self) { if (!this->_self) {
@ -562,7 +591,7 @@ obs::source::source(obs_source_t* source, bool ptrack_ownership, bool add_refere
} }
} }
obs::source::source(source const& other) obs::deprecated_source::deprecated_source(deprecated_source const& other)
{ {
this->_self = other._self; this->_self = other._self;
this->_track_ownership = other._track_ownership; this->_track_ownership = other._track_ownership;
@ -605,7 +634,7 @@ obs::source::source(source const& other)
#undef auto_signal_c #undef auto_signal_c
} }
obs::source& obs::source::operator=(source const& other) obs::deprecated_source& obs::deprecated_source::operator=(deprecated_source const& other)
{ {
if (this == &other) { if (this == &other) {
return *this; return *this;
@ -659,7 +688,8 @@ obs::source& obs::source::operator=(source const& other)
return *this; return *this;
} }
obs::source::source(source&& other) : _self(std::move(other._self)), _track_ownership(std::move(other._track_ownership)) obs::deprecated_source::deprecated_source(deprecated_source&& other)
: _self(std::move(other._self)), _track_ownership(std::move(other._track_ownership))
{ {
// Clean out other source // Clean out other source
other._self = nullptr; other._self = nullptr;
@ -699,7 +729,7 @@ obs::source::source(source&& other) : _self(std::move(other._self)), _track_owne
#undef auto_signal_c #undef auto_signal_c
} }
obs::source& obs::source::operator=(source&& other) obs::deprecated_source& obs::deprecated_source::operator=(deprecated_source&& other)
{ {
if (this != &other) { if (this != &other) {
return *this; return *this;
@ -751,7 +781,7 @@ obs::source& obs::source::operator=(source&& other)
return *this; return *this;
} }
obs_source_type obs::source::type() obs_source_type obs::deprecated_source::type()
{ {
if (!_self) { if (!_self) {
return (obs_source_type)-1; return (obs_source_type)-1;
@ -759,7 +789,7 @@ obs_source_type obs::source::type()
return obs_source_get_type(_self); return obs_source_get_type(_self);
} }
void* obs::source::type_data() void* obs::deprecated_source::type_data()
{ {
if (!_self) { if (!_self) {
return nullptr; return nullptr;
@ -767,7 +797,7 @@ void* obs::source::type_data()
return obs_source_get_type_data(_self); return obs_source_get_type_data(_self);
} }
uint32_t obs::source::width() uint32_t obs::deprecated_source::width()
{ {
if (!_self) { if (!_self) {
return 0; return 0;
@ -775,7 +805,7 @@ uint32_t obs::source::width()
return obs_source_get_width(_self); return obs_source_get_width(_self);
} }
uint32_t obs::source::height() uint32_t obs::deprecated_source::height()
{ {
if (!_self) { if (!_self) {
return 0; return 0;
@ -783,17 +813,17 @@ uint32_t obs::source::height()
return obs_source_get_height(_self); return obs_source_get_height(_self);
} }
bool obs::source::destroyed() bool obs::deprecated_source::destroyed()
{ {
return _self == nullptr; return _self == nullptr;
} }
void obs::source::clear() void obs::deprecated_source::clear()
{ {
_self = nullptr; _self = nullptr;
} }
obs_source_t* obs::source::get() obs_source_t* obs::deprecated_source::get()
{ {
return _self; return _self;
} }

View file

@ -36,7 +36,7 @@
#endif #endif
namespace obs { namespace obs {
class source { class deprecated_source {
obs_source_t* _self; obs_source_t* _self;
bool _track_ownership = false; bool _track_ownership = false;
@ -69,21 +69,21 @@ namespace obs {
static void handle_transition_stop(void* p, calldata_t* calldata) noexcept; static void handle_transition_stop(void* p, calldata_t* calldata) noexcept;
public: public:
virtual ~source(); virtual ~deprecated_source();
source(); deprecated_source();
source(std::string name, bool track_ownership = true, bool add_reference = true); deprecated_source(std::string name, bool track_ownership = true, bool add_reference = true);
source(obs_source_t* source, bool track_ownership = true, bool add_reference = false); deprecated_source(obs_source_t* source, bool track_ownership = true, bool add_reference = false);
public /*copy*/: public /*copy*/:
source(source const& other); deprecated_source(deprecated_source const& other);
source& operator=(source const& other); deprecated_source& operator=(deprecated_source const& other);
public /*move*/: public /*move*/:
source(source&& other); deprecated_source(deprecated_source&& other);
source& operator=(source&& other); deprecated_source& operator=(deprecated_source&& other);
public: public:
obs_source_type type(); obs_source_type type();
@ -103,49 +103,49 @@ namespace obs {
public: // Events public: // Events
struct { struct {
// Destroy and Remove // Destroy and Remove
util::event<obs::source*> destroy; util::event<obs::deprecated_source*> destroy;
util::event<obs::source*> remove; util::event<obs::deprecated_source*> remove;
// Saving, Loading and Update // Saving, Loading and Update
util::event<obs::source*> save; util::event<obs::deprecated_source*> save;
util::event<obs::source*> load; util::event<obs::deprecated_source*> load;
util::event<obs::source*> update_properties; util::event<obs::deprecated_source*> update_properties;
// Activate, Deactivate // Activate, Deactivate
util::event<obs::source*> activate; util::event<obs::deprecated_source*> activate;
util::event<obs::source*> deactivate; util::event<obs::deprecated_source*> deactivate;
// Show Hide // Show Hide
util::event<obs::source*> show; util::event<obs::deprecated_source*> show;
util::event<obs::source*> hide; util::event<obs::deprecated_source*> hide;
// Other // Other
util::event<obs::source*, bool> enable; util::event<obs::deprecated_source*, bool> enable;
util::event<obs::source*, std::string, std::string> rename; util::event<obs::deprecated_source*, std::string, std::string> rename;
util::event<obs::source*, long long> update_flags; util::event<obs::deprecated_source*, long long> update_flags;
// Hotkeys (PtM, PtT) // Hotkeys (PtM, PtT)
util::event<obs::source*, bool> push_to_mute_changed; util::event<obs::deprecated_source*, bool> push_to_mute_changed;
util::event<obs::source*, long long> push_to_mute_delay; util::event<obs::deprecated_source*, long long> push_to_mute_delay;
util::event<obs::source*, bool> push_to_talk_changed; util::event<obs::deprecated_source*, bool> push_to_talk_changed;
util::event<obs::source*, long long> push_to_talk_delay; util::event<obs::deprecated_source*, long long> push_to_talk_delay;
// Audio // Audio
util::event<obs::source*, bool> mute; util::event<obs::deprecated_source*, bool> mute;
util::event<obs::source*, double&> volume; util::event<obs::deprecated_source*, double&> volume;
util::event<obs::source*, long long&> audio_sync; util::event<obs::deprecated_source*, long long&> audio_sync;
util::event<obs::source*, long long&> audio_mixers; util::event<obs::deprecated_source*, long long&> audio_mixers;
util::event<obs::source*, const audio_data*, bool> audio_data; util::event<obs::deprecated_source*, const audio_data*, bool> audio_data;
// Filters // Filters
util::event<obs::source*, obs_source_t*> filter_add; util::event<obs::deprecated_source*, obs_source_t*> filter_add;
util::event<obs::source*, obs_source_t*> filter_remove; util::event<obs::deprecated_source*, obs_source_t*> filter_remove;
util::event<obs::source*> reorder_filters; util::event<obs::deprecated_source*> reorder_filters;
// Transition // Transition
util::event<obs::source*> transition_start; util::event<obs::deprecated_source*> transition_start;
util::event<obs::source*> transition_video_stop; util::event<obs::deprecated_source*> transition_video_stop;
util::event<obs::source*> transition_stop; util::event<obs::deprecated_source*> transition_stop;
} events; } events;
}; };
} // namespace obs } // namespace obs

View file

@ -94,7 +94,7 @@ void source::mirror::mirror_instance::acquire(std::string source_name)
} }
// It seems everything has worked out, so let's update our state. // It seems everything has worked out, so let's update our state.
_source = std::make_shared<obs::source>(source.get(), true, true); _source = std::make_shared<obs::deprecated_source>(source.get(), true, true);
_source_name = obs_source_get_name(source.get()); _source_name = obs_source_get_name(source.get());
_source_item = std::shared_ptr<obs_sceneitem_t>(item, [](obs_sceneitem_t* ref) { obs_sceneitem_remove(ref); }); _source_item = std::shared_ptr<obs_sceneitem_t>(item, [](obs_sceneitem_t* ref) { obs_sceneitem_remove(ref); });
@ -372,12 +372,12 @@ void source::mirror::mirror_instance::enum_all_sources(obs_source_enum_proc_t en
} }
} }
void source::mirror::mirror_instance::on_source_rename(obs::source* source, std::string, std::string) void source::mirror::mirror_instance::on_source_rename(obs::deprecated_source* source, std::string, std::string)
{ {
obs_source_save(_self); obs_source_save(_self);
} }
void source::mirror::mirror_instance::on_audio_data(obs::source*, const audio_data* audio, bool) void source::mirror::mirror_instance::on_audio_data(obs::deprecated_source*, const audio_data* audio, bool)
{ {
if (!this->_audio_enabled) { if (!this->_audio_enabled) {
return; return;

View file

@ -50,8 +50,8 @@ namespace source {
class mirror_instance : public obs::source_instance { class mirror_instance : public obs::source_instance {
// Source // Source
std::shared_ptr<obs::source> _source; std::shared_ptr<obs::deprecated_source> _source;
std::string _source_name; std::string _source_name;
// Cached Data // Cached Data
std::pair<uint32_t, uint32_t> _source_size; std::pair<uint32_t, uint32_t> _source_size;
@ -110,8 +110,8 @@ namespace source {
void audio_output_cb() noexcept; void audio_output_cb() noexcept;
void on_source_rename(obs::source* source, std::string new_name, std::string old_name); void on_source_rename(obs::deprecated_source* source, std::string new_name, std::string old_name);
void on_audio_data(obs::source* source, const audio_data* audio, bool muted); void on_audio_data(obs::deprecated_source* source, const audio_data* audio, bool muted);
}; };
class mirror_factory class mirror_factory