chore: pause media when launcher is hidden

This commit is contained in:
2026-05-03 17:50:06 +02:00
parent 56608a64fc
commit 6d88c39ce2
2 changed files with 35 additions and 18 deletions
+29 -17
View File
@@ -106,20 +106,19 @@ export function toURL(data: Buffer, type: string) {
} }
export function setGlobalVolume(volume: number) { export function setGlobalVolume(volume: number) {
const audioElements = document.querySelectorAll('audio'); const mediaElements: NodeListOf<HTMLMediaElement> = document.querySelectorAll('audio, video');
audioElements.forEach((audio) => { mediaElements.forEach((element) => {
audio.volume = volume; element.volume = volume;
});
const videoElements = document.querySelectorAll('video');
videoElements.forEach((video) => {
video.volume = volume;
}); });
} }
export function fadeGlobalVolume(volumeFrom: number, volumeTo: number, duration: number) { export function fadeGlobalVolume(
const audioElements = document.querySelectorAll('audio'); volumeFrom: number,
const videoElements = document.querySelectorAll('video'); volumeTo: number,
duration: number,
onDone?: () => void
) {
const mediaElements: NodeListOf<HTMLMediaElement> = document.querySelectorAll('audio, video');
const startTime = performance.now(); const startTime = performance.now();
@@ -130,22 +129,35 @@ export function fadeGlobalVolume(volumeFrom: number, volumeTo: number, duration:
const interpolatedVolume = volumeFrom + (volumeTo - volumeFrom) * progress; const interpolatedVolume = volumeFrom + (volumeTo - volumeFrom) * progress;
audioElements.forEach((audio) => { mediaElements.forEach((element) => {
audio.volume = interpolatedVolume; element.volume = interpolatedVolume;
});
videoElements.forEach((video) => {
video.volume = interpolatedVolume;
}); });
if (progress < 1) { if (progress < 1) {
requestAnimationFrame(animate); requestAnimationFrame(animate);
} else {
if (onDone) onDone();
} }
} }
animate(); animate();
} }
export const pauseGlobalMedia = () => {
const mediaElements: NodeListOf<HTMLMediaElement> = document.querySelectorAll('audio, video');
mediaElements.forEach((element) => element.pause());
};
export const resumeGlobalMedia = () => {
const mediaElements: NodeListOf<HTMLMediaElement> = document.querySelectorAll('audio, video');
mediaElements.forEach((element) => element.play());
};
export const setCurrentTimeGlobalMedia = (time: number) => {
const mediaElements: NodeListOf<HTMLMediaElement> = document.querySelectorAll('audio, video');
mediaElements.forEach((element) => (element.currentTime = time));
};
export function trackMediaContainer(node: HTMLElement) { export function trackMediaContainer(node: HTMLElement) {
const media = new Set<HTMLMediaElement>(); const media = new Set<HTMLMediaElement>();
+6 -1
View File
@@ -56,7 +56,10 @@
formatBytes, formatBytes,
numberHumanReadable, numberHumanReadable,
openURL, openURL,
pauseGlobalMedia,
releaseStreamToReadable, releaseStreamToReadable,
resumeGlobalMedia,
setCurrentTimeGlobalMedia,
urlIsValidImage, urlIsValidImage,
} from '@/utils'; } from '@/utils';
import { fade, fly } from 'svelte/transition'; import { fade, fly } from 'svelte/transition';
@@ -445,7 +448,7 @@
await new Promise((res) => setTimeout(res, 1500)); await new Promise((res) => setTimeout(res, 1500));
launchInfo = 'Launching osu!...'; launchInfo = 'Launching osu!...';
fadeGlobalVolume($custom_theme_volume, 0, 2000); fadeGlobalVolume($custom_theme_volume, 0, 2000, pauseGlobalMedia);
await replaceUIFiles(osuPath, false); await replaceUIFiles(osuPath, false);
await new Promise((res) => setTimeout(res, 1000)); await new Promise((res) => setTimeout(res, 1000));
@@ -557,6 +560,8 @@
cleanup = true; cleanup = true;
launchInfo = 'Cleaning up...'; launchInfo = 'Cleaning up...';
setCurrentTimeGlobalMedia(0);
resumeGlobalMedia();
fadeGlobalVolume(0, $custom_theme_volume, 2000); fadeGlobalVolume(0, $custom_theme_volume, 2000);
await getCurrentWindow().show(); await getCurrentWindow().show();