@@ -89,16 +89,6 @@ if (process.platform === "linux" && process.env.XDG_SESSION_TYPE === "wayland")
8989 app . commandLine . appendSwitch ( "enable-features" , "UseOzonePlatform,WaylandWindowDecorations" ) ;
9090}
9191
92- // Enable system audio loopback capture on macOS via CoreAudio Taps (Electron 39+).
93- // Without these flags, getDisplayMedia({ audio: "loopback" }) returns a live audio track
94- // that produces only silence (all-zero samples).
95- if ( process . platform === "darwin" ) {
96- app . commandLine . appendSwitch (
97- "enable-features" ,
98- "MacLoopbackAudioForScreenShare,MacSckSystemAudioLoopbackOverride,MacCatapSystemAudioLoopbackCapture"
99- ) ;
100- }
101-
10292// Set desktop filename so Wayland compositors can match windows to the .desktop entry.
10393// This allows XDG portals (e.g. PipeWire) to persist permissions across sessions.
10494if ( process . platform === "linux" ) {
@@ -197,6 +187,7 @@ const WhisperCudaManager = require("./src/helpers/whisperCudaManager");
197187const GoogleCalendarManager = require ( "./src/helpers/googleCalendarManager" ) ;
198188const MeetingProcessDetector = require ( "./src/helpers/meetingProcessDetector" ) ;
199189const AudioActivityDetector = require ( "./src/helpers/audioActivityDetector" ) ;
190+ const AudioTapManager = require ( "./src/helpers/audioTapManager" ) ;
200191const MeetingDetectionEngine = require ( "./src/helpers/meetingDetectionEngine" ) ;
201192const { i18nMain, changeLanguage } = require ( "./src/helpers/i18nMain" ) ;
202193const { ensureYdotool } = require ( "./src/helpers/ensureYdotool" ) ;
@@ -218,6 +209,7 @@ let textEditMonitor = null;
218209let whisperCudaManager = null ;
219210let googleCalendarManager = null ;
220211let meetingDetectionEngine = null ;
212+ let audioTapManager = null ;
221213let ipcHandlers = null ;
222214let globeKeyAlertShown = false ;
223215let authBridgeServer = null ;
@@ -294,6 +286,7 @@ function initializeCoreManagers() {
294286 updateManager . setWindowManager ( windowManager ) ;
295287 windowsKeyManager = new WindowsKeyManager ( ) ;
296288 textEditMonitor = new TextEditMonitor ( ) ;
289+ audioTapManager = new AudioTapManager ( ) ;
297290 windowManager . textEditMonitor = textEditMonitor ;
298291
299292 // IPC handlers must be registered before window content loads
@@ -310,6 +303,7 @@ function initializeCoreManagers() {
310303 whisperCudaManager,
311304 googleCalendarManager,
312305 meetingDetectionEngine,
306+ audioTapManager,
313307 getTrayManager : ( ) => trayManager ,
314308 } ) ;
315309}
@@ -534,28 +528,6 @@ async function startApp() {
534528 }
535529 ) ;
536530
537- // Handle getDisplayMedia() calls from the renderer — auto-select the first
538- // screen source with loopback audio so no system picker dialog is shown.
539- const { desktopCapturer } = require ( "electron" ) ;
540- session . defaultSession . setDisplayMediaRequestHandler ( async ( _request , callback ) => {
541- try {
542- const sources = await desktopCapturer . getSources ( { types : [ "screen" ] } ) ;
543- debugLogger . debug ( "Display media sources" , {
544- count : sources . length ,
545- names : sources . map ( ( s ) => s . name ) ,
546- } ) ;
547- if ( ! sources . length ) {
548- debugLogger . error ( "No screen sources available — System Audio permission may be denied" ) ;
549- callback ( { } ) ;
550- return ;
551- }
552- callback ( { video : sources [ 0 ] , audio : "loopback" } ) ;
553- } catch ( err ) {
554- debugLogger . error ( "Display media handler error" , { error : err . message } ) ;
555- callback ( { } ) ;
556- }
557- } ) ;
558-
559531 windowManager . setActivationModeCache ( environmentManager . getActivationMode ( ) ) ;
560532 windowManager . setFloatingIconAutoHide ( environmentManager . getFloatingIconAutoHide ( ) ) ;
561533 windowManager . setPanelStartPosition ( environmentManager . getPanelStartPosition ( ) ) ;
@@ -1150,6 +1122,9 @@ if (gotSingleInstanceLock) {
11501122 if ( googleCalendarManager ) {
11511123 googleCalendarManager . stop ( ) ;
11521124 }
1125+ if ( audioTapManager ) {
1126+ audioTapManager . stop ( ) . catch ( ( ) => { } ) ;
1127+ }
11531128 if ( ipcHandlers ) {
11541129 ipcHandlers . _cleanupTextEditMonitor ( ) ;
11551130 }
0 commit comments