Selaa lähdekoodia

UI: Add chapter frontend API and hotkey

derrod 1 vuosi sitten
vanhempi
sitoutus
8ac8118b7f

+ 17 - 0
UI/api-interface.cpp

@@ -337,6 +337,23 @@ struct OBSStudioAPI : obs_frontend_callbacks {
 		}
 	}
 
+	bool obs_frontend_recording_add_chapter(const char *name) override
+	{
+		if (!os_atomic_load_bool(&recording_active) ||
+		    os_atomic_load_bool(&recording_paused))
+			return false;
+
+		proc_handler_t *ph = obs_output_get_proc_handler(
+			main->outputHandler->fileOutput);
+
+		calldata cd;
+		calldata_init(&cd);
+		calldata_set_string(&cd, "chapter_name", name);
+		bool result = proc_handler_call(ph, "add_chapter", &cd);
+		calldata_free(&cd);
+		return result;
+	}
+
 	void obs_frontend_replay_buffer_start(void) override
 	{
 		QMetaObject::invokeMethod(main, "StartReplayBuffer");

+ 1 - 0
UI/data/locale/en-US.ini

@@ -732,6 +732,7 @@ Basic.Main.StopRecording="Stop Recording"
 Basic.Main.PauseRecording="Pause Recording"
 Basic.Main.UnpauseRecording="Unpause Recording"
 Basic.Main.SplitFile="Split Recording File"
+Basic.Main.AddChapterMarker="Add Chapter Marker"
 Basic.Main.StoppingRecording="Stopping Recording..."
 Basic.Main.StopReplayBuffer="Stop Replay Buffer"
 Basic.Main.StoppingReplayBuffer="Stopping Replay Buffer..."

+ 6 - 0
UI/obs-frontend-api/obs-frontend-api.cpp

@@ -285,6 +285,12 @@ bool obs_frontend_recording_split_file(void)
 				   : false;
 }
 
+bool obs_frontend_recording_add_chapter(const char *name)
+{
+	return !!callbacks_valid() ? c->obs_frontend_recording_add_chapter(name)
+				   : false;
+}
+
 void obs_frontend_replay_buffer_start(void)
 {
 	if (callbacks_valid())

+ 1 - 0
UI/obs-frontend-api/obs-frontend-api.h

@@ -190,6 +190,7 @@ EXPORT bool obs_frontend_recording_active(void);
 EXPORT void obs_frontend_recording_pause(bool pause);
 EXPORT bool obs_frontend_recording_paused(void);
 EXPORT bool obs_frontend_recording_split_file(void);
+EXPORT bool obs_frontend_recording_add_chapter(const char *name);
 
 EXPORT void obs_frontend_replay_buffer_start(void);
 EXPORT void obs_frontend_replay_buffer_save(void);

+ 1 - 0
UI/obs-frontend-api/obs-frontend-internal.hpp

@@ -53,6 +53,7 @@ struct obs_frontend_callbacks {
 	virtual void obs_frontend_recording_pause(bool pause) = 0;
 	virtual bool obs_frontend_recording_paused(void) = 0;
 	virtual bool obs_frontend_recording_split_file(void) = 0;
+	virtual bool obs_frontend_recording_add_chapter(const char *name) = 0;
 
 	virtual void obs_frontend_replay_buffer_start(void) = 0;
 	virtual void obs_frontend_replay_buffer_save(void) = 0;

+ 18 - 0
UI/window-basic-main.cpp

@@ -2808,6 +2808,23 @@ void OBSBasic::CreateHotkeys()
 		this);
 	LoadHotkey(splitFileHotkey, "OBSBasic.SplitFile");
 
+	/* Adding chapters is only supported by the native MP4 output */
+	const string_view output_id =
+		obs_output_get_id(outputHandler->fileOutput);
+	if (output_id == "mp4_output") {
+		addChapterHotkey = obs_hotkey_register_frontend(
+			"OBSBasic.AddChapterMarker",
+			Str("Basic.Main.AddChapterMarker"),
+			[](void *, obs_hotkey_id, obs_hotkey_t *,
+			   bool pressed) {
+				if (pressed)
+					obs_frontend_recording_add_chapter(
+						nullptr);
+			},
+			this);
+		LoadHotkey(addChapterHotkey, "OBSBasic.AddChapterMarker");
+	}
+
 	replayBufHotkeys = obs_hotkey_pair_register_frontend(
 		"OBSBasic.StartReplayBuffer",
 		Str("Basic.Main.StartReplayBuffer"),
@@ -2936,6 +2953,7 @@ void OBSBasic::ClearHotkeys()
 	obs_hotkey_pair_unregister(recordingHotkeys);
 	obs_hotkey_pair_unregister(pauseHotkeys);
 	obs_hotkey_unregister(splitFileHotkey);
+	obs_hotkey_unregister(addChapterHotkey);
 	obs_hotkey_pair_unregister(replayBufHotkeys);
 	obs_hotkey_pair_unregister(vcamHotkeys);
 	obs_hotkey_pair_unregister(togglePreviewHotkeys);

+ 2 - 1
UI/window-basic-main.hpp

@@ -460,7 +460,8 @@ private:
 	obs_hotkey_pair_id streamingHotkeys, recordingHotkeys, pauseHotkeys,
 		replayBufHotkeys, vcamHotkeys, togglePreviewHotkeys,
 		contextBarHotkeys;
-	obs_hotkey_id forceStreamingStopHotkey, splitFileHotkey;
+	obs_hotkey_id forceStreamingStopHotkey, splitFileHotkey,
+		addChapterHotkey;
 
 	void InitDefaultTransitions();
 	void InitTransition(obs_source_t *transition);