context-bar-controls-devices.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "context-bar-controls.hpp"
  2. #include "context-bar-controls-devices.hpp"
  3. #include "window-basic-main.hpp"
  4. #include "ui_device-select-toolbar.h"
  5. #ifdef _WIN32
  6. #define get_os_module(win, mac, linux) obs_get_module(win)
  7. #define get_os_text(mod, win, mac, linux) obs_module_get_locale_text(mod, win)
  8. #elif __APPLE__
  9. #define get_os_module(win, mac, linux) obs_get_module(mac)
  10. #define get_os_text(mod, win, mac, linux) obs_module_get_locale_text(mod, mac)
  11. #else
  12. #define get_os_module(win, mac, linux) obs_get_module(linux)
  13. #define get_os_text(mod, win, mac, linux) obs_module_get_locale_text(mod, linux)
  14. #endif
  15. /* ========================================================================= */
  16. DeviceToolbarPropertiesThread::~DeviceToolbarPropertiesThread()
  17. {
  18. obs_properties_destroy(props);
  19. }
  20. void DeviceToolbarPropertiesThread::run()
  21. {
  22. props = obs_source_properties(source);
  23. source = nullptr;
  24. QMetaObject::invokeMethod(this, "Ready");
  25. }
  26. void DeviceToolbarPropertiesThread::Ready()
  27. {
  28. OBSBasic *main = OBSBasic::Get();
  29. QLayoutItem *la = main->ui->emptySpace->layout()->itemAt(0);
  30. if (la) {
  31. DeviceCaptureToolbar *dct =
  32. qobject_cast<DeviceCaptureToolbar *>(la->widget());
  33. if (dct) {
  34. dct->SetProperties(props);
  35. props = nullptr;
  36. }
  37. }
  38. }
  39. /* ========================================================================= */
  40. DeviceCaptureToolbar::DeviceCaptureToolbar(QWidget *parent, OBSSource source)
  41. : QWidget(parent),
  42. weakSource(OBSGetWeakRef(source)),
  43. ui(new Ui_DeviceSelectToolbar)
  44. {
  45. ui->setupUi(this);
  46. #ifndef _WIN32
  47. delete ui->activateButton;
  48. ui->activateButton = nullptr;
  49. #endif
  50. setEnabled(false);
  51. obs_module_t *mod =
  52. get_os_module("win-dshow", "mac-avcapture", "linux-v4l2");
  53. const char *device_str = obs_module_get_locale_text(mod, "Device");
  54. ui->deviceLabel->setText(device_str);
  55. OBSBasic *main = OBSBasic::Get();
  56. if (!main->devicePropertiesThread ||
  57. !main->devicePropertiesThread->isRunning()) {
  58. main->devicePropertiesThread.reset(
  59. new DeviceToolbarPropertiesThread(source));
  60. main->devicePropertiesThread->start();
  61. }
  62. }
  63. DeviceCaptureToolbar::~DeviceCaptureToolbar()
  64. {
  65. delete ui;
  66. obs_properties_destroy(props);
  67. }
  68. void DeviceCaptureToolbar::UpdateActivateButtonName()
  69. {
  70. obs_property_t *p = obs_properties_get(props, "activate");
  71. ui->activateButton->setText(obs_property_description(p));
  72. }
  73. extern void UpdateSourceComboToolbarProperties(QComboBox *combo,
  74. OBSSource source,
  75. obs_properties_t *props,
  76. const char *prop_name,
  77. bool is_int);
  78. extern void UpdateSourceComboToolbarValue(QComboBox *combo, OBSSource source,
  79. int idx, const char *prop_name,
  80. bool is_int);
  81. void DeviceCaptureToolbar::SetProperties(obs_properties_t *props_)
  82. {
  83. OBSSource source = OBSGetStrongRef(weakSource);
  84. if (!source) {
  85. obs_properties_destroy(props_);
  86. return;
  87. }
  88. #ifdef _WIN32
  89. prop_name = "video_device_id";
  90. #elif __APPLE__
  91. prop_name = "device";
  92. #else
  93. prop_name = "device_id";
  94. #endif
  95. props = props_;
  96. UpdateSourceComboToolbarProperties(ui->device, source, props, prop_name,
  97. false);
  98. #ifdef _WIN32
  99. UpdateActivateButtonName();
  100. #endif
  101. setEnabled(true);
  102. }
  103. void DeviceCaptureToolbar::on_device_currentIndexChanged(int idx)
  104. {
  105. OBSSource source = OBSGetStrongRef(weakSource);
  106. if (idx == -1 || !source) {
  107. return;
  108. }
  109. UpdateSourceComboToolbarValue(ui->device, source, idx, prop_name,
  110. false);
  111. }
  112. void DeviceCaptureToolbar::on_activateButton_clicked()
  113. {
  114. OBSSource source = OBSGetStrongRef(weakSource);
  115. if (!source) {
  116. return;
  117. }
  118. obs_property_t *p = obs_properties_get(props, "activate");
  119. if (!p) {
  120. return;
  121. }
  122. obs_property_button_clicked(p, source.Get());
  123. #ifdef _WIN32
  124. UpdateActivateButtonName();
  125. #endif
  126. }