Compare commits
	
		
			12 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | f2de080e1b | ||
|  | f4a60f281d | ||
|  | d693535d53 | ||
|  | e41af697f7 | ||
|  | b0a8815bb8 | ||
|  | 150fd4364e | ||
|  | a0a2924796 | ||
|  | 3c48621427 | ||
|  | 9faabe1f3e | ||
|  | 68473d04d8 | ||
|  | 7c8f72b8d8 | ||
|  | 27cdd9f9a5 | 
| @@ -4,6 +4,7 @@ | |||||||
|   <metadata_license>CC0-1.0</metadata_license> |   <metadata_license>CC0-1.0</metadata_license> | ||||||
|   <project_license>GPL-3.0+</project_license> |   <project_license>GPL-3.0+</project_license> | ||||||
|   <name>discord-screenaudio</name> |   <name>discord-screenaudio</name> | ||||||
|  |   <developer_name>Malte Jürgens</developer_name> | ||||||
|   <releases> |   <releases> | ||||||
|     <release version="${DISCORD_SCEENAUDIO_VERSION_FULL}" timestamp="${TIMESTAMP}" /> |     <release version="${DISCORD_SCEENAUDIO_VERSION_FULL}" timestamp="${TIMESTAMP}" /> | ||||||
|   </releases> |   </releases> | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ const getAudioDevice = async (nameOfAudioDevice) => { | |||||||
|   return audioDevice; |   return audioDevice; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| function setGetDisplayMedia(overrideArgs = undefined) { | function setGetDisplayMedia(video = true, overrideArgs = undefined) { | ||||||
|   const getDisplayMedia = async (...args) => { |   const getDisplayMedia = async (...args) => { | ||||||
|     var id; |     var id; | ||||||
|     try { |     try { | ||||||
| @@ -63,6 +63,7 @@ function setGetDisplayMedia(overrideArgs = undefined) { | |||||||
|         : args || [{ video: true, audio: true }]) |         : args || [{ video: true, audio: true }]) | ||||||
|     ); |     ); | ||||||
|     gdm.addTrack(track); |     gdm.addTrack(track); | ||||||
|  |     if (!video) for (const track of gdm.getVideoTracks()) track.enabled = false; | ||||||
|     return gdm; |     return gdm; | ||||||
|   }; |   }; | ||||||
|   navigator.mediaDevices.getDisplayMedia = getDisplayMedia; |   navigator.mediaDevices.getDisplayMedia = getDisplayMedia; | ||||||
| @@ -111,9 +112,16 @@ setInterval(() => { | |||||||
|  |  | ||||||
|       const initialDisplay = el.style.display; |       const initialDisplay = el.style.display; | ||||||
|  |  | ||||||
|       window.discordScreenaudioStartStream = (width, height, frameRate) => { |       window.discordScreenaudioStartStream = ( | ||||||
|         window.discordScreenaudioResolutionString = `${height}p ${frameRate}FPS`; |         video, | ||||||
|         setGetDisplayMedia({ |         width, | ||||||
|  |         height, | ||||||
|  |         frameRate | ||||||
|  |       ) => { | ||||||
|  |         window.discordScreenaudioResolutionString = video | ||||||
|  |           ? `${height}p ${frameRate}FPS` | ||||||
|  |           : "Audio Only"; | ||||||
|  |         setGetDisplayMedia(video, { | ||||||
|           audio: true, |           audio: true, | ||||||
|           video: { width, height, frameRate }, |           video: { width, height, frameRate }, | ||||||
|         }); |         }); | ||||||
| @@ -183,14 +191,28 @@ setInterval(() => { | |||||||
|     el.appendChild(div); |     el.appendChild(div); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   const muteBtn = document.getElementsByClassName( |   const buttonContainer = | ||||||
|  |     document.getElementsByClassName("container-YkUktl")[0]; | ||||||
|  |   if (!buttonContainer) { | ||||||
|  |     console.log( | ||||||
|  |       "dsa: Cannot locate Mute/Deafen/Settings button container, please report this on GitHub" | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   const muteBtn = buttonContainer | ||||||
|  |     ? buttonContainer.getElementsByClassName( | ||||||
|         "button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F" |         "button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F" | ||||||
|   )[0]; |       )[0] | ||||||
|   window.discordScreenaudioToggleMute = () => muteBtn.click(); |     : null; | ||||||
|   const deafenBtn = document.getElementsByClassName( |   window.discordScreenaudioToggleMute = () => muteBtn && muteBtn.click(); | ||||||
|  |  | ||||||
|  |   const deafenBtn = buttonContainer | ||||||
|  |     ? buttonContainer.getElementsByClassName( | ||||||
|         "button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F" |         "button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F" | ||||||
|   )[1]; |       )[1] | ||||||
|   window.discordScreenaudioToggleDeafen = () => deafenBtn.click(); |     : null; | ||||||
|  |  | ||||||
|  |   window.discordScreenaudioToggleDeafen = () => deafenBtn && deafenBtn.click(); | ||||||
|  |  | ||||||
|   if (window.discordScreenaudioResolutionString) { |   if (window.discordScreenaudioResolutionString) { | ||||||
|     for (const el of document.getElementsByClassName( |     for (const el of document.getElementsByClassName( | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ | |||||||
| #include <QDesktopServices> | #include <QDesktopServices> | ||||||
| #include <QFile> | #include <QFile> | ||||||
| #include <QMessageBox> | #include <QMessageBox> | ||||||
|  | #include <QNetworkReply> | ||||||
| #include <QTimer> | #include <QTimer> | ||||||
| #include <QWebChannel> | #include <QWebChannel> | ||||||
| #include <QWebEngineScript> | #include <QWebEngineScript> | ||||||
| @@ -128,14 +129,13 @@ void DiscordPage::injectScriptText(QString name, QString content) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void DiscordPage::injectScriptFile(QString name, QString source) { | void DiscordPage::injectScriptFile(QString name, QString source) { | ||||||
|   QFile userscript(source); |   QFile file(source); | ||||||
|  |  | ||||||
|   if (!userscript.open(QIODevice::ReadOnly)) { |   if (!file.open(QIODevice::ReadOnly)) { | ||||||
|     qFatal("Failed to load %s with error: %s", source.toLatin1().constData(), |     qFatal("Failed to load %s with error: %s", source.toLatin1().constData(), | ||||||
|            userscript.errorString().toLatin1().constData()); |            file.errorString().toLatin1().constData()); | ||||||
|   } else { |   } else { | ||||||
|     QByteArray userscriptJs = userscript.readAll(); |     injectScriptText(name, file.readAll()); | ||||||
|     injectScriptText(name, userscriptJs); |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -186,11 +186,9 @@ void DiscordPage::stopVirtmic() { | |||||||
| } | } | ||||||
|  |  | ||||||
| void DiscordPage::startVirtmic(QString target) { | void DiscordPage::startVirtmic(QString target) { | ||||||
|   if (target != "None") { |  | ||||||
|   qDebug(virtmicLog) << "Starting Virtmic with target" << target; |   qDebug(virtmicLog) << "Starting Virtmic with target" << target; | ||||||
|   m_virtmicProcess.start(QApplication::arguments()[0], {"--virtmic", target}); |   m_virtmicProcess.start(QApplication::arguments()[0], {"--virtmic", target}); | ||||||
| } | } | ||||||
| } |  | ||||||
|  |  | ||||||
| void DiscordPage::javaScriptConsoleMessage( | void DiscordPage::javaScriptConsoleMessage( | ||||||
|     QWebEnginePage::JavaScriptConsoleMessageLevel level, const QString &message, |     QWebEnginePage::JavaScriptConsoleMessageLevel level, const QString &message, | ||||||
| @@ -230,16 +228,18 @@ void DiscordPage::javaScriptConsoleMessage( | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| void DiscordPage::startStream(QString target, uint width, uint height, | void DiscordPage::startStream(bool video, bool audio, uint width, uint height, | ||||||
|                               uint frameRate) { |                               uint frameRate, QString target) { | ||||||
|   stopVirtmic(); |   stopVirtmic(); | ||||||
|   startVirtmic(target); |   startVirtmic(audio ? target : "[None]"); | ||||||
|   // Wait a bit for the virtmic to start |   // Wait a bit for the virtmic to start | ||||||
|   QTimer::singleShot(target == "None" ? 0 : 200, [=]() { |   QTimer::singleShot(200, [=]() { | ||||||
|     runJavaScript(QString("window.discordScreenaudioStartStream(%1, %2, %3);") |     runJavaScript( | ||||||
|                       .arg(width) |         QString("window.discordScreenaudioStartStream(%1, %2, %3, %4);") | ||||||
|                       .arg(height) |             .arg(video) | ||||||
|                       .arg(frameRate)); |             .arg(video ? width : 32) | ||||||
|  |             .arg(video ? height : 16) | ||||||
|  |             .arg(video ? frameRate : 1)); | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -37,8 +37,8 @@ private: | |||||||
|   javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level, |   javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level, | ||||||
|                            const QString &message, int lineNumber, |                            const QString &message, int lineNumber, | ||||||
|                            const QString &sourceID) override; |                            const QString &sourceID) override; | ||||||
|   void injectScriptText(QString name, QString source); |   void injectScriptText(QString name, QString content); | ||||||
|   void injectScriptFile(QString name, QString content); |   void injectScriptFile(QString name, QString source); | ||||||
|   void stopVirtmic(); |   void stopVirtmic(); | ||||||
|   void startVirtmic(QString target); |   void startVirtmic(QString target); | ||||||
|   void toggleMute(); |   void toggleMute(); | ||||||
| @@ -47,7 +47,8 @@ private: | |||||||
| private Q_SLOTS: | private Q_SLOTS: | ||||||
|   void featurePermissionRequested(const QUrl &securityOrigin, |   void featurePermissionRequested(const QUrl &securityOrigin, | ||||||
|                                   QWebEnginePage::Feature feature); |                                   QWebEnginePage::Feature feature); | ||||||
|   void startStream(QString target, uint width, uint height, uint frameRate); |   void startStream(bool video, bool audio, uint width, uint height, | ||||||
|  |                    uint frameRate, QString target); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Will immediately get destroyed again but is needed for navigation to | // Will immediately get destroyed again but is needed for navigation to | ||||||
|   | |||||||
| @@ -30,6 +30,9 @@ int main(int argc, char *argv[]) { | |||||||
|   QCommandLineOption degubOption("remote-debugging", |   QCommandLineOption degubOption("remote-debugging", | ||||||
|                                  "Open Chromium Remote Debugging on port 9222"); |                                  "Open Chromium Remote Debugging on port 9222"); | ||||||
|   parser.addOption(degubOption); |   parser.addOption(degubOption); | ||||||
|  |   QCommandLineOption notifySendOption( | ||||||
|  |       "notify-send", "Use notify-send instead of QT/KF5 notifications"); | ||||||
|  |   parser.addOption(notifySendOption); | ||||||
|  |  | ||||||
|   parser.process(app); |   parser.process(app); | ||||||
|  |  | ||||||
| @@ -46,7 +49,7 @@ int main(int argc, char *argv[]) { | |||||||
|             "--remote-debugging-port=9222 " + |             "--remote-debugging-port=9222 " + | ||||||
|                 qgetenv("QTWEBENGINE_CHROMIUM_FLAGS")); |                 qgetenv("QTWEBENGINE_CHROMIUM_FLAGS")); | ||||||
|  |  | ||||||
|   MainWindow w; |   MainWindow w(parser.isSet(notifySendOption)); | ||||||
|   w.show(); |   w.show(); | ||||||
|  |  | ||||||
|   return app.exec(); |   return app.exec(); | ||||||
|   | |||||||
| @@ -24,9 +24,11 @@ | |||||||
|  |  | ||||||
| MainWindow *MainWindow::m_instance = nullptr; | MainWindow *MainWindow::m_instance = nullptr; | ||||||
|  |  | ||||||
| MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { | MainWindow::MainWindow(bool useNotifySend, QWidget *parent) | ||||||
|  |     : QMainWindow(parent) { | ||||||
|   assert(MainWindow::m_instance == nullptr); |   assert(MainWindow::m_instance == nullptr); | ||||||
|   MainWindow::m_instance = this; |   MainWindow::m_instance = this; | ||||||
|  |   m_useNotifySend = useNotifySend; | ||||||
|   setupWebView(); |   setupWebView(); | ||||||
|   resize(1000, 700); |   resize(1000, 700); | ||||||
|   showMaximized(); |   showMaximized(); | ||||||
| @@ -40,13 +42,26 @@ void MainWindow::setupWebView() { | |||||||
|   m_webView = new QWebEngineView(this); |   m_webView = new QWebEngineView(this); | ||||||
|   m_webView->setPage(page); |   m_webView->setPage(page); | ||||||
|  |  | ||||||
| #ifdef KNOTIFICATIONS |   if (m_useKF5Notifications || m_useNotifySend) | ||||||
|     QWebEngineProfile::defaultProfile()->setNotificationPresenter( |     QWebEngineProfile::defaultProfile()->setNotificationPresenter( | ||||||
|         [&](std::unique_ptr<QWebEngineNotification> notificationInfo) { |         [&](std::unique_ptr<QWebEngineNotification> notificationInfo) { | ||||||
|         KNotification *notification = new KNotification("discordNotification"); |           if (m_useNotifySend) { | ||||||
|  |             auto title = notificationInfo->title(); | ||||||
|  |             auto message = notificationInfo->message(); | ||||||
|  |             auto image_path = | ||||||
|  |                 QString("/tmp/discord-screenaudio-%1.png").arg(title); | ||||||
|  |             notificationInfo->icon().save(image_path); | ||||||
|  |             QProcess::execute("notify-send", | ||||||
|  |                               {"--icon", image_path, "--app-name", | ||||||
|  |                                "discord-screenaudio", title, message}); | ||||||
|  |           } else if (m_useKF5Notifications) { | ||||||
|  | #ifdef KNOTIFICATIONS | ||||||
|  |             KNotification *notification = | ||||||
|  |                 new KNotification("discordNotification"); | ||||||
|             notification->setTitle(notificationInfo->title()); |             notification->setTitle(notificationInfo->title()); | ||||||
|             notification->setText(notificationInfo->message()); |             notification->setText(notificationInfo->message()); | ||||||
|         notification->setPixmap(QPixmap::fromImage(notificationInfo->icon())); |             notification->setPixmap( | ||||||
|  |                 QPixmap::fromImage(notificationInfo->icon())); | ||||||
|             notification->setDefaultAction("View"); |             notification->setDefaultAction("View"); | ||||||
|             connect(notification, &KNotification::defaultActivated, |             connect(notification, &KNotification::defaultActivated, | ||||||
|                     [&, notificationInfo = std::move(notificationInfo)]() { |                     [&, notificationInfo = std::move(notificationInfo)]() { | ||||||
| @@ -54,8 +69,9 @@ void MainWindow::setupWebView() { | |||||||
|                       activateWindow(); |                       activateWindow(); | ||||||
|                     }); |                     }); | ||||||
|             notification->sendEvent(); |             notification->sendEvent(); | ||||||
|       }); |  | ||||||
| #endif | #endif | ||||||
|  |           } | ||||||
|  |         }); | ||||||
|  |  | ||||||
|   setCentralWidget(m_webView); |   setCentralWidget(m_webView); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ class MainWindow : public QMainWindow { | |||||||
|   Q_OBJECT |   Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   explicit MainWindow(QWidget *parent = nullptr); |   explicit MainWindow(bool useNotifySend = false, QWidget *parent = nullptr); | ||||||
|   static MainWindow *instance(); |   static MainWindow *instance(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
| @@ -25,6 +25,12 @@ private: | |||||||
|   void closeEvent(QCloseEvent *event) override; |   void closeEvent(QCloseEvent *event) override; | ||||||
|   bool m_wasMaximized; |   bool m_wasMaximized; | ||||||
|   static MainWindow *m_instance; |   static MainWindow *m_instance; | ||||||
|  |   bool m_useNotifySend; | ||||||
|  | #ifdef KNOTIFICATIONS | ||||||
|  |   bool m_useKF5Notifications = true; | ||||||
|  | #else | ||||||
|  |   bool m_useKF5Notifications = false; | ||||||
|  | #endif | ||||||
|  |  | ||||||
| private Q_SLOTS: | private Q_SLOTS: | ||||||
|   void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest); |   void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest); | ||||||
|   | |||||||
| @@ -12,53 +12,77 @@ | |||||||
| StreamDialog::StreamDialog() : QWidget() { | StreamDialog::StreamDialog() : QWidget() { | ||||||
|   setAttribute(Qt::WA_QuitOnClose, false); |   setAttribute(Qt::WA_QuitOnClose, false); | ||||||
|  |  | ||||||
|  |   { | ||||||
|     auto layout = new QVBoxLayout(this); |     auto layout = new QVBoxLayout(this); | ||||||
|     layout->setSizeConstraint(QLayout::SetFixedSize); |     layout->setSizeConstraint(QLayout::SetFixedSize); | ||||||
|  |  | ||||||
|   auto targetLabel = new QLabel(this); |     m_videoGroupBox = new QGroupBox(this); | ||||||
|   targetLabel->setText("Which app do you want to stream sound from?"); |     m_videoGroupBox->setTitle("Video"); | ||||||
|   layout->addWidget(targetLabel); |     m_videoGroupBox->setCheckable(true); | ||||||
|  |     layout->addWidget(m_videoGroupBox); | ||||||
|  |  | ||||||
|   auto targetHBox = new QHBoxLayout(this); |     { | ||||||
|   layout->addLayout(targetHBox); |       auto videoLayout = new QVBoxLayout(this); | ||||||
|  |       m_videoGroupBox->setLayout(videoLayout); | ||||||
|  |  | ||||||
|  |       auto resolutionLabel = new QLabel(this); | ||||||
|  |       resolutionLabel->setText("Resolution"); | ||||||
|  |       videoLayout->addWidget(resolutionLabel); | ||||||
|  |  | ||||||
|  |       m_resolutionComboBox = new QComboBox(this); | ||||||
|  |       m_resolutionComboBox->addItem("2160p", "3840x2160"); | ||||||
|  |       m_resolutionComboBox->addItem("1440p", "2560x1440"); | ||||||
|  |       m_resolutionComboBox->addItem("1080p", "1920x1080"); | ||||||
|  |       m_resolutionComboBox->addItem("720p", "1280x720"); | ||||||
|  |       m_resolutionComboBox->addItem("480p", "854x480"); | ||||||
|  |       m_resolutionComboBox->addItem("360p", "640x360"); | ||||||
|  |       m_resolutionComboBox->addItem("240p", "426x240"); | ||||||
|  |       m_resolutionComboBox->setCurrentText("720p"); | ||||||
|  |       videoLayout->addWidget(m_resolutionComboBox); | ||||||
|  |  | ||||||
|  |       auto framerateLabel = new QLabel(this); | ||||||
|  |       framerateLabel->setText("Framerate"); | ||||||
|  |       videoLayout->addWidget(framerateLabel); | ||||||
|  |  | ||||||
|  |       m_framerateComboBox = new QComboBox(this); | ||||||
|  |       m_framerateComboBox->addItem("144 FPS", 144); | ||||||
|  |       m_framerateComboBox->addItem("60 FPS", 60); | ||||||
|  |       m_framerateComboBox->addItem("30 FPS", 30); | ||||||
|  |       m_framerateComboBox->addItem("15 FPS", 15); | ||||||
|  |       m_framerateComboBox->addItem("5 FPS", 5); | ||||||
|  |       m_framerateComboBox->setCurrentText("30 FPS"); | ||||||
|  |       videoLayout->addWidget(m_framerateComboBox); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     m_audioGroupBox = new QGroupBox(this); | ||||||
|  |     m_audioGroupBox->setCheckable(true); | ||||||
|  |     m_audioGroupBox->setTitle("Audio"); | ||||||
|  |     layout->addWidget(m_audioGroupBox); | ||||||
|  |  | ||||||
|  |     { | ||||||
|  |       auto audioLayout = new QVBoxLayout(this); | ||||||
|  |       m_audioGroupBox->setLayout(audioLayout); | ||||||
|  |  | ||||||
|  |       auto targetLabel = new QLabel(this); | ||||||
|  |       targetLabel->setText("Audio Source"); | ||||||
|  |       audioLayout->addWidget(targetLabel); | ||||||
|  |  | ||||||
|  |       { | ||||||
|  |         auto targetLayout = new QHBoxLayout(this); | ||||||
|  |         audioLayout->addLayout(targetLayout); | ||||||
|  |  | ||||||
|         m_targetComboBox = new QComboBox(this); |         m_targetComboBox = new QComboBox(this); | ||||||
|         updateTargets(); |         updateTargets(); | ||||||
|   targetHBox->addWidget(m_targetComboBox); |         targetLayout->addWidget(m_targetComboBox); | ||||||
|  |  | ||||||
|         auto refreshTargetsButton = new QPushButton(this); |         auto refreshTargetsButton = new QPushButton(this); | ||||||
|         refreshTargetsButton->setFixedSize(30, 30); |         refreshTargetsButton->setFixedSize(30, 30); | ||||||
|         refreshTargetsButton->setIcon(QIcon::fromTheme("view-refresh")); |         refreshTargetsButton->setIcon(QIcon::fromTheme("view-refresh")); | ||||||
|         connect(refreshTargetsButton, &QPushButton::clicked, this, |         connect(refreshTargetsButton, &QPushButton::clicked, this, | ||||||
|                 &StreamDialog::updateTargets); |                 &StreamDialog::updateTargets); | ||||||
|   targetHBox->addWidget(refreshTargetsButton); |         targetLayout->addWidget(refreshTargetsButton); | ||||||
|  |       } | ||||||
|   auto qualityLabel = new QLabel(this); |     } | ||||||
|   qualityLabel->setText("Stream Quality"); |  | ||||||
|   layout->addWidget(qualityLabel); |  | ||||||
|  |  | ||||||
|   auto qualityHBox = new QHBoxLayout(this); |  | ||||||
|   layout->addLayout(qualityHBox); |  | ||||||
|  |  | ||||||
|   m_qualityResolutionComboBox = new QComboBox(this); |  | ||||||
|   m_qualityResolutionComboBox->addItem("2160p", "3840x2160"); |  | ||||||
|   m_qualityResolutionComboBox->addItem("1440p", "2560x1440"); |  | ||||||
|   m_qualityResolutionComboBox->addItem("1080p", "1920x1080"); |  | ||||||
|   m_qualityResolutionComboBox->addItem("720p", "1280x720"); |  | ||||||
|   m_qualityResolutionComboBox->addItem("480p", "854x480"); |  | ||||||
|   m_qualityResolutionComboBox->addItem("360p", "640x360"); |  | ||||||
|   m_qualityResolutionComboBox->addItem("240p", "426x240"); |  | ||||||
|   m_qualityResolutionComboBox->setCurrentText("720p"); |  | ||||||
|   qualityHBox->addWidget(m_qualityResolutionComboBox); |  | ||||||
|  |  | ||||||
|   m_qualityFPSComboBox = new QComboBox(this); |  | ||||||
|   m_qualityFPSComboBox->addItem("144 FPS", 144); |  | ||||||
|   m_qualityFPSComboBox->addItem("60 FPS", 60); |  | ||||||
|   m_qualityFPSComboBox->addItem("30 FPS", 30); |  | ||||||
|   m_qualityFPSComboBox->addItem("15 FPS", 15); |  | ||||||
|   m_qualityFPSComboBox->addItem("5 FPS", 5); |  | ||||||
|   m_qualityFPSComboBox->setCurrentText("30 FPS"); |  | ||||||
|   qualityHBox->addWidget(m_qualityFPSComboBox); |  | ||||||
|  |  | ||||||
|     auto button = new QPushButton(this); |     auto button = new QPushButton(this); | ||||||
|     button->setText("Start Stream"); |     button->setText("Start Stream"); | ||||||
| @@ -66,16 +90,18 @@ StreamDialog::StreamDialog() : QWidget() { | |||||||
|     layout->addWidget(button, Qt::AlignRight | Qt::AlignBottom); |     layout->addWidget(button, Qt::AlignRight | Qt::AlignBottom); | ||||||
|  |  | ||||||
|     setLayout(layout); |     setLayout(layout); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   setWindowTitle("discord-screenaudio Stream Dialog"); |   setWindowTitle("discord-screenaudio Stream Dialog"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void StreamDialog::startStream() { | void StreamDialog::startStream() { | ||||||
|   auto resolution = |   auto resolution = m_resolutionComboBox->currentData().toString().split('x'); | ||||||
|       m_qualityResolutionComboBox->currentData().toString().split('x'); |   emit requestedStreamStart(m_videoGroupBox->isChecked(), | ||||||
|   emit requestedStreamStart(m_targetComboBox->currentText(), |                             m_audioGroupBox->isChecked(), | ||||||
|                             resolution[0].toUInt(), resolution[1].toUInt(), |                             resolution[0].toUInt(), resolution[1].toUInt(), | ||||||
|                             m_qualityFPSComboBox->currentData().toUInt()); |                             m_framerateComboBox->currentData().toUInt(), | ||||||
|  |                             m_targetComboBox->currentText()); | ||||||
|   setHidden(true); |   setHidden(true); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -83,7 +109,6 @@ void StreamDialog::updateTargets() { | |||||||
|   auto lastTarget = m_targetComboBox->currentText(); |   auto lastTarget = m_targetComboBox->currentText(); | ||||||
|  |  | ||||||
|   m_targetComboBox->clear(); |   m_targetComboBox->clear(); | ||||||
|   m_targetComboBox->addItem("[None]"); |  | ||||||
|   m_targetComboBox->addItem("[All Desktop Audio]"); |   m_targetComboBox->addItem("[All Desktop Audio]"); | ||||||
|   for (auto target : Virtmic::getTargets()) { |   for (auto target : Virtmic::getTargets()) { | ||||||
|     m_targetComboBox->addItem(target); |     m_targetComboBox->addItem(target); | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ | |||||||
|  |  | ||||||
| #include <QComboBox> | #include <QComboBox> | ||||||
| #include <QDialog> | #include <QDialog> | ||||||
|  | #include <QGroupBox> | ||||||
| #include <QWidget> | #include <QWidget> | ||||||
|  |  | ||||||
| class StreamDialog : public QWidget { | class StreamDialog : public QWidget { | ||||||
| @@ -12,12 +13,14 @@ public: | |||||||
|  |  | ||||||
| private: | private: | ||||||
|   QComboBox *m_targetComboBox; |   QComboBox *m_targetComboBox; | ||||||
|   QComboBox *m_qualityResolutionComboBox; |   QComboBox *m_resolutionComboBox; | ||||||
|   QComboBox *m_qualityFPSComboBox; |   QComboBox *m_framerateComboBox; | ||||||
|  |   QGroupBox *m_videoGroupBox; | ||||||
|  |   QGroupBox *m_audioGroupBox; | ||||||
|  |  | ||||||
| Q_SIGNALS: | Q_SIGNALS: | ||||||
|   void requestedStreamStart(QString target, uint width, uint height, |   void requestedStreamStart(bool video, bool audio, uint width, uint height, | ||||||
|                             uint frameRate); |                             uint frameRate, QString target); | ||||||
|  |  | ||||||
| public Q_SLOTS: | public Q_SLOTS: | ||||||
|   void updateTargets(); |   void updateTargets(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user