window-basic-main.hpp 16.6 KB
Newer Older
1
/******************************************************************************
2
    Copyright (C) 2013-2014 by Hugh Bailey <obs.jim@gmail.com>
3 4 5

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
6
    the Free Software Foundation, either version 2 of the License, or
7 8 9 10 11 12 13 14 15 16 17 18 19
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/

#pragma once

J
jp9000 已提交
20
#include <QBuffer>
J
jp9000 已提交
21
#include <QAction>
C
cg2121 已提交
22
#include <QSystemTrayIcon>
J
jp9000 已提交
23
#include <obs.hpp>
24
#include <vector>
J
jp9000 已提交
25
#include <memory>
26
#include "window-main.hpp"
J
John Bradley 已提交
27
#include "window-basic-interaction.hpp"
28
#include "window-basic-properties.hpp"
J
jp9000 已提交
29
#include "window-basic-transform.hpp"
J
jp9000 已提交
30
#include "window-basic-adv-audio.hpp"
J
jp9000 已提交
31
#include "window-basic-filters.hpp"
J
jp9000 已提交
32

J
jp9000 已提交
33 34
#include <obs-frontend-internal.hpp>

35
#include <util/platform.h>
36
#include <util/threading.h>
37 38
#include <util/util.hpp>

39 40
#include <QPointer>

J
jp9000 已提交
41
class QListWidgetItem;
42
class VolControl;
J
jp9000 已提交
43
class QNetworkReply;
J
jp9000 已提交
44

B
BtbN 已提交
45
#include "ui_OBSBasic.h"
J
jp9000 已提交
46

47 48 49 50 51 52
#define DESKTOP_AUDIO_1 Str("DesktopAudioDevice1")
#define DESKTOP_AUDIO_2 Str("DesktopAudioDevice2")
#define AUX_AUDIO_1     Str("AuxAudioDevice1")
#define AUX_AUDIO_2     Str("AuxAudioDevice2")
#define AUX_AUDIO_3     Str("AuxAudioDevice3")

53 54
#define SIMPLE_ENCODER_X264                    "x264"
#define SIMPLE_ENCODER_X264_LOWCPU             "x264_lowcpu"
55
#define SIMPLE_ENCODER_QSV                     "qsv"
J
jp9000 已提交
56
#define SIMPLE_ENCODER_NVENC                   "nvenc"
57
#define SIMPLE_ENCODER_AMD                     "amd"
58

59 60
#define PREVIEW_EDGE_SIZE 10

J
jp9000 已提交
61 62
struct BasicOutputHandler;

P
Palana 已提交
63 64 65 66 67
enum class QtDataRole {
	OBSRef = Qt::UserRole,
	OBSSignals,
};

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
struct QuickTransition {
	QPushButton *button = nullptr;
	OBSSource source;
	obs_hotkey_id hotkey = 0;
	int duration = 0;
	int id = 0;

	inline QuickTransition() {}
	inline QuickTransition(OBSSource source_, int duration_, int id_)
		: source   (source_),
		  duration (duration_),
		  id       (id_)
	{}
};

83
class OBSBasic : public OBSMainWindow {
J
jp9000 已提交
84 85
	Q_OBJECT

J
jp9000 已提交
86
	friend class OBSBasicPreview;
J
jp9000 已提交
87
	friend class OBSBasicStatusBar;
J
jp9000 已提交
88
	friend class OBSBasicSourceSelect;
J
jp9000 已提交
89
	friend struct OBSStudioAPI;
J
jp9000 已提交
90

91 92 93 94 95 96 97
	enum class MoveDir {
		Up,
		Down,
		Left,
		Right
	};

98 99 100 101 102 103 104
	enum DropType {
		DropType_RawText,
		DropType_Text,
		DropType_Image,
		DropType_Media
	};

J
jp9000 已提交
105
private:
J
jp9000 已提交
106 107
	obs_frontend_callbacks *api = nullptr;

108 109
	std::vector<VolControl*> volumes;

P
Palana 已提交
110 111
	std::vector<OBSSignal> signalHandlers;

112
	bool loaded = false;
J
jp9000 已提交
113
	long disableSaving = 1;
J
jp9000 已提交
114
	bool projectChanged = false;
115
	bool previewEnabled = true;
116

117 118 119
	QPointer<QThread> updateCheckThread;
	QPointer<QThread> logUploadThread;

J
John Bradley 已提交
120
	QPointer<OBSBasicInteraction> interaction;
121
	QPointer<OBSBasicProperties> properties;
J
jp9000 已提交
122
	QPointer<OBSBasicTransform> transformWindow;
J
jp9000 已提交
123
	QPointer<OBSBasicAdvAudio> advAudioWindow;
J
jp9000 已提交
124
	QPointer<OBSBasicFilters> filters;
125

J
jp9000 已提交
126
	QPointer<QTimer>    cpuUsageTimer;
127
	os_cpu_usage_info_t *cpuUsageInfo = nullptr;
128

129
	OBSService service;
J
jp9000 已提交
130
	std::unique_ptr<BasicOutputHandler> outputHandler;
131 132
	bool streamingStopping = false;
	bool recordingStopping = false;
J
jp9000 已提交
133

134
	gs_vertbuffer_t *box = nullptr;
135 136 137 138
	gs_vertbuffer_t *boxLeft = nullptr;
	gs_vertbuffer_t *boxTop = nullptr;
	gs_vertbuffer_t *boxRight = nullptr;
	gs_vertbuffer_t *boxBottom = nullptr;
139
	gs_vertbuffer_t *circle = nullptr;
J
jp9000 已提交
140

J
jp9000 已提交
141
	bool          sceneChanging = false;
142
	bool          ignoreSelectionUpdate = false;
143

J
jp9000 已提交
144 145 146
	int           previewX = 0,  previewY = 0;
	int           previewCX = 0, previewCY = 0;
	float         previewScale = 0.0f;
J
jp9000 已提交
147

148
	ConfigFile    basicConfig;
149

J
jp9000 已提交
150 151
	QPointer<QWidget> projectors[10];

J
jp9000 已提交
152 153
	QPointer<QMenu> startStreamMenu;

C
cg2121 已提交
154 155 156 157 158 159 160
	QSystemTrayIcon *trayIcon;
	QMenu         *trayMenu;
	QAction       *sysTrayStream;
	QAction       *sysTrayRecord;
	QAction       *showHide;
	QAction       *showPreview;
	QAction       *exit;
J
jp9000 已提交
161
	bool          disableHiding = false;
C
cg2121 已提交
162

163 164
	void          DrawBackdrop(float cx, float cy);

165 166
	void          SetupEncoders();

167
	void          CreateFirstRunSources();
168
	void          CreateDefaultScene(bool firstStart);
169 170

	void          ClearVolumeControls();
171

J
jp9000 已提交
172 173
	void          UploadLog(const char *file);

174 175 176
	void          Save(const char *file);
	void          Load(const char *file);

P
Palana 已提交
177
	void          InitHotkeys();
178
	void          CreateHotkeys();
J
jp9000 已提交
179
	void          ClearHotkeys();
P
Palana 已提交
180

181 182 183 184 185
	bool          InitService();

	bool          InitBasicConfigDefaults();
	bool          InitBasicConfig();

186 187
	void          InitOBSCallbacks();

J
jp9000 已提交
188 189
	void          InitPrimitives();

190
	OBSSceneItem  GetSceneItem(QListWidgetItem *item);
191 192
	OBSSceneItem  GetCurrentSceneItem();

193
	bool          QueryRemoveSource(obs_source_t *source);
194

J
jp9000 已提交
195 196 197
	void          TimedCheckForUpdates();
	void          CheckForUpdates();

198 199 200 201 202 203
	void GetFPSCommon(uint32_t &num, uint32_t &den) const;
	void GetFPSInteger(uint32_t &num, uint32_t &den) const;
	void GetFPSFraction(uint32_t &num, uint32_t &den) const;
	void GetFPSNanoseconds(uint32_t &num, uint32_t &den) const;
	void GetConfigFPS(uint32_t &num, uint32_t &den) const;

204
	void UpdateSources(OBSScene scene);
205
	void InsertSceneItem(obs_sceneitem_t *item);
206

J
jp9000 已提交
207 208 209 210
	void LoadSceneListOrder(obs_data_array_t *array);
	obs_data_array_t *SaveSceneListOrder();
	void ChangeSceneIndex(bool relative, int idx, int invalidIdx);

J
jp9000 已提交
211 212 213 214
	void TempFileOutput(const char *path, int vBitrate, int aBitrate);
	void TempStreamOutput(const char *url, const char *key,
			int vBitrate, int aBitrate);

215 216
	void CreateInteractionWindow(obs_source_t *source);
	void CreatePropertiesWindow(obs_source_t *source);
J
jp9000 已提交
217
	void CreateFiltersWindow(obs_source_t *source);
218

219 220 221
	void CloseDialogs();
	void ClearSceneData();

222
	void Nudge(int dist, MoveDir dir);
J
jp9000 已提交
223
	void OpenProjector(obs_source_t *source, int monitor);
224

225 226 227 228
	void GetAudioSourceFilters();
	void GetAudioSourceProperties();
	void VolControlContextMenu();

J
jp9000 已提交
229 230 231
	void AddSceneCollection(bool create_new);
	void RefreshSceneCollections();
	void ChangeSceneCollection();
232
	void LogScenes();
J
jp9000 已提交
233

J
jp9000 已提交
234 235 236 237 238 239 240 241
	void LoadProfile();
	void ResetProfileData();
	bool AddProfile(bool create_new, const char *title, const char *text,
			const char *init_text = nullptr);
	void DeleteProfile(const char *profile_name, const char *profile_dir);
	void RefreshProfiles();
	void ChangeProfile();

J
jp9000 已提交
242 243
	void SaveProjectNow();

244 245
	QListWidgetItem *GetTopSelectedSourceItem();

246
	obs_hotkey_pair_id streamingHotkeys, recordingHotkeys;
J
jp9000 已提交
247
	obs_hotkey_id forceStreamingStopHotkey;
248

249 250 251 252
	void InitDefaultTransitions();
	void InitTransition(obs_source_t *transition);
	obs_source_t *FindTransition(const char *name);
	OBSSource GetCurrentTransition();
J
jp9000 已提交
253 254
	obs_data_array_t *SaveTransitions();
	void LoadTransitions(obs_data_array_t *transitions);
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305

	obs_source_t *fadeTransition;

	void CreateProgramDisplay();
	void CreateProgramOptions();
	void AddQuickTransitionId(int id);
	void AddQuickTransition();
	void AddQuickTransitionHotkey(QuickTransition *qt);
	void RemoveQuickTransitionHotkey(QuickTransition *qt);
	void LoadQuickTransitions(obs_data_array_t *array);
	obs_data_array_t *SaveQuickTransitions();
	void RefreshQuickTransitions();
	void CreateDefaultQuickTransitions();

	QuickTransition *GetQuickTransition(int id);
	int GetQuickTransitionIdx(int id);
	QMenu *CreateTransitionMenu(QWidget *parent, QuickTransition *qt);
	void ClearQuickTransitions();
	void QuickTransitionClicked();
	void QuickTransitionChange();
	void QuickTransitionChangeDuration(int value);
	void QuickTransitionRemoveClicked();

	void SetPreviewProgramMode(bool enabled);
	void ResizeProgram(uint32_t cx, uint32_t cy);
	void SetCurrentScene(obs_scene_t *scene, bool force = false);
	static void RenderProgram(void *data, uint32_t cx, uint32_t cy);

	std::vector<QuickTransition> quickTransitions;
	QPointer<QWidget> programOptions;
	QPointer<OBSQTDisplay> program;
	OBSWeakSource lastScene;
	OBSWeakSource swapScene;
	OBSWeakSource programScene;
	bool editPropertiesMode = false;
	bool sceneDuplicationMode = true;
	bool swapScenesMode = true;
	volatile bool previewProgramMode = false;
	obs_hotkey_id togglePreviewProgramHotkey = 0;
	obs_hotkey_id transitionHotkey = 0;
	int quickTransitionIdCounter = 1;

	int   programX = 0,  programY = 0;
	int   programCX = 0, programCY = 0;
	float programScale = 0.0f;

	inline bool IsPreviewProgramMode() const
	{
		return os_atomic_load_bool(&previewProgramMode);
	}

306 307 308
	inline void OnActivate();
	inline void OnDeactivate();

309
	void AddDropSource(const char *file, DropType image);
J
jp9000 已提交
310 311 312 313 314
	void dragEnterEvent(QDragEnterEvent *event) override;
	void dragLeaveEvent(QDragLeaveEvent *event) override;
	void dragMoveEvent(QDragMoveEvent *event) override;
	void dropEvent(QDropEvent *event) override;

315
public slots:
316 317
	void StartStreaming();
	void StopStreaming();
J
jp9000 已提交
318 319 320 321
	void ForceStopStreaming();

	void StreamDelayStarting(int sec);
	void StreamDelayStopping(int sec);
322

323
	void StreamingStart();
324
	void StreamStopping();
325
	void StreamingStop(int errorcode);
326

327 328 329
	void StartRecording();
	void StopRecording();

P
Palana 已提交
330
	void RecordingStart();
331
	void RecordStopping();
332
	void RecordingStop(int code);
333

J
jp9000 已提交
334
	void SaveProjectDeferred();
J
jp9000 已提交
335 336
	void SaveProject();

337 338 339 340 341
	void SetTransition(OBSSource transition);
	void TransitionToScene(OBSScene scene, bool force = false);
	void TransitionToScene(OBSSource scene, bool force = false);
	void SetCurrentScene(OBSSource scene, bool force = false);

342 343 344 345 346
private slots:
	void AddSceneItem(OBSSceneItem item);
	void RemoveSceneItem(OBSSceneItem item);
	void AddScene(OBSSource source);
	void RemoveScene(OBSSource source);
J
jp9000 已提交
347
	void RenameSources(QString newName, QString prevName);
348

349
	void SelectSceneItem(OBSScene scene, OBSSceneItem item, bool select);
J
jp9000 已提交
350

351 352 353
	void ActivateAudioSource(OBSSource source);
	void DeactivateAudioSource(OBSSource source);

354
	void DuplicateSelectedScene();
355 356
	void RemoveSelectedScene();
	void RemoveSelectedSceneItem();
J
jp9000 已提交
357

358 359
	void ToggleAlwaysOnTop();

360 361
	void ReorderSources(OBSScene scene);

P
Palana 已提交
362 363
	void ProcessHotkey(obs_hotkey_id id, bool pressed);

J
jp9000 已提交
364 365
	void AddTransition();
	void RenameTransition();
366 367 368 369
	void TransitionClicked();
	void TransitionStopped();
	void TriggerQuickTransition(int id);

J
jp9000 已提交
370 371 372
	void SetDeinterlacingMode();
	void SetDeinterlacingOrder();

373 374
	void SetScaleFilter();

C
cg2121 已提交
375 376 377 378 379
	void IconActivated(QSystemTrayIcon::ActivationReason reason);
	void SetShowing(bool showing);

	inline void ToggleShowHide()
	{
J
jp9000 已提交
380 381 382
		bool showing = isVisible();
		if (disableHiding && showing)
			return;
383 384
		if (showing)
			CloseDialogs();
J
jp9000 已提交
385
		SetShowing(!showing);
C
cg2121 已提交
386 387
	}

388
private:
389
	/* OBS Callbacks */
