volume-booster/content.js

47 lines
1.4 KiB
JavaScript

let gainNode = null;
let audioCtx = null;
let sourceMap = new WeakMap();
function setVolume(percent) {
const factor = percent / 100;
document.querySelectorAll('video, audio').forEach(el => {
if (!sourceMap.has(el)) {
if (!audioCtx) {
audioCtx = new AudioContext();
}
try {
const src = audioCtx.createMediaElementSource(el);
const gain = audioCtx.createGain();
src.connect(gain);
gain.connect(audioCtx.destination);
sourceMap.set(el, gain);
} catch (e) {
// Element bereits in einem anderen Context
return;
}
}
sourceMap.get(el).gain.value = factor;
});
}
// Beim Laden: gespeicherten Wert anwenden
chrome.storage.local.get('volume', ({ volume }) => {
if (volume !== undefined) setVolume(volume);
});
// Auf Nachrichten vom Popup hören
chrome.runtime.onMessage.addListener(({ volume }) => {
if (volume !== undefined) setVolume(volume);
});
// Neue Media-Elemente automatisch erfassen
const observer = new MutationObserver(() => {
chrome.storage.local.get('volume', ({ volume }) => {
if (volume !== undefined && volume !== 100) {
setVolume(volume);
}
});
});
observer.observe(document.body, {
childList: true, subtree: true
});