window-basic-adv-audio.cpp 5.1 KB

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