390
	static void SceneReordered(void *data, calldata_t *params);
391 392
	static void SceneItemAdded(void *data, calldata_t *params);
	static void SceneItemRemoved(void *data, calldata_t *params);
393 394
	static void SceneItemSelected(void *data, calldata_t *params);
	static void SceneItemDeselected(void *data, calldata_t *params);
395
	static void SourceLoaded(void *data, obs_source_t *source);
396 397 398 399
	static void SourceRemoved(void *data, calldata_t *params);
	static void SourceActivated(void *data, calldata_t *params);
	static void SourceDeactivated(void *data, calldata_t *params);
	static void SourceRenamed(void *data, calldata_t *params);
400
	static void RenderMain(void *data, uint32_t cx, uint32_t cy);
401

J
jp9000 已提交
402 403
	void ResizePreview(uint32_t cx, uint32_t cy);

J
jp9000 已提交
404
	void AddSource(const char *id);
405
	QMenu *CreateAddSourcePopupMenu();
J
jp9000 已提交
406
	void AddSourcePopupMenu(const QPoint &pos);
S
Socapex 已提交
407
	void copyActionsDynamicProperties();
408

P
Palana 已提交
409 410
	static void HotkeyTriggered(void *data, obs_hotkey_id id, bool pressed);

411
public:
J
jp9000 已提交
412 413
	OBSScene      GetCurrentScene();

