123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- /******************************************************************************
- Copyright (C) 2023 by Lain Bailey <[email protected]>
- Zachary Lund <[email protected]>
- Philippe Groarke <[email protected]>
- 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
- the Free Software Foundation, either version 2 of the License, or
- (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/>.
- ******************************************************************************/
- #include "OBSBasic.hpp"
- #include <widgets/VolControl.hpp>
- using namespace std;
- void OBSBasic::UpdateVolumeControlsDecayRate()
- {
- double meterDecayRate = config_get_double(activeConfiguration, "Audio", "MeterDecayRate");
- for (size_t i = 0; i < volumes.size(); i++) {
- volumes[i]->SetMeterDecayRate(meterDecayRate);
- }
- }
- void OBSBasic::UpdateVolumeControlsPeakMeterType()
- {
- uint32_t peakMeterTypeIdx = config_get_uint(activeConfiguration, "Audio", "PeakMeterType");
- enum obs_peak_meter_type peakMeterType;
- switch (peakMeterTypeIdx) {
- case 0:
- peakMeterType = SAMPLE_PEAK_METER;
- break;
- case 1:
- peakMeterType = TRUE_PEAK_METER;
- break;
- default:
- peakMeterType = SAMPLE_PEAK_METER;
- break;
- }
- for (size_t i = 0; i < volumes.size(); i++) {
- volumes[i]->setPeakMeterType(peakMeterType);
- }
- }
- void OBSBasic::ClearVolumeControls()
- {
- for (VolControl *vol : volumes)
- delete vol;
- volumes.clear();
- }
- void OBSBasic::RefreshVolumeColors()
- {
- for (VolControl *vol : volumes) {
- vol->refreshColors();
- }
- }
- void OBSBasic::HideAudioControl()
- {
- QAction *action = reinterpret_cast<QAction *>(sender());
- VolControl *vol = action->property("volControl").value<VolControl *>();
- obs_source_t *source = vol->GetSource();
- if (!SourceMixerHidden(source)) {
- SetSourceMixerHidden(source, true);
- DeactivateAudioSource(source);
- }
- }
- void OBSBasic::UnhideAllAudioControls()
- {
- auto UnhideAudioMixer = [this](obs_source_t *source) /* -- */
- {
- if (!obs_source_active(source))
- return true;
- if (!SourceMixerHidden(source))
- return true;
- SetSourceMixerHidden(source, false);
- ActivateAudioSource(source);
- return true;
- };
- using UnhideAudioMixer_t = decltype(UnhideAudioMixer);
- auto PreEnum = [](void *data, obs_source_t *source) -> bool /* -- */
- {
- return (*static_cast<UnhideAudioMixer_t *>(data))(source);
- };
- obs_enum_sources(PreEnum, &UnhideAudioMixer);
- }
- void OBSBasic::ToggleHideMixer()
- {
- OBSSceneItem item = GetCurrentSceneItem();
- OBSSource source = obs_sceneitem_get_source(item);
- if (!SourceMixerHidden(source)) {
- SetSourceMixerHidden(source, true);
- DeactivateAudioSource(source);
- } else {
- SetSourceMixerHidden(source, false);
- ActivateAudioSource(source);
- }
- }
- void OBSBasic::LockVolumeControl(bool lock)
- {
- QAction *action = reinterpret_cast<QAction *>(sender());
- VolControl *vol = action->property("volControl").value<VolControl *>();
- obs_source_t *source = vol->GetSource();
- OBSDataAutoRelease priv_settings = obs_source_get_private_settings(source);
- obs_data_set_bool(priv_settings, "volume_locked", lock);
- vol->EnableSlider(!lock);
- }
- void OBSBasic::VolControlContextMenu()
- {
- VolControl *vol = reinterpret_cast<VolControl *>(sender());
- /* ------------------- */
- QAction lockAction(QTStr("LockVolume"), this);
- lockAction.setCheckable(true);
- lockAction.setChecked(SourceVolumeLocked(vol->GetSource()));
- QAction hideAction(QTStr("Hide"), this);
- QAction unhideAllAction(QTStr("UnhideAll"), this);
- QAction mixerRenameAction(QTStr("Rename"), this);
- QAction copyFiltersAction(QTStr("Copy.Filters"), this);
- QAction pasteFiltersAction(QTStr("Paste.Filters"), this);
- QAction filtersAction(QTStr("Filters"), this);
- QAction propertiesAction(QTStr("Properties"), this);
- QAction advPropAction(QTStr("Basic.MainMenu.Edit.AdvAudio"), this);
- QAction toggleControlLayoutAction(QTStr("VerticalLayout"), this);
- toggleControlLayoutAction.setCheckable(true);
- toggleControlLayoutAction.setChecked(
- config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl"));
- /* ------------------- */
- connect(&hideAction, &QAction::triggered, this, &OBSBasic::HideAudioControl, Qt::DirectConnection);
- connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection);
- connect(&lockAction, &QAction::toggled, this, &OBSBasic::LockVolumeControl, Qt::DirectConnection);
- connect(&mixerRenameAction, &QAction::triggered, this, &OBSBasic::MixerRenameSource, Qt::DirectConnection);
- connect(©FiltersAction, &QAction::triggered, this, &OBSBasic::AudioMixerCopyFilters, Qt::DirectConnection);
- connect(&pasteFiltersAction, &QAction::triggered, this, &OBSBasic::AudioMixerPasteFilters,
- Qt::DirectConnection);
- connect(&filtersAction, &QAction::triggered, this, &OBSBasic::GetAudioSourceFilters, Qt::DirectConnection);
- connect(&propertiesAction, &QAction::triggered, this, &OBSBasic::GetAudioSourceProperties,
- Qt::DirectConnection);
- connect(&advPropAction, &QAction::triggered, this, &OBSBasic::on_actionAdvAudioProperties_triggered,
- Qt::DirectConnection);
- /* ------------------- */
- connect(&toggleControlLayoutAction, &QAction::changed, this, &OBSBasic::ToggleVolControlLayout,
- Qt::DirectConnection);
- /* ------------------- */
- hideAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
- lockAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
- mixerRenameAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
- copyFiltersAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
- pasteFiltersAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
- filtersAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
- propertiesAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
- /* ------------------- */
- copyFiltersAction.setEnabled(obs_source_filter_count(vol->GetSource()) > 0);
- pasteFiltersAction.setEnabled(!obs_weak_source_expired(copyFiltersSource));
- QMenu popup;
- vol->SetContextMenu(&popup);
- popup.addAction(&lockAction);
- popup.addSeparator();
- popup.addAction(&unhideAllAction);
- popup.addAction(&hideAction);
- popup.addAction(&mixerRenameAction);
- popup.addSeparator();
- popup.addAction(©FiltersAction);
- popup.addAction(&pasteFiltersAction);
- popup.addSeparator();
- popup.addAction(&toggleControlLayoutAction);
- popup.addSeparator();
- popup.addAction(&filtersAction);
- popup.addAction(&propertiesAction);
- popup.addAction(&advPropAction);
- // toggleControlLayoutAction deletes and re-creates the volume controls
- // meaning that "vol" would be pointing to freed memory.
- if (popup.exec(QCursor::pos()) != &toggleControlLayoutAction)
- vol->SetContextMenu(nullptr);
- }
- void OBSBasic::on_hMixerScrollArea_customContextMenuRequested()
- {
- StackedMixerAreaContextMenuRequested();
- }
- void OBSBasic::on_vMixerScrollArea_customContextMenuRequested()
- {
- StackedMixerAreaContextMenuRequested();
- }
- void OBSBasic::StackedMixerAreaContextMenuRequested()
- {
- QAction unhideAllAction(QTStr("UnhideAll"), this);
- QAction advPropAction(QTStr("Basic.MainMenu.Edit.AdvAudio"), this);
- QAction toggleControlLayoutAction(QTStr("VerticalLayout"), this);
- toggleControlLayoutAction.setCheckable(true);
- toggleControlLayoutAction.setChecked(
- config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl"));
- /* ------------------- */
- connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection);
- connect(&advPropAction, &QAction::triggered, this, &OBSBasic::on_actionAdvAudioProperties_triggered,
- Qt::DirectConnection);
- /* ------------------- */
- connect(&toggleControlLayoutAction, &QAction::changed, this, &OBSBasic::ToggleVolControlLayout,
- Qt::DirectConnection);
- /* ------------------- */
- QMenu popup;
- popup.addAction(&unhideAllAction);
- popup.addSeparator();
- popup.addAction(&toggleControlLayoutAction);
- popup.addSeparator();
- popup.addAction(&advPropAction);
- popup.exec(QCursor::pos());
- }
- void OBSBasic::ToggleMixerLayout(bool vertical)
- {
- if (vertical) {
- ui->stackedMixerArea->setMinimumSize(180, 220);
- ui->stackedMixerArea->setCurrentIndex(1);
- } else {
- ui->stackedMixerArea->setMinimumSize(220, 0);
- ui->stackedMixerArea->setCurrentIndex(0);
- }
- }
- void OBSBasic::ToggleVolControlLayout()
- {
- bool vertical = !config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl");
- config_set_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl", vertical);
- ToggleMixerLayout(vertical);
- // We need to store it so we can delete current and then add
- // at the right order
- vector<OBSSource> sources;
- for (size_t i = 0; i != volumes.size(); i++)
- sources.emplace_back(volumes[i]->GetSource());
- ClearVolumeControls();
- for (const auto &source : sources)
- ActivateAudioSource(source);
- }
- void OBSBasic::on_actionMixerToolbarAdvAudio_triggered()
- {
- on_actionAdvAudioProperties_triggered();
- }
- void OBSBasic::on_actionMixerToolbarMenu_triggered()
- {
- QAction unhideAllAction(QTStr("UnhideAll"), this);
- connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection);
- QAction toggleControlLayoutAction(QTStr("VerticalLayout"), this);
- toggleControlLayoutAction.setCheckable(true);
- toggleControlLayoutAction.setChecked(
- config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl"));
- connect(&toggleControlLayoutAction, &QAction::changed, this, &OBSBasic::ToggleVolControlLayout,
- Qt::DirectConnection);
- QMenu popup;
- popup.addAction(&unhideAllAction);
- popup.addSeparator();
- popup.addAction(&toggleControlLayoutAction);
- popup.exec(QCursor::pos());
- }
|