OBSBasicAdvAudio.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "OBSBasicAdvAudio.hpp"
  2. #include "ui_OBSAdvAudio.h"
  3. #include <components/OBSAdvAudioCtrl.hpp>
  4. #include <utility/item-widget-helpers.hpp>
  5. #include <widgets/OBSBasic.hpp>
  6. #include "moc_OBSBasicAdvAudio.cpp"
  7. OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent) : QDialog(parent), ui(new Ui::OBSAdvAudio), showInactive(false)
  8. {
  9. ui->setupUi(this);
  10. signal_handler_t *sh = obs_get_signal_handler();
  11. sigs.emplace_back(sh, "source_audio_activate", OBSSourceAdded, this);
  12. sigs.emplace_back(sh, "source_audio_deactivate", OBSSourceRemoved, this);
  13. sigs.emplace_back(sh, "source_activate", OBSSourceActivated, this);
  14. sigs.emplace_back(sh, "source_deactivate", OBSSourceRemoved, this);
  15. VolumeType volType = (VolumeType)config_get_int(App()->GetUserConfig(), "BasicWindow", "AdvAudioVolumeType");
  16. if (volType == VolumeType::Percent)
  17. ui->usePercent->setChecked(true);
  18. installEventFilter(CreateShortcutFilter());
  19. /* enum user scene/sources */
  20. obs_enum_sources(EnumSources, this);
  21. setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  22. setAttribute(Qt::WA_DeleteOnClose, true);
  23. }
  24. OBSBasicAdvAudio::~OBSBasicAdvAudio()
  25. {
  26. OBSBasic *main = OBSBasic::Get();
  27. for (size_t i = 0; i < controls.size(); ++i)
  28. delete controls[i];
  29. main->SaveProject();
  30. }
  31. bool OBSBasicAdvAudio::EnumSources(void *param, obs_source_t *source)
  32. {
  33. OBSBasicAdvAudio *dialog = static_cast<OBSBasicAdvAudio *>(param);
  34. uint32_t flags = obs_source_get_output_flags(source);
  35. if ((flags & OBS_SOURCE_AUDIO) != 0 &&
  36. (dialog->showInactive || (obs_source_active(source) && obs_source_audio_active(source))))
  37. dialog->AddAudioSource(source);
  38. return true;
  39. }
  40. void OBSBasicAdvAudio::OBSSourceAdded(void *param, calldata_t *calldata)
  41. {
  42. OBSSource source((obs_source_t *)calldata_ptr(calldata, "source"));
  43. QMetaObject::invokeMethod(static_cast<OBSBasicAdvAudio *>(param), "SourceAdded", Q_ARG(OBSSource, source));
  44. }
  45. void OBSBasicAdvAudio::OBSSourceRemoved(void *param, calldata_t *calldata)
  46. {
  47. OBSSource source((obs_source_t *)calldata_ptr(calldata, "source"));
  48. QMetaObject::invokeMethod(static_cast<OBSBasicAdvAudio *>(param), "SourceRemoved", Q_ARG(OBSSource, source));
  49. }
  50. void OBSBasicAdvAudio::OBSSourceActivated(void *param, calldata_t *calldata)
  51. {
  52. OBSSource source((obs_source_t *)calldata_ptr(calldata, "source"));
  53. if (obs_source_audio_active(source))
  54. QMetaObject::invokeMethod(static_cast<OBSBasicAdvAudio *>(param), "SourceAdded",
  55. Q_ARG(OBSSource, source));
  56. }
  57. inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
  58. {
  59. for (size_t i = 0; i < controls.size(); i++) {
  60. if (controls[i]->GetSource() == source)
  61. return;
  62. }
  63. OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(ui->mainLayout, source);
  64. InsertQObjectByName(controls, control);
  65. for (auto control : controls) {
  66. control->ShowAudioControl(ui->mainLayout);
  67. }
  68. }
  69. void OBSBasicAdvAudio::SourceAdded(OBSSource source)
  70. {
  71. uint32_t flags = obs_source_get_output_flags(source);
  72. if ((flags & OBS_SOURCE_AUDIO) == 0)
  73. return;
  74. AddAudioSource(source);
  75. }
  76. void OBSBasicAdvAudio::SourceRemoved(OBSSource source)
  77. {
  78. uint32_t flags = obs_source_get_output_flags(source);
  79. if ((flags & OBS_SOURCE_AUDIO) == 0)
  80. return;
  81. for (size_t i = 0; i < controls.size(); i++) {
  82. if (controls[i]->GetSource() == source) {
  83. delete controls[i];
  84. controls.erase(controls.begin() + i);
  85. break;
  86. }
  87. }
  88. }
  89. void OBSBasicAdvAudio::on_usePercent_toggled(bool checked)
  90. {
  91. VolumeType type;
  92. if (checked)
  93. type = VolumeType::Percent;
  94. else
  95. type = VolumeType::dB;
  96. for (size_t i = 0; i < controls.size(); i++)
  97. controls[i]->SetVolumeWidget(type);
  98. config_set_int(App()->GetUserConfig(), "BasicWindow", "AdvAudioVolumeType", (int)type);
  99. }
  100. void OBSBasicAdvAudio::on_activeOnly_toggled(bool checked)
  101. {
  102. SetShowInactive(!checked);
  103. }
  104. void OBSBasicAdvAudio::SetShowInactive(bool show)
  105. {
  106. if (showInactive == show)
  107. return;
  108. showInactive = show;
  109. sigs.clear();
  110. signal_handler_t *sh = obs_get_signal_handler();
  111. if (showInactive) {
  112. sigs.emplace_back(sh, "source_create", OBSSourceAdded, this);
  113. sigs.emplace_back(sh, "source_remove", OBSSourceRemoved, this);
  114. obs_enum_sources(EnumSources, this);
  115. SetIconsVisible(showVisible);
  116. } else {
  117. sigs.emplace_back(sh, "source_audio_activate", OBSSourceAdded, this);
  118. sigs.emplace_back(sh, "source_audio_deactivate", OBSSourceRemoved, this);
  119. sigs.emplace_back(sh, "source_activate", OBSSourceActivated, this);
  120. sigs.emplace_back(sh, "source_deactivate", OBSSourceRemoved, this);
  121. for (size_t i = 0; i < controls.size(); i++) {
  122. const auto source = controls[i]->GetSource();
  123. if (!(obs_source_active(source) && obs_source_audio_active(source))) {
  124. delete controls[i];
  125. controls.erase(controls.begin() + i);
  126. i--;
  127. }
  128. }
  129. }
  130. }
  131. void OBSBasicAdvAudio::SetIconsVisible(bool visible)
  132. {
  133. showVisible = visible;
  134. QLayoutItem *item = ui->mainLayout->itemAtPosition(0, 0);
  135. QLabel *headerLabel = qobject_cast<QLabel *>(item->widget());
  136. visible ? headerLabel->show() : headerLabel->hide();
  137. for (size_t i = 0; i < controls.size(); i++) {
  138. controls[i]->SetIconVisible(visible);
  139. }
  140. }