C
cg2121 已提交
414 415
	void SysTrayNotify(const QString &text, QSystemTrayIcon::MessageIcon n);

416 417 418 419 420 421
	inline OBSSource GetCurrentSceneSource()
	{
		OBSScene curScene = GetCurrentScene();
		return OBSSource(obs_scene_get_source(curScene));
	}

422 423
	obs_service_t *GetService();
	void          SetService(obs_service_t *service);
424

425 426
	bool StreamingActive() const;
	bool Active() const;
427

428
	int  ResetVideo();
429
	bool ResetAudio();
J
jp9000 已提交
430 431

	void ResetOutputs();
J
jp9000 已提交
432

433
	void ResetAudioDevice(const char *sourceId, const char *deviceId,
434
			const char *deviceDesc, int channel);
J
jp9000 已提交
435

436 437 438
	void NewProject();
	void LoadProject();

J
jp9000 已提交
439 440 441 442 443 444 445 446
	inline void GetDisplayRect(int &x, int &y, int &cx, int &cy)
	{
		x  = previewX;
		y  = previewY;
		cx = previewCX;
		cy = previewCY;
	}

447 448 449 450 451
	inline double GetCPUUsage() const
	{
		return os_cpu_usage_info_query(cpuUsageInfo);
	}

452 453 454
	void SaveService();
	bool LoadService();

