Skip to content

Commit ddbd067

Browse files
Merge branch 'staging' into enhanced-broadcasting-new-api
2 parents 0aa9291 + 62bd792 commit ddbd067

File tree

12 files changed

+106
-22
lines changed

12 files changed

+106
-22
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ env:
2424
SLGenerator: Visual Studio 17 2022
2525
SLDistributeDirectory: distribute
2626
SLFullDistributePath: "streamlabs-build.app/distribute" # The .app extension is required to run macOS tests correctly.
27-
LibOBSVersion: 30.2.4sl51
27+
LibOBSVersion: 30.2.4sl59
2828
PACKAGE_NAME: osn
2929

3030
jobs:

js/module.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,11 @@ function getSourcesSize(sourcesNames) {
123123
return sourcesSize;
124124
}
125125
exports.getSourcesSize = getSourcesSize;
126-
const __dirnameApple = hasDeveloperApp
126+
const appleBinaryFolder = hasDeveloperApp
127127
? path.join(__dirname, 'OSN.app', 'distribute', 'obs-studio-node', 'bin')
128128
: path.join(__dirname, 'bin');
129-
if (fs.existsSync(path.resolve(__dirnameApple).replace('app.asar', 'app.asar.unpacked'))) {
130-
obs.IPC.setServerPath(path.resolve(__dirnameApple, `obs64`).replace('app.asar', 'app.asar.unpacked'), path.resolve(__dirnameApple).replace('app.asar', 'app.asar.unpacked'));
129+
if (fs.existsSync(path.resolve(appleBinaryFolder, 'obs64').replace('app.asar', 'app.asar.unpacked'))) {
130+
obs.IPC.setServerPath(path.resolve(appleBinaryFolder, `obs64`).replace('app.asar', 'app.asar.unpacked'), path.resolve(appleBinaryFolder).replace('app.asar', 'app.asar.unpacked'));
131131
}
132132
else if (fs.existsSync(path.resolve(__dirname, `obs64.exe`).replace('app.asar', 'app.asar.unpacked'))) {
133133
obs.IPC.setServerPath(path.resolve(__dirname, `obs64.exe`).replace('app.asar', 'app.asar.unpacked'), path.resolve(__dirname).replace('app.asar', 'app.asar.unpacked'));

js/module.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,11 +1926,11 @@ export const enum VCamOutputType {
19261926
};
19271927

19281928
// Initialization and other stuff which needs local data.
1929-
const __dirnameApple = hasDeveloperApp
1929+
const appleBinaryFolder = hasDeveloperApp
19301930
? path.join(__dirname, 'OSN.app', 'distribute', 'obs-studio-node', 'bin')
19311931
: path.join(__dirname, 'bin');
1932-
if (fs.existsSync(path.resolve(__dirnameApple).replace('app.asar', 'app.asar.unpacked'))) {
1933-
obs.IPC.setServerPath(path.resolve(__dirnameApple, `obs64`).replace('app.asar', 'app.asar.unpacked'), path.resolve(__dirnameApple).replace('app.asar', 'app.asar.unpacked'));
1932+
if (fs.existsSync(path.resolve(appleBinaryFolder, 'obs64').replace('app.asar', 'app.asar.unpacked'))) {
1933+
obs.IPC.setServerPath(path.resolve(appleBinaryFolder, `obs64`).replace('app.asar', 'app.asar.unpacked'), path.resolve(appleBinaryFolder).replace('app.asar', 'app.asar.unpacked'));
19341934
}
19351935
else if (fs.existsSync(path.resolve(__dirname, `obs64.exe`).replace('app.asar', 'app.asar.unpacked'))) {
19361936
obs.IPC.setServerPath(path.resolve(__dirname, `obs64.exe`).replace('app.asar', 'app.asar.unpacked'), path.resolve(__dirname).replace('app.asar', 'app.asar.unpacked'));

obs-studio-client/source/controller.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,9 @@ Napi::Value js_connect(const Napi::CallbackInfo &info)
449449
if (exit_code == STATUS_DLL_NOT_FOUND)
450450
exit_code = ProcessInfo::MISSING_DEPENDENCY;
451451
#endif
452-
452+
if (exit_code == 0 && cl == nullptr) {
453+
exit_code = ProcessInfo::OTHER_ERROR; // Null ipc client which can be caused due to missing obs64
454+
}
453455
return Napi::Number::New(info.Env(), exit_code);
454456
}
455457

@@ -475,6 +477,9 @@ Napi::Value js_host(const Napi::CallbackInfo &info)
475477
exit_code = ProcessInfo::MISSING_DEPENDENCY;
476478
#endif
477479

480+
if (exit_code == 0 && cl == nullptr) {
481+
exit_code = ProcessInfo::OTHER_ERROR; // Null ipc client which can be caused due to missing obs64
482+
}
478483
return Napi::Number::New(info.Env(), exit_code);
479484
}
480485

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-client/source/utility.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ static FORCE_INLINE std::shared_ptr<ipc::client> GetConnection(const Napi::Callb
122122
{
123123
auto conn = Controller::GetInstance().GetConnection();
124124
if (!conn) {
125-
Napi::Error::New(info.Env(), "Failed to obtain IPC connection.").ThrowAsJavaScriptException();
125+
std::cerr << "Failed to obtain IPC connection." << std::endl;
126126
exit(1);
127127
}
128128
return conn;

obs-studio-server/source/nodeobs_service.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1550,7 +1550,7 @@ const char *get_simple_output_encoder(const char *encoder)
15501550
return ADVANCED_ENCODER_AMD_HEVC;
15511551
} else if (strcmp(encoder, SIMPLE_ENCODER_AMD_AV1) == 0) {
15521552
return "av1_texture_amf";
1553-
} else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) {
1553+
} else if ((strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) || (strcmp(encoder, ENCODER_NVENC_H264_TEX) == 0)) {
15541554
return EncoderAvailable(ENCODER_NVENC_H264_TEX) ? ENCODER_NVENC_H264_TEX : ADVANCED_ENCODER_NVENC;
15551555
} else if (strcmp(encoder, SIMPLE_ENCODER_NVENC_HEVC) == 0) {
15561556
return EncoderAvailable(ENCODER_NVENC_HEVC_TEX) ? ENCODER_NVENC_HEVC_TEX : "ffmpeg_hevc_nvenc";
@@ -2767,6 +2767,8 @@ void OBS_service::OBS_service_connectOutputSignals(void *data, const int64_t id,
27672767
replayBufferSignals.push_back(SignalInfo("replay-buffer", "wrote"));
27682768
replayBufferSignals.push_back(SignalInfo("replay-buffer", "writing_error"));
27692769

2770+
virtualCamSignals.push_back(SignalInfo("virtual-camera", "activate"));
2771+
virtualCamSignals.push_back(SignalInfo("virtual-camera", "deactivate"));
27702772
virtualCamSignals.push_back(SignalInfo("virtual-camera", "start"));
27712773
virtualCamSignals.push_back(SignalInfo("virtual-camera", "stop"));
27722774

obs-studio-server/source/nodeobs_settings.cpp

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ 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(std::make_shared<ipc::function>("OBS_settings_isValidEncoder", std::vector<ipc::type>{}, OBS_settings_isValidEncoder));
7576
cls->register_function(
7677
std::make_shared<ipc::function>("OBS_settings_getInputAudioDevices", std::vector<ipc::type>{}, OBS_settings_getInputAudioDevices));
7778
cls->register_function(
@@ -1196,6 +1197,60 @@ static void converOldJimNvencEncoder(config_t *config, const std::string &config
11961197
}
11971198
}
11981199

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

@@ -1942,8 +1996,7 @@ SubCategory OBS_settings::getAdvancedOutputStreamingSettings(config_t *config, b
19421996

19431997
rescaleRes.sizeOfValues = rescaleRes.values.size();
19441998
rescaleRes.countValues = outputResolutions.size();
1945-
1946-
rescaleRes.visible = (encoderCurrentValue == ENCODER_NVENC_H264_TEX);
1999+
rescaleRes.visible = (encoderCurrentValue != ENCODER_NVENC_H264_TEX);
19472000
rescaleRes.enabled = isCategoryEnabled;
19482001
rescaleRes.masked = false;
19492002

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)