From f4a60f281df817967c8eec8d8b3996355b0f6fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20J=C3=BCrgens?= Date: Tue, 22 Nov 2022 16:35:47 +0100 Subject: [PATCH] reworked stream dialog --- assets/userscript.js | 45 ++++++++++------ src/discordpage.cpp | 24 ++++----- src/discordpage.h | 3 +- src/streamdialog.cpp | 123 ++++++++++++++++++++++++++----------------- src/streamdialog.h | 11 ++-- 5 files changed, 125 insertions(+), 81 deletions(-) diff --git a/assets/userscript.js b/assets/userscript.js index 88d33e8..8e22d3f 100644 --- a/assets/userscript.js +++ b/assets/userscript.js @@ -25,7 +25,7 @@ const getAudioDevice = async (nameOfAudioDevice) => { return audioDevice; }; -function setGetDisplayMedia(overrideArgs = undefined) { +function setGetDisplayMedia(video = true, overrideArgs = undefined) { const getDisplayMedia = async (...args) => { var id; try { @@ -63,6 +63,7 @@ function setGetDisplayMedia(overrideArgs = undefined) { : args || [{ video: true, audio: true }]) ); gdm.addTrack(track); + if (!video) for (const track of gdm.getVideoTracks()) track.enabled = false; return gdm; }; navigator.mediaDevices.getDisplayMedia = getDisplayMedia; @@ -111,9 +112,16 @@ setInterval(() => { const initialDisplay = el.style.display; - window.discordScreenaudioStartStream = (width, height, frameRate) => { - window.discordScreenaudioResolutionString = `${height}p ${frameRate}FPS`; - setGetDisplayMedia({ + window.discordScreenaudioStartStream = ( + video, + width, + height, + frameRate + ) => { + window.discordScreenaudioResolutionString = video + ? `${height}p ${frameRate}FPS` + : "Audio Only"; + setGetDisplayMedia(video, { audio: true, video: { width, height, frameRate }, }); @@ -183,20 +191,27 @@ setInterval(() => { el.appendChild(div); } - const buttonContainer = document.getElementsByClassName("container-YkUktl")[0]; + const buttonContainer = + document.getElementsByClassName("container-YkUktl")[0]; if (!buttonContainer) { - console.log('dsa: Cannot locate Mute/Deafen/Settings button container, please report this on GitHub'); + 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" - )[0] : null; + + const muteBtn = buttonContainer + ? buttonContainer.getElementsByClassName( + "button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F" + )[0] + : null; window.discordScreenaudioToggleMute = () => muteBtn && muteBtn.click(); - - const deafenBtn = buttonContainer ? buttonContainer.getElementsByClassName( - "button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F" - )[1] : null; - + + const deafenBtn = buttonContainer + ? buttonContainer.getElementsByClassName( + "button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F" + )[1] + : null; + window.discordScreenaudioToggleDeafen = () => deafenBtn && deafenBtn.click(); if (window.discordScreenaudioResolutionString) { diff --git a/src/discordpage.cpp b/src/discordpage.cpp index 6821a39..8f42f01 100644 --- a/src/discordpage.cpp +++ b/src/discordpage.cpp @@ -186,10 +186,8 @@ void DiscordPage::stopVirtmic() { } void DiscordPage::startVirtmic(QString target) { - if (target != "None") { - qDebug(virtmicLog) << "Starting Virtmic with target" << target; - m_virtmicProcess.start(QApplication::arguments()[0], {"--virtmic", target}); - } + qDebug(virtmicLog) << "Starting Virtmic with target" << target; + m_virtmicProcess.start(QApplication::arguments()[0], {"--virtmic", target}); } void DiscordPage::javaScriptConsoleMessage( @@ -230,16 +228,18 @@ void DiscordPage::javaScriptConsoleMessage( } } -void DiscordPage::startStream(QString target, uint width, uint height, - uint frameRate) { +void DiscordPage::startStream(bool video, bool audio, uint width, uint height, + uint frameRate, QString target) { stopVirtmic(); - startVirtmic(target); + startVirtmic(audio ? target : "[None]"); // Wait a bit for the virtmic to start - QTimer::singleShot(target == "None" ? 0 : 200, [=]() { - runJavaScript(QString("window.discordScreenaudioStartStream(%1, %2, %3);") - .arg(width) - .arg(height) - .arg(frameRate)); + QTimer::singleShot(200, [=]() { + runJavaScript( + QString("window.discordScreenaudioStartStream(%1, %2, %3, %4);") + .arg(video) + .arg(video ? width : 32) + .arg(video ? height : 16) + .arg(video ? frameRate : 1)); }); } diff --git a/src/discordpage.h b/src/discordpage.h index ee1b2ba..3668b2c 100644 --- a/src/discordpage.h +++ b/src/discordpage.h @@ -47,7 +47,8 @@ private: private Q_SLOTS: void featurePermissionRequested(const QUrl &securityOrigin, 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 diff --git a/src/streamdialog.cpp b/src/streamdialog.cpp index 5a151fb..cdba4a3 100644 --- a/src/streamdialog.cpp +++ b/src/streamdialog.cpp @@ -12,70 +12,96 @@ StreamDialog::StreamDialog() : QWidget() { setAttribute(Qt::WA_QuitOnClose, false); - auto layout = new QVBoxLayout(this); - layout->setSizeConstraint(QLayout::SetFixedSize); + { + auto layout = new QVBoxLayout(this); + layout->setSizeConstraint(QLayout::SetFixedSize); - auto targetLabel = new QLabel(this); - targetLabel->setText("Which app do you want to stream sound from?"); - layout->addWidget(targetLabel); + m_videoGroupBox = new QGroupBox(this); + m_videoGroupBox->setTitle("Video"); + 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); - m_targetComboBox = new QComboBox(this); - updateTargets(); - targetHBox->addWidget(m_targetComboBox); + auto resolutionLabel = new QLabel(this); + resolutionLabel->setText("Stream Resolution"); + videoLayout->addWidget(resolutionLabel); - auto refreshTargetsButton = new QPushButton(this); - refreshTargetsButton->setFixedSize(30, 30); - refreshTargetsButton->setIcon(QIcon::fromTheme("view-refresh")); - connect(refreshTargetsButton, &QPushButton::clicked, this, - &StreamDialog::updateTargets); - targetHBox->addWidget(refreshTargetsButton); + 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 qualityLabel = new QLabel(this); - qualityLabel->setText("Stream Quality"); - layout->addWidget(qualityLabel); + auto framerateLabel = new QLabel(this); + framerateLabel->setText("Stream Framerate"); + videoLayout->addWidget(framerateLabel); - auto qualityHBox = new QHBoxLayout(this); - layout->addLayout(qualityHBox); + 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_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_audioGroupBox = new QGroupBox(this); + m_audioGroupBox->setCheckable(true); + m_audioGroupBox->setTitle("Audio"); + layout->addWidget(m_audioGroupBox); - 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 audioLayout = new QVBoxLayout(this); + m_audioGroupBox->setLayout(audioLayout); - auto button = new QPushButton(this); - button->setText("Start Stream"); - connect(button, &QPushButton::clicked, this, &StreamDialog::startStream); - layout->addWidget(button, Qt::AlignRight | Qt::AlignBottom); + auto targetLabel = new QLabel(this); + targetLabel->setText("Audio Source"); + audioLayout->addWidget(targetLabel); - setLayout(layout); + { + auto targetLayout = new QHBoxLayout(this); + audioLayout->addLayout(targetLayout); + + m_targetComboBox = new QComboBox(this); + updateTargets(); + targetLayout->addWidget(m_targetComboBox); + + auto refreshTargetsButton = new QPushButton(this); + refreshTargetsButton->setFixedSize(30, 30); + refreshTargetsButton->setIcon(QIcon::fromTheme("view-refresh")); + connect(refreshTargetsButton, &QPushButton::clicked, this, + &StreamDialog::updateTargets); + targetLayout->addWidget(refreshTargetsButton); + } + } + + auto button = new QPushButton(this); + button->setText("Start Stream"); + connect(button, &QPushButton::clicked, this, &StreamDialog::startStream); + layout->addWidget(button, Qt::AlignRight | Qt::AlignBottom); + + setLayout(layout); + } setWindowTitle("discord-screenaudio Stream Dialog"); } void StreamDialog::startStream() { - auto resolution = - m_qualityResolutionComboBox->currentData().toString().split('x'); - emit requestedStreamStart(m_targetComboBox->currentText(), + auto resolution = m_resolutionComboBox->currentData().toString().split('x'); + emit requestedStreamStart(m_videoGroupBox->isChecked(), + m_audioGroupBox->isChecked(), resolution[0].toUInt(), resolution[1].toUInt(), - m_qualityFPSComboBox->currentData().toUInt()); + m_framerateComboBox->currentData().toUInt(), + m_targetComboBox->currentText()); setHidden(true); } @@ -83,7 +109,6 @@ void StreamDialog::updateTargets() { auto lastTarget = m_targetComboBox->currentText(); m_targetComboBox->clear(); - m_targetComboBox->addItem("[None]"); m_targetComboBox->addItem("[All Desktop Audio]"); for (auto target : Virtmic::getTargets()) { m_targetComboBox->addItem(target); diff --git a/src/streamdialog.h b/src/streamdialog.h index c2f833c..8fab813 100644 --- a/src/streamdialog.h +++ b/src/streamdialog.h @@ -2,6 +2,7 @@ #include #include +#include #include class StreamDialog : public QWidget { @@ -12,12 +13,14 @@ public: private: QComboBox *m_targetComboBox; - QComboBox *m_qualityResolutionComboBox; - QComboBox *m_qualityFPSComboBox; + QComboBox *m_resolutionComboBox; + QComboBox *m_framerateComboBox; + QGroupBox *m_videoGroupBox; + QGroupBox *m_audioGroupBox; Q_SIGNALS: - void requestedStreamStart(QString target, uint width, uint height, - uint frameRate); + void requestedStreamStart(bool video, bool audio, uint width, uint height, + uint frameRate, QString target); public Q_SLOTS: void updateTargets();