455 456
	void ReorderSceneItem(obs_sceneitem_t *item, size_t idx);

J
jp9000 已提交
457
	QMenu *AddDeinterlacingMenu(obs_source_t *source);
458
	QMenu *AddScaleFilteringMenu(obs_sceneitem_t *item);
J
jp9000 已提交
459 460
	void CreateSourcePopupMenu(QListWidgetItem *item, bool preview);

461
	void UpdateTitleBar();
462
	void UpdateSceneSelection(OBSSource source);
463

C
cg2121 已提交
464 465 466
	void SystemTrayInit();
	void SystemTray(bool firstStarted);

467
protected:
468 469
	virtual void closeEvent(QCloseEvent *event) override;
	virtual void changeEvent(QEvent *event) override;
J
jp9000 已提交
470 471

private slots:
472
	void on_actionShow_Recordings_triggered();
P
Palana 已提交
473
	void on_actionRemux_triggered();
P
Palana 已提交
474
	void on_action_Settings_triggered();
J
jp9000 已提交
475
	void on_actionAdvAudioProperties_triggered();
476
	void on_advAudioProps_clicked();
477
	void on_advAudioProps_destroyed();
P
Palana 已提交
478
	void on_actionShowLogs_triggered();
J
jp9000 已提交
479 480
	void on_actionUploadCurrentLog_triggered();
	void on_actionUploadLastLog_triggered();
