mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-24 23:31:36 +08:00
UI: Add Push-to-talk/mute settings to audio settings
This commit is contained in:
@@ -317,6 +317,23 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
||||
LoadColorRanges();
|
||||
LoadFormats();
|
||||
|
||||
auto ReloadAudioSources = [](void *data, calldata_t *param)
|
||||
{
|
||||
auto settings = static_cast<OBSBasicSettings*>(data);
|
||||
auto source = static_cast<obs_source_t*>(calldata_ptr(param,
|
||||
"source"));
|
||||
|
||||
if (!(obs_source_get_output_flags(source) & OBS_SOURCE_AUDIO))
|
||||
return;
|
||||
|
||||
QMetaObject::invokeMethod(settings, "ReloadAudioSources",
|
||||
Qt::QueuedConnection);
|
||||
};
|
||||
sourceCreated.Connect(obs_get_signal_handler(), "source_create",
|
||||
ReloadAudioSources, this);
|
||||
channelChanged.Connect(obs_get_signal_handler(), "channel_change",
|
||||
ReloadAudioSources, this);
|
||||
|
||||
auto ReloadHotkeys = [](void *data, calldata_t*)
|
||||
{
|
||||
auto settings = static_cast<OBSBasicSettings*>(data);
|
||||
@@ -1245,6 +1262,135 @@ void OBSBasicSettings::LoadAudioDevices()
|
||||
}
|
||||
}
|
||||
|
||||
void OBSBasicSettings::LoadAudioSources()
|
||||
{
|
||||
auto layout = new QFormLayout();
|
||||
layout->setVerticalSpacing(15);
|
||||
layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
||||
|
||||
ui->audioSourceScrollArea->takeWidget()->deleteLater();
|
||||
audioSourceSignals.clear();
|
||||
audioSources.clear();
|
||||
|
||||
auto widget = new QWidget();
|
||||
widget->setLayout(layout);
|
||||
ui->audioSourceScrollArea->setWidget(widget);
|
||||
|
||||
const char *enablePtm = Str("Basic.Settings.Audio.EnablePushToMute");
|
||||
const char *ptmDelay = Str("Basic.Settings.Audio.PushToMuteDelay");
|
||||
const char *enablePtt = Str("Basic.Settings.Audio.EnablePushToTalk");
|
||||
const char *pttDelay = Str("Basic.Settings.Audio.PushToTalkDelay");
|
||||
auto AddSource = [&](obs_source_t *source)
|
||||
{
|
||||
if (!(obs_source_get_output_flags(source) & OBS_SOURCE_AUDIO))
|
||||
return true;
|
||||
|
||||
auto form = new QFormLayout();
|
||||
form->setVerticalSpacing(0);
|
||||
form->setHorizontalSpacing(5);
|
||||
form->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
||||
|
||||
auto ptmCB = new SilentUpdateCheckBox();
|
||||
ptmCB->setText(enablePtm);
|
||||
ptmCB->setChecked(obs_source_push_to_mute_enabled(source));
|
||||
form->addRow(ptmCB);
|
||||
|
||||
auto ptmSB = new SilentUpdateSpinBox();
|
||||
ptmSB->setSuffix(" ms");
|
||||
ptmSB->setRange(0, INT_MAX);
|
||||
ptmSB->setValue(obs_source_get_push_to_mute_delay(source));
|
||||
form->addRow(ptmDelay, ptmSB);
|
||||
|
||||
auto pttCB = new SilentUpdateCheckBox();
|
||||
pttCB->setText(enablePtt);
|
||||
pttCB->setChecked(obs_source_push_to_talk_enabled(source));
|
||||
form->addRow(pttCB);
|
||||
|
||||
auto pttSB = new SilentUpdateSpinBox();
|
||||
pttSB->setSuffix(" ms");
|
||||
pttSB->setRange(0, INT_MAX);
|
||||
pttSB->setValue(obs_source_get_push_to_talk_delay(source));
|
||||
form->addRow(pttDelay, pttSB);
|
||||
|
||||
HookWidget(ptmCB, CHECK_CHANGED, AUDIO_CHANGED);
|
||||
HookWidget(ptmSB, SCROLL_CHANGED, AUDIO_CHANGED);
|
||||
HookWidget(pttCB, CHECK_CHANGED, AUDIO_CHANGED);
|
||||
HookWidget(pttSB, SCROLL_CHANGED, AUDIO_CHANGED);
|
||||
|
||||
audioSourceSignals.reserve(audioSourceSignals.size() + 4);
|
||||
|
||||
auto handler = obs_source_get_signal_handler(source);
|
||||
audioSourceSignals.emplace_back(handler, "push_to_mute_changed",
|
||||
[](void *data, calldata_t *param)
|
||||
{
|
||||
QMetaObject::invokeMethod(static_cast<QObject*>(data),
|
||||
"setCheckedSilently",
|
||||
Q_ARG(bool, calldata_bool(param, "enabled")));
|
||||
}, ptmCB);
|
||||
audioSourceSignals.emplace_back(handler, "push_to_mute_delay",
|
||||
[](void *data, calldata_t *param)
|
||||
{
|
||||
QMetaObject::invokeMethod(static_cast<QObject*>(data),
|
||||
"setValueSilently",
|
||||
Q_ARG(int, calldata_int(param, "delay")));
|
||||
}, ptmSB);
|
||||
audioSourceSignals.emplace_back(handler, "push_to_talk_changed",
|
||||
[](void *data, calldata_t *param)
|
||||
{
|
||||
QMetaObject::invokeMethod(static_cast<QObject*>(data),
|
||||
"setCheckedSilently",
|
||||
Q_ARG(bool, calldata_bool(param, "enabled")));
|
||||
}, pttCB);
|
||||
audioSourceSignals.emplace_back(handler, "push_to_talk_delay",
|
||||
[](void *data, calldata_t *param)
|
||||
{
|
||||
QMetaObject::invokeMethod(static_cast<QObject*>(data),
|
||||
"setValueSilently",
|
||||
Q_ARG(int, calldata_int(param, "delay")));
|
||||
}, pttSB);
|
||||
|
||||
audioSources.emplace_back(OBSGetWeakRef(source),
|
||||
ptmCB, pttSB, pttCB, pttSB);
|
||||
|
||||
auto label = new OBSSourceLabel(source);
|
||||
connect(label, &OBSSourceLabel::Removed,
|
||||
[=]()
|
||||
{
|
||||
LoadAudioSources();
|
||||
});
|
||||
connect(label, &OBSSourceLabel::Destroyed,
|
||||
[=]()
|
||||
{
|
||||
LoadAudioSources();
|
||||
});
|
||||
|
||||
layout->addRow(label, form);
|
||||
return true;
|
||||
};
|
||||
|
||||
for (int i = 0; i < MAX_CHANNELS; i++) {
|
||||
obs_source_t *source = obs_get_output_source(i);
|
||||
if (!source) continue;
|
||||
|
||||
AddSource(source);
|
||||
obs_source_release(source);
|
||||
}
|
||||
|
||||
using AddSource_t = decltype(AddSource);
|
||||
obs_enum_sources([](void *data, obs_source_t *source)
|
||||
{
|
||||
auto &AddSource = *static_cast<AddSource_t*>(data);
|
||||
AddSource(source);
|
||||
return true;
|
||||
}, static_cast<void*>(&AddSource));
|
||||
|
||||
|
||||
if (layout->rowCount() == 0)
|
||||
ui->audioSourceScrollArea->hide();
|
||||
else
|
||||
ui->audioSourceScrollArea->show();
|
||||
}
|
||||
|
||||
void OBSBasicSettings::LoadAudioSettings()
|
||||
{
|
||||
uint32_t sampleRate = config_get_uint(main->Config(), "Audio",
|
||||
@@ -1272,6 +1418,7 @@ void OBSBasicSettings::LoadAudioSettings()
|
||||
ui->channelSetup->setCurrentIndex(1);
|
||||
|
||||
LoadAudioDevices();
|
||||
LoadAudioSources();
|
||||
|
||||
loading = false;
|
||||
}
|
||||
@@ -1866,6 +2013,23 @@ void OBSBasicSettings::SaveAudioSettings()
|
||||
SaveComboData(ui->auxAudioDevice2, "Audio", "AuxDevice2");
|
||||
SaveComboData(ui->auxAudioDevice3, "Audio", "AuxDevice3");
|
||||
|
||||
for (auto &audioSource : audioSources) {
|
||||
auto source = OBSGetStrongRef(get<0>(audioSource));
|
||||
if (!source)
|
||||
continue;
|
||||
|
||||
auto &ptmCB = get<1>(audioSource);
|
||||
auto &ptmSB = get<2>(audioSource);
|
||||
auto &pttCB = get<3>(audioSource);
|
||||
auto &pttSB = get<4>(audioSource);
|
||||
|
||||
obs_source_enable_push_to_mute(source, ptmCB->isChecked());
|
||||
obs_source_set_push_to_mute_delay(source, ptmSB->value());
|
||||
|
||||
obs_source_enable_push_to_talk(source, pttCB->isChecked());
|
||||
obs_source_set_push_to_talk_delay(source, pttSB->value());
|
||||
}
|
||||
|
||||
main->ResetAudioDevices();
|
||||
}
|
||||
|
||||
@@ -2236,6 +2400,11 @@ void OBSBasicSettings::AudioChangedRestart()
|
||||
}
|
||||
}
|
||||
|
||||
void OBSBasicSettings::ReloadAudioSources()
|
||||
{
|
||||
LoadAudioSources();
|
||||
}
|
||||
|
||||
void OBSBasicSettings::VideoChangedRestart()
|
||||
{
|
||||
if (!loading) {
|
||||
|
||||
Reference in New Issue
Block a user