diff --git a/PROTOCOL.md b/PROTOCOL.md
index c40e6bb8..e39a3b8a 100644
--- a/PROTOCOL.md
+++ b/PROTOCOL.md
@@ -43,6 +43,7 @@ The protocol in general is based on the OBS Remote protocol created by Bill Hami
- ["GetTransitionList"](#gettransitionlist)
- ["GetCurrentTransition"](#getcurrenttransition)
- ["SetCurrentTransition"](#setcurrenttransition)
+ - ["SetTransitionDuration"](#settransitionduration)
- ["SetVolume"](#setvolume)
- ["GetVolume"](#getvolume)
- ["SetMute"](#setmute)
@@ -328,6 +329,7 @@ Get the name of the currently selected transition in the frontend's dropdown men
__Request fields__ : none
__Response__ : always OK, with these additional fields :
- **"name"** (string) : name of the selected transition
+- **"duration"** (integer, only if transition supports this) : transition duration
*New in OBS Studio*
@@ -343,6 +345,18 @@ __Response__ : OK if specified transition exists, error otherwise.
---
+#### "SetTransitionDuration"
+Set the duration of the currently selected transition.
+
+__Request fields__ :
+- **"duration"** (integer) : desired transition duration in milliseconds
+
+__Response__ : always OK.
+
+*New in OBS Studio*
+
+---
+
#### "SetVolume"
Set the volume of a specific source.
diff --git a/Utils.cpp b/Utils.cpp
index 26272e08..b1093ebd 100644
--- a/Utils.cpp
+++ b/Utils.cpp
@@ -18,6 +18,8 @@ with this program. If not, see
#include "Utils.h"
#include
+#include
+#include
#include "obs-websocket.h"
obs_data_array_t* string_list_to_array(char** strings, char* key)
@@ -207,6 +209,32 @@ obs_data_array_t* Utils::GetProfiles()
return list;
}
+int Utils::GetTransitionDuration()
+{
+ QMainWindow *window = (QMainWindow*)obs_frontend_get_main_window();
+ QSpinBox* durationControl = window->findChild("transitionDuration");
+
+ if (durationControl)
+ {
+ return durationControl->value();
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+void Utils::SetTransitionDuration(int ms)
+{
+ QMainWindow *window = (QMainWindow*)obs_frontend_get_main_window();
+ QSpinBox* durationControl = window->findChild("transitionDuration");
+
+ if (durationControl && ms >= 0)
+ {
+ durationControl->setValue(ms);
+ }
+}
+
const char* Utils::OBSVersionString() {
uint32_t version = obs_get_version();
diff --git a/Utils.h b/Utils.h
index dcaa7033..6e950661 100644
--- a/Utils.h
+++ b/Utils.h
@@ -37,6 +37,9 @@ class Utils
static obs_data_array_t* GetSceneCollections();
static obs_data_array_t* GetProfiles();
+ static int GetTransitionDuration();
+ static void SetTransitionDuration(int ms);
+
static const char* OBSVersionString();
};
diff --git a/WSRequestHandler.cpp b/WSRequestHandler.cpp
index 76787087..365b42b2 100644
--- a/WSRequestHandler.cpp
+++ b/WSRequestHandler.cpp
@@ -49,6 +49,7 @@ WSRequestHandler::WSRequestHandler(QWebSocket *client) :
messageMap["GetTransitionList"] = WSRequestHandler::HandleGetTransitionList;
messageMap["GetCurrentTransition"] = WSRequestHandler::HandleGetCurrentTransition;
messageMap["SetCurrentTransition"] = WSRequestHandler::HandleSetCurrentTransition;
+ messageMap["SetTransitionDuration"] = WSRequestHandler::HandleSetTransitionDuration;
messageMap["SetVolume"] = WSRequestHandler::HandleSetVolume;
messageMap["GetVolume"] = WSRequestHandler::HandleGetVolume;
@@ -359,6 +360,11 @@ void WSRequestHandler::HandleGetCurrentTransition(WSRequestHandler *owner)
obs_data_t *response = obs_data_create();
obs_data_set_string(response, "name", obs_source_get_name(current_transition));
+
+ if (!obs_transition_fixed(current_transition))
+ {
+ obs_data_set_int(response, "duration", Utils::GetTransitionDuration());
+ }
owner->SendOKResponse(response);
@@ -384,6 +390,13 @@ void WSRequestHandler::HandleSetCurrentTransition(WSRequestHandler *owner)
}
}
+void WSRequestHandler::HandleSetTransitionDuration(WSRequestHandler *owner)
+{
+ int ms = obs_data_get_int(owner->_requestData, "duration");
+ Utils::SetTransitionDuration(ms);
+ owner->SendOKResponse();
+}
+
void WSRequestHandler::HandleSetVolume(WSRequestHandler *owner)
{
const char *item_name = obs_data_get_string(owner->_requestData, "source");
diff --git a/WSRequestHandler.h b/WSRequestHandler.h
index fa91002c..26bf8dac 100644
--- a/WSRequestHandler.h
+++ b/WSRequestHandler.h
@@ -78,6 +78,8 @@ class WSRequestHandler : public QObject
static void HandleSetCurrentProfile(WSRequestHandler *owner);
static void HandleGetCurrentProfile(WSRequestHandler *owner);
static void HandleListProfiles(WSRequestHandler *owner);
+
+ static void HandleSetTransitionDuration(WSRequestHandler *owner);
};
#endif // WSPROTOCOL_H