481
	void on_actionViewCurrentLog_triggered();
J
jp9000 已提交
482
	void on_actionCheckForUpdates_triggered();
J
jp9000 已提交
483 484 485 486 487 488 489 490 491 492 493

	void on_actionEditTransform_triggered();
	void on_actionRotate90CW_triggered();
	void on_actionRotate90CCW_triggered();
	void on_actionRotate180_triggered();
	void on_actionFlipHorizontal_triggered();
	void on_actionFlipVertical_triggered();
	void on_actionFitToScreen_triggered();
	void on_actionStretchToScreen_triggered();
	void on_actionCenterToScreen_triggered();

494 495
	void on_scenes_currentItemChanged(QListWidgetItem *current,
			QListWidgetItem *prev);
J
jp9000 已提交
496 497 498 499 500
	void on_scenes_customContextMenuRequested(const QPoint &pos);
	void on_actionAddScene_triggered();
	void on_actionRemoveScene_triggered();
	void on_actionSceneUp_triggered();
	void on_actionSceneDown_triggered();
J
jp9000 已提交
501
	void on_sources_itemSelectionChanged();
J
jp9000 已提交
502
	void on_sources_customContextMenuRequested(const QPoint &pos);
P
Palana 已提交
503
	void on_sources_itemDoubleClicked(QListWidgetItem *item);
