reworked stream dialog
This commit is contained in:
parent
d693535d53
commit
f4a60f281d
5 changed files with 125 additions and 81 deletions
|
@ -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,19 +191,26 @@ 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(
|
||||
const muteBtn = buttonContainer
|
||||
? buttonContainer.getElementsByClassName(
|
||||
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
||||
)[0] : null;
|
||||
)[0]
|
||||
: null;
|
||||
window.discordScreenaudioToggleMute = () => muteBtn && muteBtn.click();
|
||||
|
||||
const deafenBtn = buttonContainer ? buttonContainer.getElementsByClassName(
|
||||
const deafenBtn = buttonContainer
|
||||
? buttonContainer.getElementsByClassName(
|
||||
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
||||
)[1] : null;
|
||||
)[1]
|
||||
: null;
|
||||
|
||||
window.discordScreenaudioToggleDeafen = () => deafenBtn && deafenBtn.click();
|
||||
|
||||
|
|
|
@ -186,11 +186,9 @@ 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});
|
||||
}
|
||||
}
|
||||
|
||||
void DiscordPage::javaScriptConsoleMessage(
|
||||
QWebEnginePage::JavaScriptConsoleMessageLevel level, const QString &message,
|
||||
|
@ -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));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -12,53 +12,77 @@
|
|||
StreamDialog::StreamDialog() : QWidget() {
|
||||
setAttribute(Qt::WA_QuitOnClose, false);
|
||||
|
||||
{
|
||||
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);
|
||||
|
||||
auto resolutionLabel = new QLabel(this);
|
||||
resolutionLabel->setText("Stream 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("Stream 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);
|
||||
updateTargets();
|
||||
targetHBox->addWidget(m_targetComboBox);
|
||||
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);
|
||||
targetHBox->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);
|
||||
targetLayout->addWidget(refreshTargetsButton);
|
||||
}
|
||||
}
|
||||
|
||||
auto button = new QPushButton(this);
|
||||
button->setText("Start Stream");
|
||||
|
@ -66,16 +90,18 @@ StreamDialog::StreamDialog() : QWidget() {
|
|||
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);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <QComboBox>
|
||||
#include <QDialog>
|
||||
#include <QGroupBox>
|
||||
#include <QWidget>
|
||||
|
||||
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();
|
||||
|
|
Loading…
Reference in a new issue