Merge pull request #2267 from exeldro/advAudioAll

UI: add option to show all sources to adv audio dialog
This commit is contained in:
Jim 2019-12-27 13:02:47 -08:00 committed by GitHub
commit ef116f9e5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 121 additions and 2 deletions

View File

@ -27,12 +27,14 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
uint32_t flags = obs_source_get_flags(source); uint32_t flags = obs_source_get_flags(source);
uint32_t mixers = obs_source_get_audio_mixers(source); uint32_t mixers = obs_source_get_audio_mixers(source);
activeContainer = new QWidget();
forceMonoContainer = new QWidget(); forceMonoContainer = new QWidget();
mixerContainer = new QWidget(); mixerContainer = new QWidget();
balanceContainer = new QWidget(); balanceContainer = new QWidget();
labelL = new QLabel(); labelL = new QLabel();
labelR = new QLabel(); labelR = new QLabel();
nameLabel = new QLabel(); nameLabel = new QLabel();
active = new QLabel();
stackedWidget = new QStackedWidget(); stackedWidget = new QStackedWidget();
volume = new QDoubleSpinBox(); volume = new QDoubleSpinBox();
percent = new QSpinBox(); percent = new QSpinBox();
@ -49,6 +51,9 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
mixer5 = new QCheckBox(); mixer5 = new QCheckBox();
mixer6 = new QCheckBox(); mixer6 = new QCheckBox();
activateSignal.Connect(handler, "activate", OBSSourceActivated, this);
deactivateSignal.Connect(handler, "deactivate", OBSSourceDeactivated,
this);
volChangedSignal.Connect(handler, "volume", OBSSourceVolumeChanged, volChangedSignal.Connect(handler, "volume", OBSSourceVolumeChanged,
this); this);
syncOffsetSignal.Connect(handler, "audio_sync", OBSSourceSyncChanged, syncOffsetSignal.Connect(handler, "audio_sync", OBSSourceSyncChanged,
@ -58,6 +63,9 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
mixersSignal.Connect(handler, "audio_mixers", OBSSourceMixersChanged, mixersSignal.Connect(handler, "audio_mixers", OBSSourceMixersChanged,
this); this);
hlayout = new QHBoxLayout();
hlayout->setContentsMargins(0, 0, 0, 0);
activeContainer->setLayout(hlayout);
hlayout = new QHBoxLayout(); hlayout = new QHBoxLayout();
hlayout->setContentsMargins(0, 0, 0, 0); hlayout->setContentsMargins(0, 0, 0, 0);
forceMonoContainer->setLayout(hlayout); forceMonoContainer->setLayout(hlayout);
@ -76,6 +84,15 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
nameLabel->setText(QT_UTF8(sourceName)); nameLabel->setText(QT_UTF8(sourceName));
nameLabel->setAlignment(Qt::AlignVCenter); nameLabel->setAlignment(Qt::AlignVCenter);
bool isActive = obs_source_active(source);
active->setText(isActive ? QTStr("Basic.Stats.Status.Active")
: QTStr("Basic.Stats.Status.Inactive"));
if (isActive)
setThemeID(active, "error");
activeContainer->layout()->addWidget(active);
activeContainer->layout()->setAlignment(active, Qt::AlignVCenter);
activeContainer->setFixedWidth(50);
volume->setMinimum(MIN_DB - 0.1); volume->setMinimum(MIN_DB - 0.1);
volume->setMaximum(MAX_DB); volume->setMaximum(MAX_DB);
volume->setSingleStep(0.1); volume->setSingleStep(0.1);
@ -210,6 +227,7 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
OBSAdvAudioCtrl::~OBSAdvAudioCtrl() OBSAdvAudioCtrl::~OBSAdvAudioCtrl()
{ {
nameLabel->deleteLater(); nameLabel->deleteLater();
activeContainer->deleteLater();
stackedWidget->deleteLater(); stackedWidget->deleteLater();
forceMonoContainer->deleteLater(); forceMonoContainer->deleteLater();
balanceContainer->deleteLater(); balanceContainer->deleteLater();
@ -226,6 +244,7 @@ void OBSAdvAudioCtrl::ShowAudioControl(QGridLayout *layout)
int idx = 0; int idx = 0;
layout->addWidget(nameLabel, lastRow, idx++); layout->addWidget(nameLabel, lastRow, idx++);
layout->addWidget(activeContainer, lastRow, idx++);
layout->addWidget(stackedWidget, lastRow, idx++); layout->addWidget(stackedWidget, lastRow, idx++);
layout->addWidget(forceMonoContainer, lastRow, idx++); layout->addWidget(forceMonoContainer, lastRow, idx++);
layout->addWidget(balanceContainer, lastRow, idx++); layout->addWidget(balanceContainer, lastRow, idx++);
@ -241,6 +260,20 @@ void OBSAdvAudioCtrl::ShowAudioControl(QGridLayout *layout)
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* OBS source callbacks */ /* OBS source callbacks */
void OBSAdvAudioCtrl::OBSSourceActivated(void *param, calldata_t *calldata)
{
QMetaObject::invokeMethod(reinterpret_cast<OBSAdvAudioCtrl *>(param),
"SourceActiveChanged", Q_ARG(bool, true));
UNUSED_PARAMETER(calldata);
}
void OBSAdvAudioCtrl::OBSSourceDeactivated(void *param, calldata_t *calldata)
{
QMetaObject::invokeMethod(reinterpret_cast<OBSAdvAudioCtrl *>(param),
"SourceActiveChanged", Q_ARG(bool, false));
UNUSED_PARAMETER(calldata);
}
void OBSAdvAudioCtrl::OBSSourceFlagsChanged(void *param, calldata_t *calldata) void OBSAdvAudioCtrl::OBSSourceFlagsChanged(void *param, calldata_t *calldata)
{ {
uint32_t flags = (uint32_t)calldata_int(calldata, "flags"); uint32_t flags = (uint32_t)calldata_int(calldata, "flags");
@ -280,6 +313,17 @@ static inline void setCheckboxState(QCheckBox *checkbox, bool checked)
checkbox->blockSignals(false); checkbox->blockSignals(false);
} }
void OBSAdvAudioCtrl::SourceActiveChanged(bool isActive)
{
if (isActive) {
active->setText(QTStr("Basic.Stats.Status.Active"));
setThemeID(active, "error");
} else {
active->setText(QTStr("Basic.Stats.Status.Inactive"));
setThemeID(active, "");
}
}
void OBSAdvAudioCtrl::SourceFlagsChanged(uint32_t flags) void OBSAdvAudioCtrl::SourceFlagsChanged(uint32_t flags)
{ {
bool forceMonoVal = (flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0; bool forceMonoVal = (flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0;

View File

@ -24,11 +24,13 @@ class OBSAdvAudioCtrl : public QObject {
private: private:
OBSSource source; OBSSource source;
QPointer<QWidget> activeContainer;
QPointer<QWidget> forceMonoContainer; QPointer<QWidget> forceMonoContainer;
QPointer<QWidget> mixerContainer; QPointer<QWidget> mixerContainer;
QPointer<QWidget> balanceContainer; QPointer<QWidget> balanceContainer;
QPointer<QLabel> nameLabel; QPointer<QLabel> nameLabel;
QPointer<QLabel> active;
QPointer<QStackedWidget> stackedWidget; QPointer<QStackedWidget> stackedWidget;
QPointer<QSpinBox> percent; QPointer<QSpinBox> percent;
QPointer<QDoubleSpinBox> volume; QPointer<QDoubleSpinBox> volume;
@ -49,7 +51,11 @@ private:
OBSSignal syncOffsetSignal; OBSSignal syncOffsetSignal;
OBSSignal flagsSignal; OBSSignal flagsSignal;
OBSSignal mixersSignal; OBSSignal mixersSignal;
OBSSignal activateSignal;
OBSSignal deactivateSignal;
static void OBSSourceActivated(void *param, calldata_t *calldata);
static void OBSSourceDeactivated(void *param, calldata_t *calldata);
static void OBSSourceFlagsChanged(void *param, calldata_t *calldata); static void OBSSourceFlagsChanged(void *param, calldata_t *calldata);
static void OBSSourceVolumeChanged(void *param, calldata_t *calldata); static void OBSSourceVolumeChanged(void *param, calldata_t *calldata);
static void OBSSourceSyncChanged(void *param, calldata_t *calldata); static void OBSSourceSyncChanged(void *param, calldata_t *calldata);
@ -65,6 +71,7 @@ public:
void SetVolumeWidget(VolumeType type); void SetVolumeWidget(VolumeType type);
public slots: public slots:
void SourceActiveChanged(bool active);
void SourceFlagsChanged(uint32_t flags); void SourceFlagsChanged(uint32_t flags);
void SourceVolumeChanged(float volume); void SourceVolumeChanged(float volume);
void SourceSyncChanged(int64_t offset); void SourceSyncChanged(int64_t offset);

View File

@ -211,6 +211,7 @@ Basic.Stats.Status.Recording="Recording"
Basic.Stats.Status.Live="LIVE" Basic.Stats.Status.Live="LIVE"
Basic.Stats.Status.Reconnecting="Reconnecting" Basic.Stats.Status.Reconnecting="Reconnecting"
Basic.Stats.Status.Inactive="Inactive" Basic.Stats.Status.Inactive="Inactive"
Basic.Stats.Status.Active="Active"
Basic.Stats.DroppedFrames="Dropped Frames (Network)" Basic.Stats.DroppedFrames="Dropped Frames (Network)"
Basic.Stats.MegabytesSent="Total Data Output" Basic.Stats.MegabytesSent="Total Data Output"
Basic.Stats.Bitrate="Bitrate" Basic.Stats.Bitrate="Bitrate"
@ -876,6 +877,7 @@ Basic.Settings.Advanced.AutoRemux.MP4="(record as mkv)"
# advanced audio properties # advanced audio properties
Basic.AdvAudio="Advanced Audio Properties" Basic.AdvAudio="Advanced Audio Properties"
Basic.AdvAudio.ActiveOnly="Active Sources Only"
Basic.AdvAudio.Name="Name" Basic.AdvAudio.Name="Name"
Basic.AdvAudio.Volume="Volume" Basic.AdvAudio.Volume="Volume"
Basic.AdvAudio.Mono="Mono" Basic.AdvAudio.Mono="Mono"

View File

@ -18,7 +18,8 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
sourceAddedSignal(obs_get_signal_handler(), "source_activate", sourceAddedSignal(obs_get_signal_handler(), "source_activate",
OBSSourceAdded, this), OBSSourceAdded, this),
sourceRemovedSignal(obs_get_signal_handler(), "source_deactivate", sourceRemovedSignal(obs_get_signal_handler(), "source_deactivate",
OBSSourceRemoved, this) OBSSourceRemoved, this),
showInactive(false)
{ {
QScrollArea *scrollArea; QScrollArea *scrollArea;
QVBoxLayout *vlayout; QVBoxLayout *vlayout;
@ -31,6 +32,9 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
label = new QLabel(QTStr("Basic.AdvAudio.Name")); label = new QLabel(QTStr("Basic.AdvAudio.Name"));
label->setStyleSheet("font-weight: bold;"); label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++); mainLayout->addWidget(label, 0, idx++);
label = new QLabel(QTStr("Basic.Stats.Status"));
label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++);
label = new QLabel(QTStr("Basic.AdvAudio.Volume")); label = new QLabel(QTStr("Basic.AdvAudio.Volume"));
label->setStyleSheet("font-weight: bold;"); label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++); mainLayout->addWidget(label, 0, idx++);
@ -70,7 +74,12 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
QPushButton *closeButton = new QPushButton(QTStr("Close")); QPushButton *closeButton = new QPushButton(QTStr("Close"));
activeOnly = new QCheckBox();
activeOnly->setChecked(!showInactive);
activeOnly->setText(QTStr("Basic.AdvAudio.ActiveOnly"));
QHBoxLayout *buttonLayout = new QHBoxLayout; QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addWidget(activeOnly);
buttonLayout->addStretch(); buttonLayout->addStretch();
buttonLayout->addWidget(closeButton); buttonLayout->addWidget(closeButton);
@ -80,6 +89,9 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
vlayout->addLayout(buttonLayout); vlayout->addLayout(buttonLayout);
setLayout(vlayout); setLayout(vlayout);
connect(activeOnly, SIGNAL(clicked(bool)), this,
SLOT(ActiveOnlyChanged(bool)));
connect(closeButton, &QPushButton::clicked, [this]() { close(); }); connect(closeButton, &QPushButton::clicked, [this]() { close(); });
installEventFilter(CreateShortcutFilter()); installEventFilter(CreateShortcutFilter());
@ -115,7 +127,8 @@ bool OBSBasicAdvAudio::EnumSources(void *param, obs_source_t *source)
OBSBasicAdvAudio *dialog = reinterpret_cast<OBSBasicAdvAudio *>(param); OBSBasicAdvAudio *dialog = reinterpret_cast<OBSBasicAdvAudio *>(param);
uint32_t flags = obs_source_get_output_flags(source); uint32_t flags = obs_source_get_output_flags(source);
if ((flags & OBS_SOURCE_AUDIO) != 0 && obs_source_active(source)) if ((flags & OBS_SOURCE_AUDIO) != 0 &&
(dialog->showInactive || obs_source_active(source)))
dialog->AddAudioSource(source); dialog->AddAudioSource(source);
return true; return true;
@ -139,6 +152,10 @@ void OBSBasicAdvAudio::OBSSourceRemoved(void *param, calldata_t *calldata)
inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source) inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
{ {
for (size_t i = 0; i < controls.size(); i++) {
if (controls[i]->GetSource() == source)
return;
}
OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source); OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source);
InsertQObjectByName(controls, control); InsertQObjectByName(controls, control);
@ -217,3 +234,46 @@ void OBSBasicAdvAudio::ShowContextMenu(const QPoint &pos)
contextMenu->exec(mapToGlobal(pos)); contextMenu->exec(mapToGlobal(pos));
} }
void OBSBasicAdvAudio::ActiveOnlyChanged(bool checked)
{
SetShowInactive(!checked);
}
void OBSBasicAdvAudio::SetShowInactive(bool show)
{
if (showInactive == show)
return;
showInactive = show;
activeOnly->setChecked(!showInactive);
sourceAddedSignal.Disconnect();
sourceRemovedSignal.Disconnect();
if (showInactive) {
sourceAddedSignal.Connect(obs_get_signal_handler(),
"source_create", OBSSourceAdded,
this);
sourceRemovedSignal.Connect(obs_get_signal_handler(),
"source_remove", OBSSourceRemoved,
this);
obs_enum_sources(EnumSources, this);
} else {
sourceAddedSignal.Connect(obs_get_signal_handler(),
"source_activate", OBSSourceAdded,
this);
sourceRemovedSignal.Connect(obs_get_signal_handler(),
"source_deactivate",
OBSSourceRemoved, this);
for (size_t i = 0; i < controls.size(); i++) {
const auto source = controls[i]->GetSource();
if (!obs_source_active(source)) {
delete controls[i];
controls.erase(controls.begin() + i);
i--;
}
}
}
}

View File

@ -3,6 +3,8 @@
#include <obs.hpp> #include <obs.hpp>
#include <QDialog> #include <QDialog>
#include <vector> #include <vector>
#include <QCheckBox>
#include <QPointer>
class OBSAdvAudioCtrl; class OBSAdvAudioCtrl;
class QGridLayout; class QGridLayout;
@ -15,8 +17,10 @@ class OBSBasicAdvAudio : public QDialog {
private: private:
QWidget *controlArea; QWidget *controlArea;
QGridLayout *mainLayout; QGridLayout *mainLayout;
QPointer<QCheckBox> activeOnly;
OBSSignal sourceAddedSignal; OBSSignal sourceAddedSignal;
OBSSignal sourceRemovedSignal; OBSSignal sourceRemovedSignal;
bool showInactive;
std::vector<OBSAdvAudioCtrl *> controls; std::vector<OBSAdvAudioCtrl *> controls;
@ -33,8 +37,10 @@ public slots:
void ShowContextMenu(const QPoint &pos); void ShowContextMenu(const QPoint &pos);
void SetVolumeType(); void SetVolumeType();
void ActiveOnlyChanged(bool checked);
public: public:
OBSBasicAdvAudio(QWidget *parent); OBSBasicAdvAudio(QWidget *parent);
~OBSBasicAdvAudio(); ~OBSBasicAdvAudio();
void SetShowInactive(bool showInactive);
}; };