wakelock experiment

This commit is contained in:
2025-12-29 17:04:08 +02:00
parent 09c03ec780
commit 644d6f0106
2 changed files with 97 additions and 4 deletions

View File

@@ -25,6 +25,9 @@
window.innerWidth < 768);
const vizSize = isMobile ? 280 : 400;
// Screen Wake Lock to prevent screen from sleeping during playback
let wakeLock: WakeLockSentinel | null = null;
// Audio components
let noiseSynth: Tone.NoiseSynth | null = null;
let reverb: Tone.Reverb | null = null;
@@ -68,6 +71,36 @@
return Math.max(0.2, Math.min(0.7, (speed / 20) * 0.5 + 0.2));
});
// Request wake lock to prevent screen from sleeping
const requestWakeLock = async (): Promise<void> => {
try {
if ('wakeLock' in navigator) {
wakeLock = await navigator.wakeLock.request('screen');
console.log('Wake Lock is active (Air Quality)');
// Handle wake lock release (e.g., when tab is hidden)
wakeLock.addEventListener('release', () => {
console.log('Wake Lock was released (Air Quality)');
});
}
} catch (err) {
console.error('Failed to request wake lock:', err);
}
};
// Release wake lock
const releaseWakeLock = async (): Promise<void> => {
if (wakeLock !== null) {
try {
await wakeLock.release();
wakeLock = null;
console.log('Wake Lock released (Air Quality)');
} catch (err) {
console.error('Failed to release wake lock:', err);
}
}
};
// Initialize audio components
const initializeAudio = async (): Promise<void> => {
try {
@@ -140,6 +173,9 @@
Tone.getTransport().start();
}
// Request wake lock to prevent screen sleep
await requestWakeLock();
isPlaying = true;
} catch (error) {
console.error('Error starting air quality loop:', error);
@@ -147,7 +183,7 @@
};
// Stop the loop
const stopLoop = (): void => {
const stopLoop = async (): Promise<void> => {
if (loop) {
loop.stop();
loop.dispose();
@@ -155,6 +191,9 @@
}
// Don't stop transport - let WeatherGen control it
isPlaying = false;
// Release wake lock when stopping
await releaseWakeLock();
};
// Toggle playback
@@ -210,6 +249,10 @@
if (loop && loop.state !== 'started') {
loop.start(0);
}
// Re-request wake lock if it was released
if (wakeLock === null) {
await requestWakeLock();
}
}
};
@@ -220,7 +263,10 @@
};
});
onDestroy(() => {
onDestroy(async () => {
// Release wake lock on component destroy
await releaseWakeLock();
if (loop) {
loop.dispose();
}

View File

@@ -37,6 +37,9 @@
window.innerWidth < 768);
const vizSize = isMobile ? 280 : 400;
// Screen Wake Lock to prevent screen from sleeping during playback
let wakeLock: WakeLockSentinel | null = null;
// Audio components
let synth: Tone.PolySynth | null = null;
let arpSynth: Tone.Synth | null = null;
@@ -154,6 +157,36 @@
return '16n';
});
// Request wake lock to prevent screen from sleeping
const requestWakeLock = async (): Promise<void> => {
try {
if ('wakeLock' in navigator) {
wakeLock = await navigator.wakeLock.request('screen');
console.log('Wake Lock is active');
// Handle wake lock release (e.g., when tab is hidden)
wakeLock.addEventListener('release', () => {
console.log('Wake Lock was released');
});
}
} catch (err) {
console.error('Failed to request wake lock:', err);
}
};
// Release wake lock
const releaseWakeLock = async (): Promise<void> => {
if (wakeLock !== null) {
try {
await wakeLock.release();
wakeLock = null;
console.log('Wake Lock released');
} catch (err) {
console.error('Failed to release wake lock:', err);
}
}
};
// Initialize audio components
const initializeAudio = async (): Promise<void> => {
try {
@@ -308,6 +341,10 @@
bassSequence.start(0);
Tone.getTransport().start();
// Request wake lock to prevent screen sleep
await requestWakeLock();
isPlaying = true;
} catch (error) {
console.error('Error starting sequence:', error);
@@ -315,7 +352,7 @@
};
// Stop the sequence
const stopSequence = (): void => {
const stopSequence = async (): Promise<void> => {
if (sequence) {
sequence.stop();
sequence.dispose();
@@ -339,6 +376,9 @@
Tone.getTransport().stop();
Tone.getTransport().cancel();
isPlaying = false;
// Release wake lock when stopping
await releaseWakeLock();
};
// Toggle playback
@@ -415,6 +455,10 @@
if (Tone.getTransport().state !== 'started') {
Tone.getTransport().start();
}
// Re-request wake lock if it was released
if (wakeLock === null) {
await requestWakeLock();
}
}
};
@@ -425,7 +469,10 @@
};
});
onDestroy(() => {
onDestroy(async () => {
// Release wake lock on component destroy
await releaseWakeLock();
if (sequence) {
sequence.dispose();
}