mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
requests: add GetSourceTypesList
This commit is contained in:
@ -82,6 +82,7 @@ QHash<QString, void(*)(WSRequestHandler*)> WSRequestHandler::messageMap {
|
|||||||
{ "GetSyncOffset", WSRequestHandler::HandleGetSyncOffset },
|
{ "GetSyncOffset", WSRequestHandler::HandleGetSyncOffset },
|
||||||
{ "GetSpecialSources", WSRequestHandler::HandleGetSpecialSources },
|
{ "GetSpecialSources", WSRequestHandler::HandleGetSpecialSources },
|
||||||
{ "GetSourcesList", WSRequestHandler::HandleGetSourcesList },
|
{ "GetSourcesList", WSRequestHandler::HandleGetSourcesList },
|
||||||
|
{ "GetSourceTypesList", WSRequestHandler::HandleGetSourceTypesList },
|
||||||
{ "GetSourceSettings", WSRequestHandler::HandleGetSourceSettings },
|
{ "GetSourceSettings", WSRequestHandler::HandleGetSourceSettings },
|
||||||
{ "SetSourceSettings", WSRequestHandler::HandleSetSourceSettings },
|
{ "SetSourceSettings", WSRequestHandler::HandleSetSourceSettings },
|
||||||
|
|
||||||
@ -548,6 +549,8 @@ void WSRequestHandler::HandleStartStreaming(WSRequestHandler* req) {
|
|||||||
OBSService configuredService = obs_frontend_get_streaming_service();
|
OBSService configuredService = obs_frontend_get_streaming_service();
|
||||||
OBSService newService = nullptr;
|
OBSService newService = nullptr;
|
||||||
|
|
||||||
|
// TODO: fix service memory leak
|
||||||
|
|
||||||
if (req->hasField("stream")) {
|
if (req->hasField("stream")) {
|
||||||
OBSDataAutoRelease streamData = obs_data_get_obj(req->data, "stream");
|
OBSDataAutoRelease streamData = obs_data_get_obj(req->data, "stream");
|
||||||
OBSDataAutoRelease newSettings = obs_data_get_obj(streamData, "settings");
|
OBSDataAutoRelease newSettings = obs_data_get_obj(streamData, "settings");
|
||||||
@ -2579,8 +2582,9 @@ void WSRequestHandler::HandleResetSceneItem(WSRequestHandler* req) {
|
|||||||
* List all sources available in the running OBS instance
|
* List all sources available in the running OBS instance
|
||||||
*
|
*
|
||||||
* @return {Array of Objects} `sources` Array of sources as objects
|
* @return {Array of Objects} `sources` Array of sources as objects
|
||||||
* @return {String} `sources.*.name` Source name
|
* @return {String} `sources.*.name` Unique source name
|
||||||
* @return {String} `sources.*.type` Source type
|
* @return {String} `sources.*.typeId` Non-unique source internal type (a.k.a type id)
|
||||||
|
* @return {String} `sources.*.type` Source type. Value is one of the following: "input", "filter", "transition", "scene" or "unknown"
|
||||||
*
|
*
|
||||||
* @api requests
|
* @api requests
|
||||||
* @name GetSourcesList
|
* @name GetSourcesList
|
||||||
@ -2593,11 +2597,34 @@ void WSRequestHandler::HandleGetSourcesList(WSRequestHandler* req) {
|
|||||||
auto sourceEnumProc = [](void* privateData, obs_source_t* source) -> bool {
|
auto sourceEnumProc = [](void* privateData, obs_source_t* source) -> bool {
|
||||||
obs_data_array_t* sourcesArray = (obs_data_array_t*)privateData;
|
obs_data_array_t* sourcesArray = (obs_data_array_t*)privateData;
|
||||||
|
|
||||||
OBSDataAutoRelease sourceSettings = obs_source_get_settings(source);
|
|
||||||
|
|
||||||
OBSDataAutoRelease sourceData = obs_data_create();
|
OBSDataAutoRelease sourceData = obs_data_create();
|
||||||
obs_data_set_string(sourceData, "name", obs_source_get_name(source));
|
obs_data_set_string(sourceData, "name", obs_source_get_name(source));
|
||||||
obs_data_set_string(sourceData, "type", obs_source_get_id(source));
|
obs_data_set_string(sourceData, "typeId", obs_source_get_id(source));
|
||||||
|
|
||||||
|
QString typeString = "";
|
||||||
|
enum obs_source_type sourceType = obs_source_get_type(source);
|
||||||
|
switch (sourceType) {
|
||||||
|
case OBS_SOURCE_TYPE_INPUT:
|
||||||
|
typeString = "input";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OBS_SOURCE_TYPE_FILTER:
|
||||||
|
typeString = "filter";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OBS_SOURCE_TYPE_TRANSITION:
|
||||||
|
typeString = "transition";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OBS_SOURCE_TYPE_SCENE:
|
||||||
|
typeString = "scene";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
typeString = "unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
obs_data_set_string(sourceData, "type", typeString.toUtf8());
|
||||||
|
|
||||||
obs_data_array_push_back(sourcesArray, sourceData);
|
obs_data_array_push_back(sourcesArray, sourceData);
|
||||||
return true;
|
return true;
|
||||||
@ -2609,6 +2636,83 @@ void WSRequestHandler::HandleGetSourcesList(WSRequestHandler* req) {
|
|||||||
req->SendOKResponse(response);
|
req->SendOKResponse(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of all available sources types
|
||||||
|
*
|
||||||
|
* @return {Array of Objects} `ids` Array of sources as objects
|
||||||
|
* @return {String} `ids.*.typeId` Non-unique internal source type ID
|
||||||
|
* @return {String} `ids.*.displayName` Display name of the source type
|
||||||
|
* @return {String} `ids.*.type` Type. Value is one of the following: "input", "filter", "transition" or "other"
|
||||||
|
* @return {Object} `ids.*.defaultSettings` Default settings of this source type
|
||||||
|
* @return {Object} `ids.*.caps` Source type capabilities
|
||||||
|
* @return {Boolean} `ids.*.caps.isAsync` True if source of this type provide frames asynchronously
|
||||||
|
* @return {Boolean} `ids.*.caps.hasVideo` True if sources of this type provide video
|
||||||
|
* @return {Boolean} `ids.*.caps.hasAudio` True if sources of this type provide audio
|
||||||
|
* @return {Boolean} `ids.*.caps.canInteract` True if interaction with this sources of this type is possible
|
||||||
|
* @return {Boolean} `ids.*.caps.isComposite` True if sources of this type composite one or more sub-sources
|
||||||
|
* @return {Boolean} `ids.*.caps.doNotDuplicate` True if sources of this type should not be fully duplicated
|
||||||
|
* @return {Boolean} `ids.*.caps.doNotSelfMonitor` True if sources of this type may cause a feedback loop if it's audio is monitored and shouldn't be
|
||||||
|
*
|
||||||
|
* @api requests
|
||||||
|
* @name GetSourcesList
|
||||||
|
* @category sources
|
||||||
|
* @since unreleased
|
||||||
|
*/
|
||||||
|
void WSRequestHandler::HandleGetSourceTypesList(WSRequestHandler* req) {
|
||||||
|
OBSDataArrayAutoRelease idsArray = obs_data_array_create();
|
||||||
|
|
||||||
|
const char* id;
|
||||||
|
size_t idx = 0;
|
||||||
|
|
||||||
|
QHash<QString, QString> idTypes;
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
|
while (obs_enum_input_types(idx++, &id)) {
|
||||||
|
idTypes.insert(id, "input");
|
||||||
|
}
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
|
while (obs_enum_filter_types(idx++, &id)) {
|
||||||
|
idTypes.insert(id, "filter");
|
||||||
|
}
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
|
while (obs_enum_transition_types(idx++, &id)) {
|
||||||
|
idTypes.insert(id, "transition");
|
||||||
|
}
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
|
while (obs_enum_source_types(idx++, &id)) {
|
||||||
|
OBSDataAutoRelease item = obs_data_create();
|
||||||
|
|
||||||
|
obs_data_set_string(item, "typeId", id);
|
||||||
|
obs_data_set_string(item, "displayName", obs_source_get_display_name(id));
|
||||||
|
obs_data_set_string(item, "type", idTypes.value(id, "other").toUtf8());
|
||||||
|
|
||||||
|
uint32_t caps = obs_get_source_output_flags(id);
|
||||||
|
OBSDataAutoRelease capsData = obs_data_create();
|
||||||
|
obs_data_set_bool(capsData, "isAsync", caps & OBS_SOURCE_ASYNC);
|
||||||
|
obs_data_set_bool(capsData, "hasVideo", caps & OBS_SOURCE_VIDEO);
|
||||||
|
obs_data_set_bool(capsData, "hasAudio", caps & OBS_SOURCE_AUDIO);
|
||||||
|
obs_data_set_bool(capsData, "canInteract", caps & OBS_SOURCE_INTERACTION);
|
||||||
|
obs_data_set_bool(capsData, "isComposite", caps & OBS_SOURCE_COMPOSITE);
|
||||||
|
obs_data_set_bool(capsData, "doNotDuplicate", caps & OBS_SOURCE_DO_NOT_DUPLICATE);
|
||||||
|
obs_data_set_bool(capsData, "doNotSelfMonitor", caps & OBS_SOURCE_DO_NOT_SELF_MONITOR);
|
||||||
|
obs_data_set_bool(capsData, "isDeprecated", caps & OBS_SOURCE_DEPRECATED);
|
||||||
|
|
||||||
|
obs_data_set_obj(item, "caps", capsData);
|
||||||
|
|
||||||
|
OBSDataAutoRelease defaultSettings = obs_get_source_defaults(id);
|
||||||
|
obs_data_set_obj(item, "defaultSettings", defaultSettings);
|
||||||
|
|
||||||
|
obs_data_array_push_back(idsArray, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
OBSDataAutoRelease response = obs_data_create();
|
||||||
|
obs_data_set_array(response, "types", idsArray);
|
||||||
|
req->SendOKResponse(response);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get settings of the specified source
|
* Get settings of the specified source
|
||||||
*
|
*
|
||||||
|
@ -99,6 +99,7 @@ class WSRequestHandler : public QObject {
|
|||||||
static void HandleGetSyncOffset(WSRequestHandler* req);
|
static void HandleGetSyncOffset(WSRequestHandler* req);
|
||||||
static void HandleGetSpecialSources(WSRequestHandler* req);
|
static void HandleGetSpecialSources(WSRequestHandler* req);
|
||||||
static void HandleGetSourcesList(WSRequestHandler* req);
|
static void HandleGetSourcesList(WSRequestHandler* req);
|
||||||
|
static void HandleGetSourceTypesList(WSRequestHandler* req);
|
||||||
static void HandleGetSourceSettings(WSRequestHandler* req);
|
static void HandleGetSourceSettings(WSRequestHandler* req);
|
||||||
static void HandleSetSourceSettings(WSRequestHandler* req);
|
static void HandleSetSourceSettings(WSRequestHandler* req);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user