1
0

OBSBasicAdvAudio.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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 = reinterpret_cast<OBSBasic *>(parent());
  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 = reinterpret_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(reinterpret_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(reinterpret_cast<OBSBasicAdvAudio *>(param), "SourceRemoved",
  49. Q_ARG(OBSSource, source));
  50. }
  51. void OBSBasicAdvAudio::OBSSourceActivated(void *param, calldata_t *calldata)
  52. {
  53. OBSSource source((obs_source_t *)calldata_ptr(calldata, "source"));
  54. if (obs_source_audio_active(source))
  55. QMetaObject::invokeMethod(reinterpret_cast<OBSBasicAdvAudio *>(param), "SourceAdded",
  56. Q_ARG(OBSSource, source));
  57. }
  58. inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
  59. {
  60. for (size_t i = 0; i < controls.size(); i++) {
  61. if (controls[i]->GetSource() == source)
  62. return;
  63. }
  64. OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(ui->mainLayout, source);
  65. InsertQObjectByName(controls, control);
  66. for (auto control : controls) {
  67. control->ShowAudioControl(ui->mainLayout);
  68. }
  69. }
  70. void OBSBasicAdvAudio::SourceAdded(OBSSource source)
  71. {
  72. uint32_t flags = obs_source_get_output_flags(source);
  73. if ((flags & OBS_SOURCE_AUDIO) == 0)
  74. return;
  75. AddAudioSource(source);
  76. }
  77. void OBSBasicAdvAudio::SourceRemoved(OBSSource source)
  78. {
  79. uint32_t flags = obs_source_get_output_flags(source);
  80. if ((flags & OBS_SOURCE_AUDIO) == 0)
  81. return;
  82. for (size_t i = 0; i < controls.size(); i++) {
  83. if (controls[i]->GetSource() == source) {
  84. delete controls[i];
  85. controls.erase(controls.begin() + i);
  86. break;
  87. }
  88. }
  89. }
  90. void OBSBasicAdvAudio::on_usePercent_toggled(bool checked)
  91. {
  92. VolumeType type;
  93. if (checked)
  94. type = VolumeType::Percent;
  95. else
  96. type = VolumeType::dB;
  97. for (size_t i = 0; i < controls.size(); i++)
  98. controls[i]->SetVolumeWidget(type);
  99. config_set_int(App()->GetUserConfig(), "BasicWindow", "AdvAudioVolumeType", (int)type);
  100. }
  101. void OBSBasicAdvAudio::on_activeOnly_toggled(bool checked)
  102. {
  103. SetShowInactive(!checked);
  104. }
  105. void OBSBasicAdvAudio::SetShowInactive(bool show)
  106. {
  107. if (showInactive == show)
  108. return;
  109. showInactive = show;
  110. sigs.clear();
  111. signal_handler_t *sh = obs_get_signal_handler();
  112. if (showInactive) {
  113. sigs.emplace_back(sh, "source_create", OBSSourceAdded, this);
  114. sigs.emplace_back(sh, "source_remove", OBSSourceRemoved, this);
  115. obs_enum_sources(EnumSources, this);
  116. SetIconsVisible(showVisible);
  117. } else {
  118. sigs.emplace_back(sh, "source_audio_activate", OBSSourceAdded, this);
  119. sigs.emplace_back(sh, "source_audio_deactivate", OBSSourceRemoved, this);
  120. sigs.emplace_back(sh, "source_activate", OBSSourceActivated, this);
  121. sigs.emplace_back(sh, "source_deactivate", OBSSourceRemoved, this);
  122. for (size_t i = 0; i < controls.size(); i++) {
  123. const auto source = controls[i]->GetSource();
  124. if (!(obs_source_active(source) && obs_source_audio_active(source))) {
  125. delete controls[i];
  126. controls.erase(controls.begin() + i);
  127. i--;
  128. }
  129. }
  130. }
  131. }
  132. void OBSBasicAdvAudio::SetIconsVisible(bool visible)
  133. {
  134. showVisible = visible;
  135. QLayoutItem *item = ui->mainLayout->itemAtPosition(0, 0);
  136. QLabel *headerLabel = qobject_cast<QLabel *>(item->widget());
  137. visible ? headerLabel->show() : headerLabel->hide();
  138. for (size_t i = 0; i < controls.size(); i++) {
  139. controls[i]->SetIconVisible(visible);
  140. }
  141. }