fix(linux): move fallback out of audio-only branch and surface audio downgrade

This commit is contained in:
Amaan
2026-04-27 17:10:12 +05:30
parent 39673f1c65
commit ba89539b3e
+55 -58
View File
@@ -1128,48 +1128,61 @@ export function useScreenRecorder(): UseScreenRecorderReturn {
cursor: "never" as const,
};
if (wantsAudioCapture) {
const acquireLinuxPortalStream = async (withAudio: boolean): Promise<MediaStream> => {
try {
return await mediaDevices.getDisplayMedia({
audio: withAudio,
video: {
displaySurface: "monitor",
width: { ideal: TARGET_WIDTH, max: TARGET_WIDTH },
height: { ideal: TARGET_HEIGHT, max: TARGET_HEIGHT },
frameRate: { ideal: TARGET_FRAME_RATE, max: TARGET_FRAME_RATE },
cursor: "never",
},
selfBrowserSurface: "exclude",
surfaceSwitching: "exclude",
});
}
catch (err) {
console.warn("Linux portal failed, falling back to desktop capture(no audio):", err);
if (withAudio) {
alert("System audio is not supported in fallback mode. Recording will continue without audio.");
}
const sources = await window.electronAPI.getSources({ types: ["screen"] });
if (!sources.length) {
throw new Error("No screen sources available");
}
const source = sources[0];
console.log("Using fallback source:", source);
return await navigator.mediaDevices.getUserMedia({
audio: false, //intentional
video: {
mandatory: {
chromeMediaSource: "desktop",
chromeMediaSourceId: source.id,
maxWidth: TARGET_WIDTH,
maxHeight: TARGET_HEIGHT,
maxFrameRate: TARGET_FRAME_RATE,
},
},
} as any);
}
};
let screenMediaStream: MediaStream;
const useLinuxPortal = selectedSource.id === "screen:linux-portal";
const acquireLinuxPortalStream = async (withAudio: boolean): Promise<MediaStream> => {
try {
return await mediaDevices.getDisplayMedia({
audio: withAudio,
video: {
displaySurface: "monitor",
width: { ideal: TARGET_WIDTH, max: TARGET_WIDTH },
height: { ideal: TARGET_HEIGHT, max: TARGET_HEIGHT },
frameRate: { ideal: TARGET_FRAME_RATE, max: TARGET_FRAME_RATE },
cursor: "never",
},
selfBrowserSurface: "exclude",
surfaceSwitching: "exclude",
});
} catch (err) {
console.warn("Linux portal failed, falling back to desktop capture:", err);
const sources = await window.electronAPI.getSources({ types: ["screen"] });
if (!sources.length) {
throw new Error("No screen sources available");
}
const source = sources[0];
return await navigator.mediaDevices.getUserMedia({
audio: false, //intentional
video: {
mandatory: {
chromeMediaSource: "desktop",
chromeMediaSourceId: source.id,
maxWidth: TARGET_WIDTH,
maxHeight: TARGET_HEIGHT,
maxFrameRate: TARGET_FRAME_RATE,
},
},
} as any);
}
};
if (systemAudioEnabled) {
try {
screenMediaStream = useLinuxPortal
@@ -1273,26 +1286,10 @@ export function useScreenRecorder(): UseScreenRecorderReturn {
} else if (micAudioTrack) {
stream.current.addTrack(micAudioTrack);
}
} else {
const mediaStream = await mediaDevices.getDisplayMedia({
audio: false,
video: {
displaySurface: selectedSource.id?.startsWith("window:")
? "window"
: "monitor",
width: { ideal: TARGET_WIDTH, max: TARGET_WIDTH },
height: { ideal: TARGET_HEIGHT, max: TARGET_HEIGHT },
frameRate: { ideal: TARGET_FRAME_RATE, max: TARGET_FRAME_RATE },
cursor: "never",
},
selfBrowserSurface: "exclude",
surfaceSwitching: "exclude",
});
stream.current = mediaStream;
videoTrack = mediaStream.getVideoTracks()[0];
}
if (!stream.current || !videoTrack) {
throw new Error("Media stream is not available.");
}