mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
Merge branch 'transition-override-begin-event' into 4.3-maintenance
This commit is contained in:
commit
edc0fed9e2
@ -85,7 +85,6 @@ WSEvents::WSEvents(WSServer* srv) {
|
|||||||
this, SLOT(SelectedSceneChanged(QListWidgetItem*, QListWidgetItem*)));
|
this, SLOT(SelectedSceneChanged(QListWidgetItem*, QListWidgetItem*)));
|
||||||
|
|
||||||
currentScene = nullptr;
|
currentScene = nullptr;
|
||||||
currentTransition = nullptr;
|
|
||||||
|
|
||||||
QTimer::singleShot(1000, this, SLOT(deferredInitOperations()));
|
QTimer::singleShot(1000, this, SLOT(deferredInitOperations()));
|
||||||
|
|
||||||
@ -104,7 +103,7 @@ WSEvents::~WSEvents() {
|
|||||||
|
|
||||||
void WSEvents::deferredInitOperations() {
|
void WSEvents::deferredInitOperations() {
|
||||||
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
||||||
connectTransitionSignals(transition);
|
hookTransitionBeginEvent();
|
||||||
|
|
||||||
OBSSourceAutoRelease scene = obs_frontend_get_current_scene();
|
OBSSourceAutoRelease scene = obs_frontend_get_current_scene();
|
||||||
connectSceneSignals(scene);
|
connectSceneSignals(scene);
|
||||||
@ -132,6 +131,7 @@ void WSEvents::FrontendEventHandler(enum obs_frontend_event event, void* private
|
|||||||
owner->OnTransitionChange();
|
owner->OnTransitionChange();
|
||||||
}
|
}
|
||||||
else if (event == OBS_FRONTEND_EVENT_TRANSITION_LIST_CHANGED) {
|
else if (event == OBS_FRONTEND_EVENT_TRANSITION_LIST_CHANGED) {
|
||||||
|
owner->hookTransitionBeginEvent();
|
||||||
owner->OnTransitionListChange();
|
owner->OnTransitionListChange();
|
||||||
}
|
}
|
||||||
else if (event == OBS_FRONTEND_EVENT_PROFILE_CHANGED) {
|
else if (event == OBS_FRONTEND_EVENT_PROFILE_CHANGED) {
|
||||||
@ -188,7 +188,6 @@ void WSEvents::FrontendEventHandler(enum obs_frontend_event event, void* private
|
|||||||
}
|
}
|
||||||
else if (event == OBS_FRONTEND_EVENT_EXIT) {
|
else if (event == OBS_FRONTEND_EVENT_EXIT) {
|
||||||
owner->connectSceneSignals(nullptr);
|
owner->connectSceneSignals(nullptr);
|
||||||
owner->connectTransitionSignals(nullptr);
|
|
||||||
owner->OnExit();
|
owner->OnExit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,29 +221,18 @@ void WSEvents::broadcastUpdate(const char* updateType,
|
|||||||
blog(LOG_DEBUG, "Update << '%s'", json.toUtf8().constData());
|
blog(LOG_DEBUG, "Update << '%s'", json.toUtf8().constData());
|
||||||
}
|
}
|
||||||
|
|
||||||
void WSEvents::connectTransitionSignals(obs_source_t* transition) {
|
void WSEvents::hookTransitionBeginEvent() {
|
||||||
signal_handler_t* sh = nullptr;
|
obs_frontend_source_list transitions = {};
|
||||||
|
obs_frontend_get_transitions(&transitions);
|
||||||
|
|
||||||
if (currentTransition) {
|
for (int i = 0; i < transitions.sources.num; i++) {
|
||||||
sh = obs_source_get_signal_handler(currentTransition);
|
obs_source_t* transition = transitions.sources.array[i];
|
||||||
signal_handler_disconnect(sh,
|
signal_handler_t* sh = obs_source_get_signal_handler(transition);
|
||||||
"transition_start", OnTransitionBegin, this);
|
signal_handler_disconnect(sh, "transition_start", OnTransitionBegin, this);
|
||||||
}
|
signal_handler_connect(sh, "transition_start", OnTransitionBegin, this);
|
||||||
|
}
|
||||||
|
|
||||||
currentTransition = transition;
|
obs_frontend_source_list_free(&transitions);
|
||||||
|
|
||||||
if (currentTransition) {
|
|
||||||
if (!transitionIsCut(transition)) {
|
|
||||||
currentTransition = transition;
|
|
||||||
|
|
||||||
sh = obs_source_get_signal_handler(currentTransition);
|
|
||||||
signal_handler_connect(sh,
|
|
||||||
"transition_start", OnTransitionBegin, this);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
currentTransition = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WSEvents::connectSceneSignals(obs_source_t* scene) {
|
void WSEvents::connectSceneSignals(obs_source_t* scene) {
|
||||||
@ -356,7 +344,6 @@ void WSEvents::OnSceneCollectionChange() {
|
|||||||
broadcastUpdate("SceneCollectionChanged");
|
broadcastUpdate("SceneCollectionChanged");
|
||||||
|
|
||||||
currentScene = nullptr;
|
currentScene = nullptr;
|
||||||
currentTransition = nullptr;
|
|
||||||
|
|
||||||
OnTransitionListChange();
|
OnTransitionListChange();
|
||||||
OnTransitionChange();
|
OnTransitionChange();
|
||||||
@ -389,7 +376,6 @@ void WSEvents::OnSceneCollectionListChange() {
|
|||||||
*/
|
*/
|
||||||
void WSEvents::OnTransitionChange() {
|
void WSEvents::OnTransitionChange() {
|
||||||
OBSSourceAutoRelease currentTransition = obs_frontend_get_current_transition();
|
OBSSourceAutoRelease currentTransition = obs_frontend_get_current_transition();
|
||||||
connectTransitionSignals(currentTransition);
|
|
||||||
|
|
||||||
OBSDataAutoRelease data = obs_data_create();
|
OBSDataAutoRelease data = obs_data_create();
|
||||||
obs_data_set_string(data, "transition-name",
|
obs_data_set_string(data, "transition-name",
|
||||||
@ -762,14 +748,31 @@ void WSEvents::TransitionDurationChanged(int ms) {
|
|||||||
* @since 4.0.0
|
* @since 4.0.0
|
||||||
*/
|
*/
|
||||||
void WSEvents::OnTransitionBegin(void* param, calldata_t* data) {
|
void WSEvents::OnTransitionBegin(void* param, calldata_t* data) {
|
||||||
UNUSED_PARAMETER(data);
|
|
||||||
WSEvents* instance = static_cast<WSEvents*>(param);
|
WSEvents* instance = static_cast<WSEvents*>(param);
|
||||||
|
|
||||||
OBSSourceAutoRelease currentTransition = obs_frontend_get_current_transition();
|
OBSSource transition = (obs_source_t*)calldata_get_ptr(data, "source");
|
||||||
|
if (!transition) return;
|
||||||
|
|
||||||
|
// Detect if transition is the global transition or a transition override.
|
||||||
|
// Fetching the duration is different depending on the case.
|
||||||
|
OBSSourceAutoRelease destination = obs_transition_get_active_source(transition);
|
||||||
|
OBSDataAutoRelease destinationSettings = obs_source_get_private_settings(destination);
|
||||||
|
int duration = -1;
|
||||||
|
if (obs_data_has_default_value(destinationSettings, "transition_duration") ||
|
||||||
|
obs_data_has_user_value(destinationSettings, "transition_duration"))
|
||||||
|
{
|
||||||
|
duration = obs_data_get_int(destinationSettings, "transition_duration");
|
||||||
|
} else {
|
||||||
|
duration = Utils::GetTransitionDuration();
|
||||||
|
}
|
||||||
|
|
||||||
OBSDataAutoRelease fields = obs_data_create();
|
OBSDataAutoRelease fields = obs_data_create();
|
||||||
obs_data_set_string(fields, "name", obs_source_get_name(currentTransition));
|
obs_data_set_string(fields, "name", obs_source_get_name(transition));
|
||||||
obs_data_set_int(fields, "duration", Utils::GetTransitionDuration());
|
if (duration >= 0) {
|
||||||
|
obs_data_set_int(fields, "duration", duration);
|
||||||
|
} else {
|
||||||
|
blog(LOG_WARNING, "OnTransitionBegin: duration is negative !");
|
||||||
|
}
|
||||||
|
|
||||||
instance->broadcastUpdate("TransitionBegin", fields);
|
instance->broadcastUpdate("TransitionBegin", fields);
|
||||||
}
|
}
|
||||||
|
@ -33,9 +33,10 @@ class WSEvents : public QObject {
|
|||||||
static void FrontendEventHandler(
|
static void FrontendEventHandler(
|
||||||
enum obs_frontend_event event, void* privateData);
|
enum obs_frontend_event event, void* privateData);
|
||||||
static WSEvents* Instance;
|
static WSEvents* Instance;
|
||||||
void connectTransitionSignals(obs_source_t* transition);
|
|
||||||
void connectSceneSignals(obs_source_t* scene);
|
void connectSceneSignals(obs_source_t* scene);
|
||||||
|
|
||||||
|
void hookTransitionBeginEvent();
|
||||||
|
|
||||||
uint64_t GetStreamingTime();
|
uint64_t GetStreamingTime();
|
||||||
const char* GetStreamingTimecode();
|
const char* GetStreamingTimecode();
|
||||||
uint64_t GetRecordingTime();
|
uint64_t GetRecordingTime();
|
||||||
@ -54,7 +55,6 @@ class WSEvents : public QObject {
|
|||||||
private:
|
private:
|
||||||
WSServer* _srv;
|
WSServer* _srv;
|
||||||
OBSSource currentScene;
|
OBSSource currentScene;
|
||||||
OBSSource currentTransition;
|
|
||||||
|
|
||||||
bool pulse;
|
bool pulse;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user