Compare commits

..

1 Commits

Author SHA1 Message Date
Malte Jürgens
cd2aca55c7 add toggle to disable automatic gain 2023-05-28 10:33:38 +02:00
10 changed files with 77 additions and 131 deletions

23
.gitignore vendored
View File

@@ -1,20 +1,3 @@
# Ignore build and output directories
/build/
/.flatpak-builder/
# Ignore flatpak-builder cache
/.flatpak-builder-cache/
# Ignore flatpak-builder log files
/*.log
# Ignore flatpak-builder generated files
/*.flatpak
/*.flatpak-builder
/*.flatpak-origin
# Ignore specific files or directories
/override.json
/metadata/
/manifest.json
/CMakeLists.txt.user
/build
.vscode
/submodules/arrpc

View File

@@ -1,12 +1,14 @@
navigator.mediaDevices.chromiumGetDisplayMedia =
navigator.mediaDevices.getDisplayMedia;
navigator.mediaDevices.chromiumGetUserMedia =
navigator.mediaDevices.getUserMedia;
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
const getAudioDevice = async (nameOfAudioDevice) => {
await navigator.mediaDevices.getUserMedia({
await navigator.mediaDevices.chromiumGetUserMedia({
audio: true,
});
let audioDevice;
@@ -23,6 +25,16 @@ const getAudioDevice = async (nameOfAudioDevice) => {
return audioDevice;
};
function setGetUserMedia() {
const getUserMedia = async (constraints) => {
return await navigator.mediaDevices.chromiumGetUserMedia({
video: constraints?.video || false,
audio: { ...constraints?.audio, autoGainControl },
});
};
navigator.mediaDevices.getUserMedia = getUserMedia;
}
function setGetDisplayMedia(video = true, overrideArgs = undefined) {
const getDisplayMedia = async (...args) => {
var id;
@@ -34,26 +46,27 @@ function setGetDisplayMedia(video = true, overrideArgs = undefined) {
} catch (error) {
id = "default";
}
let captureSystemAudioStream = await navigator.mediaDevices.getUserMedia({
audio: {
// We add our audio constraints here, to get a list of supported constraints use navigator.mediaDevices.getSupportedConstraints();
// We must capture a microphone, we use default since its the only deviceId that is the same for every Chromium user
deviceId: {
exact: id,
let captureSystemAudioStream =
await navigator.mediaDevices.chromiumGetUserMedia({
audio: {
// We add our audio constraints here, to get a list of supported constraints use navigator.mediaDevices.getSupportedConstraints();
// We must capture a microphone, we use default since its the only deviceId that is the same for every Chromium user
deviceId: {
exact: id,
},
// We want auto gain control, noise cancellation and noise suppression disabled so that our stream won't sound bad
autoGainControl: false,
echoCancellation: false,
noiseSuppression: false,
// By default Chromium sets channel count for audio devices to 1, we want it to be stereo in case we find a way for Discord to accept stereo screenshare too
channelCount: 2,
// You can set more audio constraints here, bellow are some examples
//latency: 0,
//sampleRate: 48000,
//sampleSize: 16,
//volume: 1.0
},
// We want auto gain control, noise cancellation and noise suppression disabled so that our stream won't sound bad
autoGainControl: false,
echoCancellation: false,
noiseSuppression: false,
// By default Chromium sets channel count for audio devices to 1, we want it to be stereo in case we find a way for Discord to accept stereo screenshare too
channelCount: 2,
// You can set more audio constraints here, bellow are some examples
//latency: 0,
//sampleRate: 48000,
//sampleSize: 16,
//volume: 1.0
},
});
});
let [track] = captureSystemAudioStream.getAudioTracks();
const gdm = await navigator.mediaDevices.chromiumGetDisplayMedia(
...(overrideArgs
@@ -68,6 +81,7 @@ function setGetDisplayMedia(video = true, overrideArgs = undefined) {
}
setGetDisplayMedia();
setGetUserMedia();
let userscript;
let muteBtn;
@@ -76,6 +90,7 @@ let streamStartBtn;
let streamStartBtnInitialDisplay;
let streamStartBtnClone;
let resolutionString;
let autoGainControl = true;
const clonedElements = [];
const hiddenElements = [];
let wasStreamActive = false;
@@ -159,6 +174,10 @@ function main() {
streamStartBtnClone.remove();
});
userscript.getPref("disableAutomaticGain", false).then((disabled) => {
autoGainControl = !disabled;
});
function updateUserstyles() {
userscript.log("Loading userstyles...");
userscript.loadingMessage = "Loading userstyles...";
@@ -368,5 +387,29 @@ function main() {
}
}
}
for (const el of document.getElementsByClassName("sensitivity-3A7Gs9")) {
if (
el.getElementsByTagName("div").length > 0 &&
!document.getElementById("discord-screenaudio-gaintoggle")
) {
const toggle = createSwitch(
"Disable automatic gain",
await userscript.getPref("disableAutomaticGain", false),
async (disabled) => {
await userscript.setPref("disableAutomaticGain", disabled);
autoGainControl = !disabled;
setGetUserMedia();
if (disabled)
userscript.showInformation(
"discord-screenaudio",
"If you are currently in a call, this setting may only take effect after you rejoin the call or restart discord-screenaudio."
);
}
);
toggle.id = "discord-screenaudio-gaintoggle";
el.getElementsByTagName("div")[0].appendChild(toggle);
}
}
}, 500);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -1,28 +0,0 @@
#!/bin/bash
# Build Flatpak package
flatpak-builder build-dir lol.deadzone.discord-awesomeaudio.json --install --user --force-clean
# Create wrapper script
echo '#!/bin/bash
RUNNING=$(pgrep -f "discord-screenaudio")
if [[ -n $RUNNING ]]; then
WM_CLASS="discord-screenaudio"
else
WM_CLASS=""
fi
flatpak run --env=WM_CLASS="$WM_CLASS" lol.deadzone.discord-awesomeaudio' > ~/.local/bin/discord-awesomeaudio.sh
# Make the wrapper script executable
chmod +x ~/.local/bin/discord-awesomeaudio.sh
# Create .desktop file
echo "[Desktop Entry]
Name=Discord Awesome Audio
Exec=flatpak run lol.deadzone.discord-awesomeaudio
Icon=/path/to/application/icon.png
Type=Application
Categories=AudioVideo;Network;" > ~/.local/share/applications/discord-awesomeaudio.desktop
# Make the .desktop file executable (if necessary)
chmod +x ~/.local/share/applications/discord-awesomeaudio.desktop

View File

@@ -1,44 +0,0 @@
{
"app-id": "lol.deadzone.discord-awesomeaudio",
"runtime": "org.kde.Platform",
"runtime-version": "5.15-22.08",
"sdk": "org.kde.Sdk",
"base": "io.qt.qtwebengine.BaseApp",
"base-version": "5.15-22.08",
"command": "discord-screenaudio",
"finish-args": [
"--share=ipc",
"--share=network",
"--socket=wayland",
"--socket=fallback-x11",
"--socket=pulseaudio",
"--filesystem=xdg-videos:ro",
"--filesystem=xdg-pictures:ro",
"--filesystem=xdg-download",
"--filesystem=xdg-run/pipewire-0",
"--device=all",
"--talk-name=org.kde.StatusNotifierWatcher",
"--env=QTWEBENGINEPROCESS_PATH=/app/bin/QtWebEngineProcess",
"--talk-name=org.freedesktop.Notifications",
"--talk-name=org.kde.kglobalaccel"
],
"modules": [
{
"name": "discord-screenaudio",
"buildsystem": "cmake-ninja",
"config-opts": [
"-DCMAKE_BUILD_TYPE=RelWithDebInfo",
"-DGIT_SUBMODULE=OFF"
],
"sources": [
{
"type": "dir",
"path": "."
}
]
}
],
"finish-install": {
"desktop-file": "[Desktop Entry]\nName=Discord Awesome Audio\nExec=flatpak run lol.deadzone.discord-awesomeaudio\nIcon=/path/to/application/icon.png\nType=Application\nCategories=AudioVideo;Network;"
}
}

View File

@@ -12,7 +12,6 @@
#include <QGridLayout>
#include <QLabel>
#include <QPushButton>
#include <QShortcut>
#include <QSpacerItem>
#include <QThread>
#include <QTimer>
@@ -32,8 +31,6 @@ MainWindow::MainWindow(bool useNotifySend, QWidget *parent)
setCentralWidget(m_centralWidget);
setupTrayIcon();
setMinimumSize(800, 300);
connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this),
&QShortcut::activated, this, &MainWindow::toggleOrCloseWindow);
if (m_settings->contains("geometry")) {
restoreGeometry(m_settings->value("geometry").toByteArray());
} else {
@@ -82,7 +79,12 @@ void MainWindow::setupTrayIcon() {
connect(m_trayIcon, &QSystemTrayIcon::activated, [this](auto reason) {
if (reason == QSystemTrayIcon::Trigger) {
toggleOrCloseWindow();
if (isVisible()) {
hide();
} else {
show();
activateWindow();
}
}
});
}
@@ -129,15 +131,3 @@ MainWindow *MainWindow::instance() { return m_instance; }
CentralWidget *MainWindow::centralWidget() {
return instance()->m_centralWidget;
};
void MainWindow::toggleOrCloseWindow() {
if (isVisible()) {
if (m_trayIcon == nullptr)
QApplication::quit();
else
hide();
} else {
show();
activateWindow();
}
}

View File

@@ -36,5 +36,4 @@ private:
public Q_SLOTS:
void setTrayIcon(bool enabled);
void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest);
void toggleOrCloseWindow();
};

View File

@@ -182,3 +182,7 @@ void UserScript::showThemeDialog() {
void UserScript::installUserStyles(QString url) {
emit shouldInstallUserStyles(url);
}
void UserScript::showInformation(QString title, QString message) {
QMessageBox::information(MainWindow::instance(), title, message);
}

View File

@@ -72,6 +72,7 @@ public Q_SLOTS:
void showShortcutsDialog();
void showHelpMenu();
void showStreamDialog();
void showInformation(QString title, QString message);
void stopVirtmic();
void startVirtmic(QString target);
void showThemeDialog();

View File

@@ -1,2 +0,0 @@
flatpak remove lol.deadzone.discord-awesomeaudio
rm ~/.local/share/applications/discord-awesomeaudio.desktop