Compare commits

...

3 Commits

Author SHA1 Message Date
WarmUpTill
267855fded Cleanup
* Use OBSSourceAutoRelease
* Do not return true if source selection is invalid
2023-12-17 10:40:29 +01:00
WarmUpTill
4bdebb7feb Fix crash when asking for settings backup
This dialog cannot be modal since other plugins might attempt to display
content which might result in a deadlock.
2023-12-16 19:02:38 +01:00
Michael Kirsch
ab5f69d2ef Decrease the minimal interval time to 10ms 2023-12-13 19:29:14 +01:00
3 changed files with 49 additions and 42 deletions

View File

@@ -119,7 +119,7 @@
<string notr="true">ms</string> <string notr="true">ms</string>
</property> </property>
<property name="minimum"> <property name="minimum">
<number>50</number> <number>10</number>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>20000</number> <number>20000</number>

View File

@@ -10,6 +10,7 @@
#include <QMainWindow> #include <QMainWindow>
#include <QAction> #include <QAction>
#include <QFileDialog> #include <QFileDialog>
#include <QTextStream>
#include <QDirIterator> #include <QDirIterator>
#include <regex> #include <regex>
#include <filesystem> #include <filesystem>
@@ -135,7 +136,7 @@ bool AdvSceneSwitcher::eventFilter(QObject *obj, QEvent *event)
/****************************************************************************** /******************************************************************************
* Saving and loading * Saving and loading
******************************************************************************/ ******************************************************************************/
static void AskForBackup(obs_data_t *obj); static void AskForBackup(const QString &json);
static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *)
{ {
@@ -156,16 +157,25 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *)
switcher->Stop(); switcher->Stop();
switcher->m.lock(); switcher->m.lock();
obs_data_t *obj = OBSDataAutoRelease obj =
obs_data_get_obj(save_data, "advanced-scene-switcher"); obs_data_get_obj(save_data, "advanced-scene-switcher");
if (!obj) { if (!obj) {
obj = obs_data_create(); obj = obs_data_create();
} }
if (switcher->VersionChanged(obj, g_GIT_SHA1)) { if (switcher->VersionChanged(obj, g_GIT_SHA1)) {
AskForBackup(obj); auto json = obs_data_get_json(obj);
static QString jsonQString = json ? json : "";
std::thread t([]() {
obs_queue_task(
OBS_TASK_UI,
[](void *) {
AskForBackup(jsonQString);
},
nullptr, false);
});
t.detach();
} }
switcher->LoadSettings(obj); switcher->LoadSettings(obj);
obs_data_release(obj);
switcher->m.unlock(); switcher->m.unlock();
if (!switcher->stop) { if (!switcher->stop) {
@@ -174,12 +184,12 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *)
} }
} }
static void AskForBackup(obs_data_t *obj) static void AskForBackup(const QString &json)
{ {
bool backupSettings = DisplayMessage( const bool backupWasConfirmed = DisplayMessage(
obs_module_text("AdvSceneSwitcher.askBackup"), true); obs_module_text("AdvSceneSwitcher.askBackup"), true, false);
if (!backupSettings) { if (!backupWasConfirmed) {
return; return;
} }
@@ -198,8 +208,8 @@ static void AskForBackup(obs_data_t *obj)
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
return; return;
} }
auto out = QTextStream(&file);
obs_data_save_json(obj, file.fileName().toUtf8().constData()); out << json;
} }
/****************************************************************************** /******************************************************************************

View File

@@ -62,17 +62,17 @@ MacroConditionAudio::~MacroConditionAudio()
bool MacroConditionAudio::CheckOutputCondition() bool MacroConditionAudio::CheckOutputCondition()
{ {
bool ret = false; bool ret = false;
auto s = obs_weak_source_get_source(_audioSource.GetSource()); OBSSourceAutoRelease source =
obs_weak_source_get_source(_audioSource.GetSource());
// peak will have a value from -60 db to 0 db so we need to scale it
double curVolume = ((double)_peak + 60) * 1.7; double curVolume = ((double)_peak + 60) * 1.7;
switch (_outputCondition) { switch (_outputCondition) {
case OutputCondition::ABOVE: case OutputCondition::ABOVE:
// peak will have a value from -60 db to 0 db
ret = curVolume > _volume; ret = curVolume > _volume;
break; break;
case OutputCondition::BELOW: case OutputCondition::BELOW:
// peak will have a value from -60 db to 0 db
ret = curVolume < _volume; ret = curVolume < _volume;
break; break;
default: default:
@@ -84,21 +84,21 @@ bool MacroConditionAudio::CheckOutputCondition()
// Reset for next check // Reset for next check
_peak = -std::numeric_limits<float>::infinity(); _peak = -std::numeric_limits<float>::infinity();
obs_source_release(s);
if (_audioSource.GetType() == SourceSelection::Type::VARIABLE) { if (_audioSource.GetType() == SourceSelection::Type::VARIABLE) {
ResetVolmeter(); ResetVolmeter();
} }
return ret; return ret && source;
} }
bool MacroConditionAudio::CheckVolumeCondition() bool MacroConditionAudio::CheckVolumeCondition()
{ {
bool ret = false; bool ret = false;
auto s = obs_weak_source_get_source(_audioSource.GetSource()); OBSSourceAutoRelease source =
obs_weak_source_get_source(_audioSource.GetSource());
float curVolume = obs_source_get_volume(s); float curVolume = obs_source_get_volume(source);
bool muted = obs_source_muted(s); bool muted = obs_source_muted(source);
switch (_volumeCondition) { switch (_volumeCondition) {
case VolumeCondition::ABOVE: case VolumeCondition::ABOVE:
@@ -126,10 +126,9 @@ bool MacroConditionAudio::CheckVolumeCondition()
} }
SetTempVarValue("configured_volume", std::to_string(curVolume)); SetTempVarValue("configured_volume", std::to_string(curVolume));
SetTempVarValue("muted", muted ? "true" : "false"); SetTempVarValue("muted", (source && muted) ? "true" : "false");
obs_source_release(s); return ret && source;
return ret;
} }
bool MacroConditionAudio::CheckSyncOffset() bool MacroConditionAudio::CheckSyncOffset()
@@ -139,8 +138,9 @@ bool MacroConditionAudio::CheckSyncOffset()
} }
bool ret = false; bool ret = false;
auto s = obs_weak_source_get_source(_audioSource.GetSource()); OBSSourceAutoRelease source =
auto curOffset = obs_source_get_sync_offset(s) / nsPerMs; obs_weak_source_get_source(_audioSource.GetSource());
auto curOffset = obs_source_get_sync_offset(source) / nsPerMs;
if (_outputCondition == OutputCondition::ABOVE) { if (_outputCondition == OutputCondition::ABOVE) {
ret = curOffset > _syncOffset; ret = curOffset > _syncOffset;
} else { } else {
@@ -148,8 +148,7 @@ bool MacroConditionAudio::CheckSyncOffset()
} }
SetVariableValue(std::to_string(curOffset)); SetVariableValue(std::to_string(curOffset));
SetTempVarValue("sync_offset", std::to_string(curOffset)); SetTempVarValue("sync_offset", std::to_string(curOffset));
obs_source_release(s); return ret && source;
return ret;
} }
bool MacroConditionAudio::CheckMonitor() bool MacroConditionAudio::CheckMonitor()
@@ -159,13 +158,13 @@ bool MacroConditionAudio::CheckMonitor()
} }
bool ret = false; bool ret = false;
auto s = obs_weak_source_get_source(_audioSource.GetSource()); OBSSourceAutoRelease source =
ret = obs_source_get_monitoring_type(s) == _monitorType; obs_weak_source_get_source(_audioSource.GetSource());
ret = obs_source_get_monitoring_type(source) == _monitorType;
SetVariableValue(""); SetVariableValue("");
SetTempVarValue("monitor", SetTempVarValue("monitor",
std::to_string(obs_source_get_monitoring_type(s))); std::to_string(obs_source_get_monitoring_type(source)));
obs_source_release(s); return ret && source;
return ret;
} }
bool MacroConditionAudio::CheckBalance() bool MacroConditionAudio::CheckBalance()
@@ -175,8 +174,9 @@ bool MacroConditionAudio::CheckBalance()
} }
bool ret = false; bool ret = false;
auto s = obs_weak_source_get_source(_audioSource.GetSource()); OBSSourceAutoRelease source =
auto curBalance = obs_source_get_balance_value(s); obs_weak_source_get_source(_audioSource.GetSource());
auto curBalance = obs_source_get_balance_value(source);
if (_outputCondition == OutputCondition::ABOVE) { if (_outputCondition == OutputCondition::ABOVE) {
ret = curBalance > _balance; ret = curBalance > _balance;
} else { } else {
@@ -184,8 +184,7 @@ bool MacroConditionAudio::CheckBalance()
} }
SetVariableValue(std::to_string(curBalance)); SetVariableValue(std::to_string(curBalance));
SetTempVarValue("balance", std::to_string(curBalance)); SetTempVarValue("balance", std::to_string(curBalance));
obs_source_release(s); return ret && source;
return ret;
} }
bool MacroConditionAudio::CheckCondition() bool MacroConditionAudio::CheckCondition()
@@ -239,13 +238,12 @@ obs_volmeter_t *AddVolmeterToSource(MacroConditionAudio *entry,
obs_volmeter_t *volmeter = obs_volmeter_create(OBS_FADER_LOG); obs_volmeter_t *volmeter = obs_volmeter_create(OBS_FADER_LOG);
obs_volmeter_add_callback(volmeter, MacroConditionAudio::SetVolumeLevel, obs_volmeter_add_callback(volmeter, MacroConditionAudio::SetVolumeLevel,
entry); entry);
obs_source_t *as = obs_weak_source_get_source(source); OBSSourceAutoRelease audioSource = obs_weak_source_get_source(source);
if (!obs_volmeter_attach_source(volmeter, as)) { if (!obs_volmeter_attach_source(volmeter, audioSource)) {
const char *name = obs_source_get_name(as); const char *name = obs_source_get_name(audioSource);
blog(LOG_WARNING, "failed to attach volmeter to source %s", blog(LOG_WARNING, "failed to attach volmeter to source %s",
name); name);
} }
obs_source_release(as);
return volmeter; return volmeter;
} }
@@ -455,10 +453,9 @@ MacroConditionAudioEdit::MacroConditionAudioEdit(
void MacroConditionAudioEdit::UpdateVolmeterSource() void MacroConditionAudioEdit::UpdateVolmeterSource()
{ {
delete _volMeter; delete _volMeter;
obs_source_t *soruce = obs_weak_source_get_source( OBSSourceAutoRelease soruce = obs_weak_source_get_source(
_entryData->_audioSource.GetSource()); _entryData->_audioSource.GetSource());
_volMeter = new VolControl(soruce); _volMeter = new VolControl(soruce.Get());
obs_source_release(soruce);
QLayout *layout = this->layout(); QLayout *layout = this->layout();
layout->addWidget(_volMeter); layout->addWidget(_volMeter);