window-basic-adv-audio.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. sourceAddedSignal(obs_get_signal_handler(), "source_activate",
  13. OBSSourceAdded, this),
  14. sourceRemovedSignal(obs_get_signal_handler(), "source_deactivate",
  15. OBSSourceRemoved, this),
  16. showInactive(false)
  17. {
  18. ui->setupUi(this);
  19. VolumeType volType = (VolumeType)config_get_int(
  20. GetGlobalConfig(), "BasicWindow", "AdvAudioVolumeType");
  21. if (volType == VolumeType::Percent)
  22. ui->usePercent->setChecked(true);
  23. installEventFilter(CreateShortcutFilter());
  24. /* enum user scene/sources */
  25. obs_enum_sources(EnumSources, this);
  26. setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  27. setAttribute(Qt::WA_DeleteOnClose, true);
  28. }
  29. OBSBasicAdvAudio::~OBSBasicAdvAudio()
  30. {
  31. OBSBasic *main = reinterpret_cast<OBSBasic *>(parent());
  32. for (size_t i = 0; i < controls.size(); ++i)
  33. delete controls[i];
  34. main->SaveProject();
  35. }
  36. bool OBSBasicAdvAudio::EnumSources(void *param, obs_source_t *source)
  37. {
  38. OBSBasicAdvAudio *dialog = reinterpret_cast<OBSBasicAdvAudio *>(param);
  39. uint32_t flags = obs_source_get_output_flags(source);
  40. if ((flags & OBS_SOURCE_AUDIO) != 0 &&
  41. (dialog->showInactive || obs_source_active(source)))
  42. dialog->AddAudioSource(source);
  43. return true;
  44. }
  45. void OBSBasicAdvAudio::OBSSourceAdded(void *param, calldata_t *calldata)
  46. {
  47. OBSSource source((obs_source_t *)calldata_ptr(calldata, "source"));
  48. QMetaObject::invokeMethod(reinterpret_cast<OBSBasicAdvAudio *>(param),
  49. "SourceAdded", Q_ARG(OBSSource, source));
  50. }
  51. void OBSBasicAdvAudio::OBSSourceRemoved(void *param, calldata_t *calldata)
  52. {
  53. OBSSource source((obs_source_t *)calldata_ptr(calldata, "source"));
  54. QMetaObject::invokeMethod(reinterpret_cast<OBSBasicAdvAudio *>(param),
  55. "SourceRemoved", 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(GetGlobalConfig(), "BasicWindow", "AdvAudioVolumeType",
  99. (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. sourceAddedSignal.Disconnect();
  111. sourceRemovedSignal.Disconnect();
  112. if (showInactive) {
  113. sourceAddedSignal.Connect(obs_get_signal_handler(),
  114. "source_create", OBSSourceAdded,
  115. this);
  116. sourceRemovedSignal.Connect(obs_get_signal_handler(),
  117. "source_remove", OBSSourceRemoved,
  118. this);
  119. obs_enum_sources(EnumSources, this);
  120. SetIconsVisible(showVisible);
  121. } else {
  122. sourceAddedSignal.Connect(obs_get_signal_handler(),
  123. "source_activate", OBSSourceAdded,
  124. this);
  125. sourceRemovedSignal.Connect(obs_get_signal_handler(),
  126. "source_deactivate",
  127. OBSSourceRemoved, this);
  128. for (size_t i = 0; i < controls.size(); i++) {
  129. const auto source = controls[i]->GetSource();
  130. if (!obs_source_active(source)) {
  131. delete controls[i];
  132. controls.erase(controls.begin() + i);
  133. i--;
  134. }
  135. }
  136. }
  137. }
  138. void OBSBasicAdvAudio::SetIconsVisible(bool visible)
  139. {
  140. showVisible = visible;
  141. QLayoutItem *item = ui->mainLayout->itemAtPosition(0, 0);
  142. QLabel *headerLabel = qobject_cast<QLabel *>(item->widget());
  143. visible ? headerLabel->show() : headerLabel->hide();
  144. for (size_t i = 0; i < controls.size(); i++) {
  145. controls[i]->SetIconVisible(visible);
  146. }
  147. }