window-basic-adv-audio.cpp 5.1 KB

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