J
jp9000 已提交
504 505
	void on_actionAddSource_triggered();
	void on_actionRemoveSource_triggered();
J
John Bradley 已提交
506
	void on_actionInteract_triggered();
J
jp9000 已提交
507 508 509
	void on_actionSourceProperties_triggered();
	void on_actionSourceUp_triggered();
	void on_actionSourceDown_triggered();
J
jp9000 已提交
510

J
jp9000 已提交
511 512 513 514 515
	void on_actionMoveUp_triggered();
	void on_actionMoveDown_triggered();
	void on_actionMoveToTop_triggered();
	void on_actionMoveToBottom_triggered();

J
jp9000 已提交
516 517
	void on_actionLockPreview_triggered();

518
	void on_streamButton_clicked();
519
	void on_recordButton_clicked();
J
jp9000 已提交
520
	void on_settingsButton_clicked();
521

522 523
	void on_actionWebsite_triggered();

J
jp9000 已提交
524 525 526 527
	void on_preview_customContextMenuRequested(const QPoint &pos);
	void on_previewDisabledLabel_customContextMenuRequested(
			const QPoint &pos);

J
jp9000 已提交
528 529 530 531 532
	void on_actionNewSceneCollection_triggered();
	void on_actionDupSceneCollection_triggered();
	void on_actionRenameSceneCollection_triggered();
	void on_actionRemoveSceneCollection_triggered();

J
jp9000 已提交
533 534 535 536 537
	void on_actionNewProfile_triggered();
	void on_actionDupProfile_triggered();
	void on_actionRenameProfile_triggered();
	void on_actionRemoveProfile_triggered();

538 539 540
	void on_actionShowSettingsFolder_triggered();
	void on_actionShowProfileFolder_triggered();

541 542
	void on_actionAlwaysOnTop_triggered();

543 544 545 546
	void on_toggleSceneTransitions_toggled(bool visible);
	void on_toggleListboxToolbars_toggled(bool visible);
	void on_toggleStatusBar_toggled(bool visible);

547
	void on_transitions_currentIndexChanged(int index);
J
jp9000 已提交
548 549
	void on_transitionAdd_clicked();
	void on_transitionRemove_clicked();
550 551 552 553
	void on_transitionProps_clicked();

	void on_modeSwitch_clicked();

554
	void logUploadFinished(const QString &text, const QString &error);
J
jp9000 已提交
555

556
	void updateFileFinished(const QString &text, const QString &error);
J
jp9000 已提交
557

J
jp9000 已提交
558 559
	void AddSourceFromAction();

J
jp9000 已提交
560 561 562
	void MoveSceneToTop();
	void MoveSceneToBottom();

J
jp9000 已提交
563 564 565
	void EditSceneName();
	void EditSceneItemName();

J
jp9000 已提交
566 567 568 569 570
	void SceneNameEdited(QWidget *editor,
			QAbstractItemDelegate::EndEditHint endHint);
	void SceneItemNameEdited(QWidget *editor,
			QAbstractItemDelegate::EndEditHint endHint);

J
jp9000 已提交
571
	void OpenSceneFilters();
J
jp9000 已提交
572 573
	void OpenFilters();

574
	void EnablePreviewDisplay(bool enable);
J
jp9000 已提交
575 576
	void TogglePreview();

577 578 579 580 581
	void NudgeUp();
	void NudgeDown();
	void NudgeLeft();
	void NudgeRight();

J
jp9000 已提交
582 583 584 585
	void OpenPreviewProjector();
	void OpenSourceProjector();
	void OpenSceneProjector();

586 587 588
public slots:
	void on_actionResetTransform_triggered();

589
public:
J
jp9000 已提交
590
	explicit OBSBasic(QWidget *parent = 0);
J
jp9000 已提交
591
	virtual ~OBSBasic();
J
jp9000 已提交
592

593 594
	virtual void OBSInit() override;

595
	virtual config_t *Config() const override;
596

J
jp9000 已提交
597
	virtual int GetProfilePath(char *path, size_t size, const char *file)
P
Palana 已提交
598
		const override;
J
jp9000 已提交
599

J
jp9000 已提交
600 601
private:
	std::unique_ptr<Ui::OBSBasic> ui;
602
};