window-basic-adv-audio.cpp 5.6 KB

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