Compare commits
	
		
			27 Commits
		
	
	
		
			v1.0.0-rc.
			...
			appimage
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 092fbf72b6 | ||
|  | 4d3e77bc9a | ||
|  | 6ef16b9625 | ||
|  | ae57550b46 | ||
|  | b62f1bab1f | ||
|  | 5f9211f98f | ||
|  | cfbb4152c3 | ||
|  | fa83e2d9a8 | ||
|  | 58ecbbc6f4 | ||
|  | 77300ed178 | ||
|  | 99df18ef89 | ||
|  | 6fc6140ce2 | ||
|  | 84c12a752e | ||
|  | 1199381803 | ||
|  | bce32e2ba1 | ||
|  | bc59458e19 | ||
|  | 6492cb9a35 | ||
|  | a814d9cc1b | ||
|  | dd107c6767 | ||
|  | 50be25d7db | ||
|  | fd894fb63e | ||
|  | 6681c0591a | ||
|  | 8597416bb5 | ||
|  | ce94b44997 | ||
|  | 2741e1afaa | ||
|  | b2f5f8e7d0 | ||
|  | c4c32b1615 | 
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | [submodule "submodules/rohrkabel"] | ||||||
|  | 	path = submodules/rohrkabel | ||||||
|  | 	url = https://github.com/Soundux/rohrkabel | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| cmake_minimum_required(VERSION 3.0) | cmake_minimum_required(VERSION 3.11) | ||||||
| project(discord-screenaudio) | project(discord-screenaudio) | ||||||
|  |  | ||||||
| set(CMAKE_CXX_STANDARD 17) | set(CMAKE_CXX_STANDARD 17) | ||||||
| @@ -13,7 +13,7 @@ find_package(Qt5 CONFIG REQUIRED COMPONENTS | |||||||
|   WebEngineWidgets |   WebEngineWidgets | ||||||
| ) | ) | ||||||
|  |  | ||||||
| set(discord-screenaudio_SRC | set(${CMAKE_PROJECT_NAME}_SRC | ||||||
|   src/main.cpp |   src/main.cpp | ||||||
|   src/mainwindow.cpp |   src/mainwindow.cpp | ||||||
|   src/virtmic.cpp |   src/virtmic.cpp | ||||||
| @@ -22,18 +22,33 @@ set(discord-screenaudio_SRC | |||||||
|   resources.qrc |   resources.qrc | ||||||
| ) | ) | ||||||
|  |  | ||||||
| include(FetchContent) | # Adapted from https://cliutils.gitlab.io/modern-cmake/chapters/projects/submodule.html | ||||||
|  | find_package(Git QUIET) | ||||||
|  | if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") | ||||||
|  |   option(GIT_SUBMODULE "Check submodules during build" ON) | ||||||
|  |   if(GIT_SUBMODULE) | ||||||
|  |     message(STATUS "Updating submodules") | ||||||
|  |     execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive --checkout | ||||||
|  |                     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | ||||||
|  |                     RESULT_VARIABLE GIT_SUBMOD_RESULT) | ||||||
|  |     if(NOT GIT_SUBMOD_RESULT EQUAL "0") | ||||||
|  |       message(FATAL_ERROR "`git submodule update --init --recursive --checkout` failed with ${GIT_SUBMOD_RESULT}, please provide the submodules manually") | ||||||
|  |     endif() | ||||||
|  |   endif() | ||||||
|  | endif() | ||||||
|  |  | ||||||
| FetchContent_Declare( | if(NOT EXISTS "${PROJECT_SOURCE_DIR}/submodules/rohrkabel/CMakeLists.txt") | ||||||
|   rohrkabel  |   message(FATAL_ERROR "Rohrkabel was not found since you are not in a Git checkout or have GIT_SUBMODULE disabled. Please provide rohrkabel manually to `./submodules/rohrkabel`.") | ||||||
|   GIT_REPOSITORY "https://github.com/Soundux/rohrkabel"  | endif() | ||||||
|   GIT_TAG "d87403f48d3a95aa4bcf4cd60112d9e4bb090d5d" |  | ||||||
| ) |  | ||||||
| FetchContent_MakeAvailable(rohrkabel) |  | ||||||
|  |  | ||||||
| add_executable(discord-screenaudio ${discord-screenaudio_SRC}) | add_subdirectory(submodules/rohrkabel) | ||||||
|  |  | ||||||
| target_link_libraries(discord-screenaudio Qt5::Widgets Qt5::WebEngineWidgets rohrkabel) | add_executable(${CMAKE_PROJECT_NAME} ${${CMAKE_PROJECT_NAME}_SRC}) | ||||||
|  |  | ||||||
| install(TARGETS discord-screenaudio DESTINATION bin) | target_link_libraries(${CMAKE_PROJECT_NAME} Qt5::Widgets Qt5::WebEngineWidgets rohrkabel) | ||||||
| install(PROGRAMS assets/discord-screenaudio.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) |  | ||||||
|  | install(TARGETS ${CMAKE_PROJECT_NAME} DESTINATION bin) | ||||||
|  | install(PROGRAMS assets/${CMAKE_PROJECT_NAME}.desktop DESTINATION share/applications) | ||||||
|  | install(FILES assets/discord.png DESTINATION share/pixmaps) | ||||||
|  |  | ||||||
|  | add_custom_target(appimage ${CMAKE_SOURCE_DIR}/scripts/build-appimage.sh WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								README.md
									
									
									
									
									
								
							| @@ -9,6 +9,19 @@ of [@edisionnano](https://github.com/edisionnano) and the | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | The purpose of this project is **not** to provide an alternative to the original | ||||||
|  | Discord client. Rather, it should be used in addition to the original client in | ||||||
|  | case you want to stream something, maybe used with a second account. For | ||||||
|  | anything else, this client has way too many things that work less well than in | ||||||
|  | the original client. | ||||||
|  |  | ||||||
|  | ## Known Issues | ||||||
|  |  | ||||||
|  | - Only works with **PipeWire** | ||||||
|  | - Only works on **X11** | ||||||
|  | - Can only share primary screen (no other screens or specific applications) (see | ||||||
|  |   [#1](https://github.com/maltejur/discord-screenaudio/issues/1)) | ||||||
|  |  | ||||||
| ## Installation | ## Installation | ||||||
|  |  | ||||||
| If you are using Arch, you can build and install | If you are using Arch, you can build and install | ||||||
| @@ -30,7 +43,14 @@ On Debian: | |||||||
|  |  | ||||||
| ### Building | ### Building | ||||||
|  |  | ||||||
| To build the program, run this in the source directory: | First, clone the repository: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | git clone https://github.com/maltejur/discord-screenaudio.git | ||||||
|  | cd discord-screenaudio | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Then, to build the program, run this in the source directory: | ||||||
|  |  | ||||||
| ```bash | ```bash | ||||||
| cmake -B build | cmake -B build | ||||||
|   | |||||||
| @@ -4,3 +4,4 @@ Name=discord-screenaudio | |||||||
| Exec=discord-screenaudio | Exec=discord-screenaudio | ||||||
| Icon=discord | Icon=discord | ||||||
| Terminal=false | Terminal=false | ||||||
|  | Categories=Audio; | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								assets/discord.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/discord.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 6.8 KiB | 
| @@ -117,7 +117,7 @@ setInterval(() => { | |||||||
|   ) { |   ) { | ||||||
|     for (const el of document.getElementsByClassName("info-3pQQBb")) { |     for (const el of document.getElementsByClassName("info-3pQQBb")) { | ||||||
|       const aboutEl = document.createElement("div"); |       const aboutEl = document.createElement("div"); | ||||||
|       aboutEl.innerText = "discord-screenaudio v1.0.0-rc.5"; |       aboutEl.innerText = "discord-screenaudio v1.0.0-rc.7 (AppImage)"; | ||||||
|       aboutEl.style.fontSize = "12px"; |       aboutEl.style.fontSize = "12px"; | ||||||
|       aboutEl.style.color = "var(--text-muted)"; |       aboutEl.style.color = "var(--text-muted)"; | ||||||
|       aboutEl.classList.add("dirscordScreenaudioAboutText"); |       aboutEl.classList.add("dirscordScreenaudioAboutText"); | ||||||
| @@ -128,4 +128,8 @@ setInterval(() => { | |||||||
|   // Remove stream settings if stream is active |   // Remove stream settings if stream is active | ||||||
|   document.getElementById("manage-streams-change-windows")?.remove(); |   document.getElementById("manage-streams-change-windows")?.remove(); | ||||||
|   document.querySelector(`[aria-label="Stream Settings"]`)?.remove(); |   document.querySelector(`[aria-label="Stream Settings"]`)?.remove(); | ||||||
| }, 1000); | }, 500); | ||||||
|  |  | ||||||
|  | // Fix for broken discord notifications after restart | ||||||
|  | // (https://github.com/maltejur/discord-screenaudio/issues/17) | ||||||
|  | Notification.requestPermission(); | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								scripts/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								scripts/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | FROM debian:11 | ||||||
|  | ADD ./prepare-container.sh /tmp/prepare-container.sh | ||||||
|  | RUN /tmp/prepare-container.sh | ||||||
|  | WORKDIR /work | ||||||
							
								
								
									
										32
									
								
								scripts/build-appimage.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										32
									
								
								scripts/build-appimage.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | #!/usr/bin/bash | ||||||
|  |  | ||||||
|  | set -e | ||||||
|  |  | ||||||
|  | # Check if inside of docker container | ||||||
|  | if [ ! -f /.dockerenv ]; then | ||||||
|  |   # Check if docker is available | ||||||
|  |   if ! command -v docker >/dev/null 2>&1; then | ||||||
|  |     echo "Error: Docker is not available." | ||||||
|  |     exit 1 | ||||||
|  |   fi | ||||||
|  |   docker run --rm -u $(id -u) -v "$PWD":/work discord-screenaudio-buildenv bash /work/scripts/build-appimage.sh | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | tmpdir="$(mktemp -d)" | ||||||
|  | builddir="$tmpdir/build" | ||||||
|  | appdir="$tmpdir/AppDir" | ||||||
|  | export CMAKE_GENERATOR="Ninja" | ||||||
|  | cmake -B "$builddir" -S "$PWD" | ||||||
|  | cmake --build "$builddir" --config Release | ||||||
|  | DESTDIR="$appdir" cmake --install "$builddir" --prefix "/usr" | ||||||
|  | # Include libnss related files | ||||||
|  | mkdir -p "$appdir/AppDir/usr/lib/" | ||||||
|  | cp -rv "/usr/lib/x86_64-linux-gnu/nss" "$appdir/usr/lib/" | ||||||
|  |  | ||||||
|  | VERSION="$(cat version)" linuxdeploy \ | ||||||
|  |   --appdir "$appdir" \ | ||||||
|  |   --icon-file "assets/discord.png" \ | ||||||
|  |   --plugin qt \ | ||||||
|  |   --exclude-library "libpipewire-0.3.so.0" \ | ||||||
|  |   --output appimage | ||||||
							
								
								
									
										37
									
								
								scripts/prepare-container.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										37
									
								
								scripts/prepare-container.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | #!/bin/sh | ||||||
|  |  | ||||||
|  | set -e | ||||||
|  | cd "$(dirname "$0")" | ||||||
|  |  | ||||||
|  | if [ ! -f /.dockerenv ]; then | ||||||
|  |   # Check if docker is available | ||||||
|  |   if ! command -v docker >/dev/null 2>&1; then | ||||||
|  |     echo "Error: Docker is not available." | ||||||
|  |     exit 1 | ||||||
|  |   fi | ||||||
|  |   docker build -t discord-screenaudio-buildenv . | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | echo "-> Installing dependencies with apt..." | ||||||
|  | export DEBIAN_FRONTEND=noninteractive | ||||||
|  | apt-get update | ||||||
|  | apt-get install -y curl build-essential qtbase5-dev qtwebengine5-dev qt5-qmake cmake ninja-build pkg-config git libpipewire-0.3-dev file | ||||||
|  |  | ||||||
|  | echo "-> Installing linuxdeploy..." | ||||||
|  | tmpdir="$(mktemp -d)" | ||||||
|  | install_appimage() { | ||||||
|  |   curl -Lo "$tmpdir/$1.AppImage" "$2" | ||||||
|  |   chmod +x "$tmpdir/$1.AppImage" | ||||||
|  |   sed '0,/AI\x02/{s|AI\x02|\x00\x00\x00|}' -i -i "$tmpdir/$1.AppImage" | ||||||
|  |   (cd "$tmpdir" && ./$1.AppImage --appimage-extract) | ||||||
|  |   mv -v "$tmpdir/squashfs-root" "/opt/$1" | ||||||
|  |   ln -sv "/opt/$1/AppRun" "/usr/local/bin/$1" | ||||||
|  | } | ||||||
|  | install_appimage "linuxdeploy" "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage" | ||||||
|  | install_appimage "linuxdeploy-plugin-qt" "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage" | ||||||
|  |  | ||||||
|  | echo "-> Cleaning up..." | ||||||
|  | rm -rf "$tmpdir" | ||||||
|  | rm /tmp/prepare-container.sh | ||||||
|  | apt-get clean | ||||||
| @@ -26,6 +26,7 @@ DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) { | |||||||
|   settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true); |   settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true); | ||||||
|   settings()->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture, |   settings()->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture, | ||||||
|                            false); |                            false); | ||||||
|  |   settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, false); | ||||||
|  |  | ||||||
|   setUrl(QUrl("https://discord.com/app")); |   setUrl(QUrl("https://discord.com/app")); | ||||||
|  |  | ||||||
| @@ -63,23 +64,44 @@ void DiscordPage::featurePermissionRequested(const QUrl &securityOrigin, | |||||||
|   // Allow every permission asked |   // Allow every permission asked | ||||||
|   setFeaturePermission(securityOrigin, feature, |   setFeaturePermission(securityOrigin, feature, | ||||||
|                        QWebEnginePage::PermissionGrantedByUser); |                        QWebEnginePage::PermissionGrantedByUser); | ||||||
|  |  | ||||||
|  |   if (feature == QWebEnginePage::Feature::MediaAudioCapture) { | ||||||
|  |     if (m_virtmicProcess.state() == QProcess::NotRunning) { | ||||||
|  |       qDebug() << "[virtmic] Starting Virtmic with no target to make sure " | ||||||
|  |                   "Discord can find all the audio devices"; | ||||||
|  |       m_virtmicProcess.start(QApplication::arguments()[0], | ||||||
|  |                              {"--virtmic", "None"}); | ||||||
|  |     } | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| bool DiscordPage::acceptNavigationRequest(const QUrl &url, | bool DiscordPage::acceptNavigationRequest(const QUrl &url, | ||||||
|                                           QWebEnginePage::NavigationType type, |                                           QWebEnginePage::NavigationType type, | ||||||
|                                           bool isMainFrame) { |                                           bool isMainFrame) { | ||||||
|   qDebug() << url; |   // if (type == QWebEnginePage::NavigationTypeLinkClicked) { | ||||||
|   if (type == QWebEnginePage::NavigationTypeLinkClicked) { |   //   QDesktopServices::openUrl(url); | ||||||
|     QDesktopServices::openUrl(url); |   //   return false; | ||||||
|     return false; |   // } | ||||||
|   } |  | ||||||
|   return true; |   return true; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | bool ExternalPage::acceptNavigationRequest(const QUrl &url, | ||||||
|  |                                            QWebEnginePage::NavigationType type, | ||||||
|  |                                            bool isMainFrame) { | ||||||
|  |   QDesktopServices::openUrl(url); | ||||||
|  |   deleteLater(); | ||||||
|  |   return false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | QWebEnginePage *DiscordPage::createWindow(QWebEnginePage::WebWindowType type) { | ||||||
|  |   return new ExternalPage; | ||||||
|  | } | ||||||
|  |  | ||||||
| void DiscordPage::stopVirtmic() { | void DiscordPage::stopVirtmic() { | ||||||
|   if (m_virtmicProcess.state() == QProcess::Running) { |   if (m_virtmicProcess.state() == QProcess::Running) { | ||||||
|     qDebug() << "[virtmic] Stopping Virtmic"; |     qDebug() << "[virtmic] Stopping Virtmic"; | ||||||
|     m_virtmicProcess.kill(); |     m_virtmicProcess.kill(); | ||||||
|  |     m_virtmicProcess.waitForFinished(); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ | |||||||
| #include "virtmic.h" | #include "virtmic.h" | ||||||
|  |  | ||||||
| #include <QProcess> | #include <QProcess> | ||||||
|  | #include <QWebEngineFullScreenRequest> | ||||||
| #include <QWebEnginePage> | #include <QWebEnginePage> | ||||||
|  |  | ||||||
| class DiscordPage : public QWebEnginePage { | class DiscordPage : public QWebEnginePage { | ||||||
| @@ -18,6 +19,7 @@ private: | |||||||
|   bool acceptNavigationRequest(const QUrl &url, |   bool acceptNavigationRequest(const QUrl &url, | ||||||
|                                QWebEnginePage::NavigationType type, |                                QWebEnginePage::NavigationType type, | ||||||
|                                bool isMainFrame) override; |                                bool isMainFrame) override; | ||||||
|  |   QWebEnginePage *createWindow(QWebEnginePage::WebWindowType type) override; | ||||||
|   void |   void | ||||||
|   javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level, |   javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level, | ||||||
|                            const QString &message, int lineNumber, |                            const QString &message, int lineNumber, | ||||||
| @@ -31,3 +33,15 @@ private Q_SLOTS: | |||||||
|                                   QWebEnginePage::Feature feature); |                                   QWebEnginePage::Feature feature); | ||||||
|   void startStream(QString target, uint width, uint height, uint frameRate); |   void startStream(QString target, uint width, uint height, uint frameRate); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | // Will immediately get destroyed again but is needed for navigation to | ||||||
|  | // target="_blank" links, since QWebEnginePage::newWindowRequested is | ||||||
|  | // only available sinec Qt 6.3. | ||||||
|  | class ExternalPage : public QWebEnginePage { | ||||||
|  |   Q_OBJECT | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   bool acceptNavigationRequest(const QUrl &url, | ||||||
|  |                                QWebEnginePage::NavigationType type, | ||||||
|  |                                bool isMainFrame) override; | ||||||
|  | }; | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
| int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||||||
|   QApplication app(argc, argv); |   QApplication app(argc, argv); | ||||||
|   QApplication::setApplicationName("discord-screenaudio"); |   QApplication::setApplicationName("discord-screenaudio"); | ||||||
|   QApplication::setApplicationVersion("1.0.0-rc.5"); |   QApplication::setApplicationVersion("1.0.0-rc.7"); | ||||||
|  |  | ||||||
|   QCommandLineParser parser; |   QCommandLineParser parser; | ||||||
|   parser.setApplicationDescription( |   parser.setApplicationDescription( | ||||||
|   | |||||||
| @@ -23,8 +23,25 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void MainWindow::setupWebView() { | void MainWindow::setupWebView() { | ||||||
|   m_webView = new QWebEngineView(this); |  | ||||||
|   auto page = new DiscordPage(this); |   auto page = new DiscordPage(this); | ||||||
|  |   connect(page, &QWebEnginePage::fullScreenRequested, this, | ||||||
|  |           &MainWindow::fullScreenRequested); | ||||||
|  |  | ||||||
|  |   m_webView = new QWebEngineView(this); | ||||||
|   m_webView->setPage(page); |   m_webView->setPage(page); | ||||||
|  |  | ||||||
|   setCentralWidget(m_webView); |   setCentralWidget(m_webView); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void MainWindow::fullScreenRequested( | ||||||
|  |     QWebEngineFullScreenRequest fullScreenRequest) { | ||||||
|  |   fullScreenRequest.accept(); | ||||||
|  |   if (fullScreenRequest.toggleOn()) { | ||||||
|  |     m_wasMaximized = isMaximized(); | ||||||
|  |     showFullScreen(); | ||||||
|  |   } else { | ||||||
|  |     m_wasMaximized ? showMaximized() : showNormal(); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void MainWindow::closeEvent(QCloseEvent *event) { QApplication::quit(); } | ||||||
|   | |||||||
| @@ -21,4 +21,9 @@ private: | |||||||
|   QWebEngineView *m_webView; |   QWebEngineView *m_webView; | ||||||
|   QWebEngineProfile *prepareProfile(); |   QWebEngineProfile *prepareProfile(); | ||||||
|   DiscordPage *m_discordPage; |   DiscordPage *m_discordPage; | ||||||
|  |   void closeEvent(QCloseEvent *event) override; | ||||||
|  |   bool m_wasMaximized; | ||||||
|  |  | ||||||
|  | private Q_SLOTS: | ||||||
|  |   void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest); | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -1,5 +1,8 @@ | |||||||
| #include "virtmic.h" | #include "virtmic.h" | ||||||
|  |  | ||||||
|  | #include <rohrkabel/loop/main.hpp> | ||||||
|  | #include <rohrkabel/registry/registry.hpp> | ||||||
|  |  | ||||||
| namespace Virtmic { | namespace Virtmic { | ||||||
|  |  | ||||||
| QVector<QString> getTargets() { | QVector<QString> getTargets() { | ||||||
| @@ -24,7 +27,7 @@ QVector<QString> getTargets() { | |||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       }); |       }); | ||||||
|   core.sync(); |   core.update(); | ||||||
|  |  | ||||||
|   return targets; |   return targets; | ||||||
| } | } | ||||||
| @@ -81,14 +84,21 @@ void start(QString _target) { | |||||||
|  |  | ||||||
|   std::string target = _target.toLatin1().toStdString(); |   std::string target = _target.toLatin1().toStdString(); | ||||||
|  |  | ||||||
|   auto virtual_mic = |   auto virtual_mic = core.create("adapter", | ||||||
|       core.create("adapter", |  | ||||||
|                                  {{"node.name", "discord-screenaudio-virtmic"}, |                                  {{"node.name", "discord-screenaudio-virtmic"}, | ||||||
|                                   {"media.class", "Audio/Source/Virtual"}, |                                   {"media.class", "Audio/Source/Virtual"}, | ||||||
|                                   {"factory.name", "support.null-audio-sink"}, |                                   {"factory.name", "support.null-audio-sink"}, | ||||||
|                                   {"audio.channels", "2"}, |                                   {"audio.channels", "2"}, | ||||||
|                                   {"audio.position", "FL,FR"}}, |                                   {"audio.position", "FL,FR"}}, | ||||||
|                   pipewire::node::type, pipewire::node::version, false); |                                  pipewire::node::type, pipewire::node::version, | ||||||
|  |                                  pipewire::update_strategy::none); | ||||||
|  |  | ||||||
|  |   if (target == "None") { | ||||||
|  |     while (true) { | ||||||
|  |       main_loop.run(); | ||||||
|  |     } | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   auto reg_events = reg.listen<pipewire::registry_listener>(); |   auto reg_events = reg.listen<pipewire::registry_listener>(); | ||||||
|   reg_events.on<pipewire::registry_event::global>( |   reg_events.on<pipewire::registry_event::global>( | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ | |||||||
| #include <QString> | #include <QString> | ||||||
| #include <QVector> | #include <QVector> | ||||||
| #include <iostream> | #include <iostream> | ||||||
| #include <rohrkabel/registry/registry.hpp> |  | ||||||
|  |  | ||||||
| namespace Virtmic { | namespace Virtmic { | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								submodules/rohrkabel
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								submodules/rohrkabel
									
									
									
									
									
										Submodule
									
								
							 Submodule submodules/rohrkabel added at 04bfb921c4
									
								
							
		Reference in New Issue
	
	Block a user