Skip to content

Commit 22f492f

Browse files
committed
Add function to signal the browser source from JavaScript
1 parent bdabf83 commit 22f492f

File tree

5 files changed

+49
-9
lines changed

5 files changed

+49
-9
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,14 @@ Permissions required: ALL
315315
window.obsstudio.stopVirtualcam()
316316
```
317317

318+
#### Signal the browser source
319+
Permissions required: BASIC
320+
```js
321+
/**
322+
* @param {string} signal - signal name
323+
*/
324+
window.obsstudio.signal(signal)
325+
```
318326

319327
### Register for visibility callbacks
320328

browser-app.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,26 @@ void BrowserApp::OnBeforeCommandLineProcessing(const CefString &, CefRefPtr<CefC
9999
#endif
100100
}
101101

102-
std::vector<std::string> exposedFunctions = {"getControlLevel", "getCurrentScene", "getStatus",
103-
"startRecording", "stopRecording", "startStreaming",
104-
"stopStreaming", "pauseRecording", "unpauseRecording",
105-
"startReplayBuffer", "stopReplayBuffer", "saveReplayBuffer",
106-
"startVirtualcam", "stopVirtualcam", "getScenes",
107-
"setCurrentScene", "getTransitions", "getCurrentTransition",
108-
"setCurrentTransition"};
102+
std::vector<std::string> exposedFunctions = {"getControlLevel",
103+
"getCurrentScene",
104+
"getStatus",
105+
"startRecording",
106+
"stopRecording",
107+
"startStreaming",
108+
"stopStreaming",
109+
"pauseRecording",
110+
"unpauseRecording",
111+
"startReplayBuffer",
112+
"stopReplayBuffer",
113+
"saveReplayBuffer",
114+
"startVirtualcam",
115+
"stopVirtualcam",
116+
"getScenes",
117+
"setCurrentScene",
118+
"getTransitions",
119+
"getCurrentTransition",
120+
"setCurrentTransition",
121+
"signal"};
109122

110123
void BrowserApp::OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame>, CefRefPtr<CefV8Context> context)
111124
{

browser-client.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,21 @@ bool BrowserClient::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefR
218218
case ControlLevel::Basic:
219219
if (name == "saveReplayBuffer") {
220220
obs_frontend_replay_buffer_save();
221+
} else if (name == "signal") {
222+
struct calldata data;
223+
calldata_init(&data);
224+
calldata_set_ptr(&data, "source", bs->source);
225+
if (input_args->GetType(1) == VTYPE_STRING) {
226+
const std::string signal = input_args->GetString(1).ToString();
227+
calldata_set_string(&data, "signal", signal.c_str());
228+
}
229+
signal_handler_t *gsh = obs_get_signal_handler();
230+
if (gsh && !obs_obj_is_private(bs->source))
231+
signal_handler_signal(gsh, "source_browser_signal", &data);
232+
signal_handler_t *sh = obs_source_get_signal_handler(bs->source);
233+
if (sh)
234+
signal_handler_signal(sh, "browser_signal", &data);
235+
calldata_free(&data);
221236
}
222237
[[fallthrough]];
223238
case ControlLevel::ReadUser:

obs-browser-plugin.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,10 +467,10 @@ void RegisterBrowserSource()
467467
static_cast<BrowserSource *>(data)->Update(settings);
468468
};
469469
info.get_width = [](void *data) {
470-
return (uint32_t) static_cast<BrowserSource *>(data)->width;
470+
return (uint32_t)static_cast<BrowserSource *>(data)->width;
471471
};
472472
info.get_height = [](void *data) {
473-
return (uint32_t) static_cast<BrowserSource *>(data)->height;
473+
return (uint32_t)static_cast<BrowserSource *>(data)->height;
474474
};
475475
info.video_tick = [](void *data, float) {
476476
static_cast<BrowserSource *>(data)->Tick();
@@ -765,6 +765,7 @@ bool obs_module_load(void)
765765
cef_version_info(5), cef_version_info(6), cef_version_info(7), CEF_VERSION);
766766

767767
RegisterBrowserSource();
768+
signal_handler_add(obs_get_signal_handler(), "void source_browser_signal(ptr source, string signal)");
768769
obs_frontend_add_event_callback(handle_obs_frontend_event, nullptr);
769770

770771
#ifdef ENABLE_BROWSER_SHARED_TEXTURE

obs-browser-source.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ BrowserSource::BrowserSource(obs_data_t *, obs_source_t *source_) : source(sourc
9999
proc_handler_add(ph, "void javascript_event(string eventName, string jsonString)", jsEventFunction,
100100
(void *)this);
101101

102+
signal_handler_t *sh = obs_source_get_signal_handler(source);
103+
signal_handler_add(sh, "void browser_signal(ptr source, string signal)");
104+
102105
/* defer update */
103106
obs_source_update(source, nullptr);
104107

0 commit comments

Comments
 (0)