47 lines
1.4 KiB
JavaScript
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
|
|
});
|