Skip to content

Commit 8d72642

Browse files
Add function to check if configured encoder is valid for service(s)
1 parent d04cb66 commit 8d72642

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed

obs-studio-client/source/nodeobs_settings.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,21 @@ void settings::OBS_settings_saveSettings(const Napi::CallbackInfo &info)
406406
return;
407407
}
408408

409+
Napi::Value settings::OBS_settings_isValidEncoder(const Napi::CallbackInfo &info)
410+
{
411+
std::string category = info[0].ToString().Utf8Value();
412+
auto conn = GetConnection(info);
413+
if (!conn)
414+
return info.Env().Undefined();
415+
416+
std::vector<ipc::value> response = conn->call_synchronous_helper("Settings", "OBS_settings_isValidEncoder", {ipc::value(category)});
417+
418+
if (!ValidateResponse(info, response))
419+
return info.Env().Undefined();
420+
421+
return Napi::Boolean::New(info.Env(), response[1].value_union.ui32);
422+
}
423+
409424
std::vector<std::string> settings::getListCategories(void)
410425
{
411426
std::vector<std::string> categories;
@@ -525,6 +540,7 @@ void settings::Init(Napi::Env env, Napi::Object exports)
525540
{
526541
exports.Set(Napi::String::New(env, "OBS_settings_getSettings"), Napi::Function::New(env, settings::OBS_settings_getSettings));
527542
exports.Set(Napi::String::New(env, "OBS_settings_saveSettings"), Napi::Function::New(env, settings::OBS_settings_saveSettings));
543+
exports.Set(Napi::String::New(env, "OBS_settings_isValidEncoder"), Napi::Function::New(env, settings::OBS_settings_isValidEncoder));
528544
exports.Set(Napi::String::New(env, "OBS_settings_getListCategories"), Napi::Function::New(env, settings::OBS_settings_getListCategories));
529545
exports.Set(Napi::String::New(env, "OBS_settings_getInputAudioDevices"), Napi::Function::New(env, settings::OBS_settings_getInputAudioDevices));
530546
exports.Set(Napi::String::New(env, "OBS_settings_getOutputAudioDevices"), Napi::Function::New(env, settings::OBS_settings_getOutputAudioDevices));

obs-studio-client/source/nodeobs_settings.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ void Init(Napi::Env env, Napi::Object exports);
133133

134134
Napi::Value OBS_settings_getSettings(const Napi::CallbackInfo &info);
135135
void OBS_settings_saveSettings(const Napi::CallbackInfo &info);
136+
Napi::Value OBS_settings_isValidEncoder(const Napi::CallbackInfo &info);
137+
136138
Napi::Value OBS_settings_getListCategories(const Napi::CallbackInfo &info);
137139

138140
Napi::Value OBS_settings_getInputAudioDevices(const Napi::CallbackInfo &info);

obs-studio-server/source/nodeobs_settings.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ void OBS_settings::Register(ipc::server &srv)
7272
cls->register_function(std::make_shared<ipc::function>(
7373
"OBS_settings_saveSettings", std::vector<ipc::type>{ipc::type::String, ipc::type::UInt32, ipc::type::UInt32, ipc::type::Binary},
7474
OBS_settings_saveSettings));
75+
cls->register_function(
76+
std::make_shared<ipc::function>("OBS_settings_isValidEncoder", std::vector<ipc::type>{}, OBS_settings_isValidEncoder));
7577
cls->register_function(
7678
std::make_shared<ipc::function>("OBS_settings_getInputAudioDevices", std::vector<ipc::type>{}, OBS_settings_getInputAudioDevices));
7779
cls->register_function(
@@ -1196,6 +1198,61 @@ static void converOldJimNvencEncoder(config_t *config, const std::string &config
11961198
}
11971199
}
11981200

1201+
static bool validateEncoderForService(StreamServiceId serviceId, const char *encoderToFind)
1202+
{
1203+
bool validEncoder = false;
1204+
1205+
//have encoder - find in encoders_set, validate 'streaming' flag and check availability based on 'check_availability_streaming' flag
1206+
for (int i = 0; i < encoders_set.size(); i++) {
1207+
if (std::string(encoderToFind) == encoders_set[i].simple_name || std::string(encoderToFind) == encoders_set[i].advanced_name) {
1208+
if (encoders_set[i].streaming) {
1209+
if (encoders_set[i].check_availability_streaming) {
1210+
if (isEncoderAvailableForStreaming(encoderToFind, OBS_service::getService(serviceId))) {
1211+
validEncoder = true;
1212+
break;
1213+
}
1214+
} else {
1215+
validEncoder = true;
1216+
}
1217+
}
1218+
break;
1219+
}
1220+
}
1221+
1222+
return validEncoder;
1223+
}
1224+
1225+
void OBS_settings::OBS_settings_isValidEncoder(void *data, const int64_t id, const std::vector<ipc::value> &args, std::vector<ipc::value> &rval)
1226+
{
1227+
const char *mode = NULL;
1228+
const char *curEncoder = NULL;
1229+
bool validEncoder = false;
1230+
std::string serviceToCheck = args[0].value_str;
1231+
1232+
//get mode and configured encoder
1233+
mode = config_get_string(ConfigManager::getInstance().getBasic(), "Output", "Mode");
1234+
if (mode == NULL) {
1235+
mode = "Simple";
1236+
}
1237+
if (strcmp(mode, "Advanced") == 0) {
1238+
curEncoder = config_get_string(ConfigManager::getInstance().getBasic(), "AdvOut", "Encoder");
1239+
} else {
1240+
curEncoder = config_get_string(ConfigManager::getInstance().getBasic(), "SimpleOutput", "StreamingEncoder");
1241+
}
1242+
1243+
if (serviceToCheck == "Both") {
1244+
validEncoder = validateEncoderForService(StreamServiceId::Main, curEncoder) && validateEncoderForService(StreamServiceId::Second, curEncoder);
1245+
} else if (serviceToCheck == "Stream") {
1246+
validEncoder = validateEncoderForService(StreamServiceId::Main, curEncoder);
1247+
} else if (serviceToCheck == "StreamSecond") {
1248+
validEncoder = validateEncoderForService(StreamServiceId::Second, curEncoder);
1249+
}
1250+
1251+
rval.push_back(ipc::value((uint64_t)ErrorCode::Ok));
1252+
rval.push_back(ipc::value(validEncoder));
1253+
}
1254+
1255+
11991256
void OBS_settings::getSimpleOutputSettings(std::vector<SubCategory> *outputSettings, config_t *config, bool isCategoryEnabled)
12001257
{
12011258
converOldJimNvencEncoder(config, "SimpleOutput", "StreamEncoder", "RecEncoder");

obs-studio-server/source/nodeobs_settings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ class OBS_settings {
149149
static void OBS_settings_getSettings(void *data, const int64_t id, const std::vector<ipc::value> &args, std::vector<ipc::value> &rval);
150150
static void OBS_settings_saveSettings(void *data, const int64_t id, const std::vector<ipc::value> &args, std::vector<ipc::value> &rval);
151151

152+
static void OBS_settings_isValidEncoder(void *data, const int64_t id, const std::vector<ipc::value> &args, std::vector<ipc::value> &rval);
153+
152154
static void saveGenericSettings(std::vector<SubCategory> genericSettings, std::string section, config_t *config);
153155

154156
static void OBS_settings_getInputAudioDevices(void *data, const int64_t id, const std::vector<ipc::value> &args, std::vector<ipc::value> &rval);

0 commit comments

Comments
 (0)