|
58 | 58 | return `${minutes}:${formattedSeconds}`; |
59 | 59 | }; |
60 | 60 |
|
| 61 | + let wakeLock = null; |
| 62 | +
|
| 63 | + const requestWakeLock = async () => { |
| 64 | + if ('wakeLock' in navigator) { |
| 65 | + try { |
| 66 | + wakeLock = await navigator.wakeLock.request('screen'); |
| 67 | + console.log('Wake Lock acquired'); |
| 68 | +
|
| 69 | + wakeLock.addEventListener('release', () => { |
| 70 | + console.log('Wake Lock released'); |
| 71 | + }); |
| 72 | + } catch (err) { |
| 73 | + console.log('Wake Lock request failed:', err); |
| 74 | + } |
| 75 | + } |
| 76 | + }; |
| 77 | +
|
| 78 | + const releaseWakeLock = async () => { |
| 79 | + if (wakeLock) { |
| 80 | + try { |
| 81 | + await wakeLock.release(); |
| 82 | + } catch (err) { |
| 83 | + console.log('Wake Lock release failed:', err); |
| 84 | + } |
| 85 | + wakeLock = null; |
| 86 | + } |
| 87 | + }; |
| 88 | +
|
61 | 89 | let stream; |
62 | 90 | let speechRecognition; |
63 | 91 |
|
|
216 | 244 | mimeType: mineTypes.find((type) => MediaRecorder.isTypeSupported(type)) |
217 | 245 | }); |
218 | 246 |
|
219 | | - mediaRecorder.onstart = () => { |
| 247 | + mediaRecorder.onstart = async () => { |
220 | 248 | console.log('Recording started'); |
221 | 249 | loading = false; |
222 | 250 | startDurationCounter(); |
223 | 251 |
|
| 252 | + await requestWakeLock(); |
| 253 | +
|
224 | 254 | audioChunks = []; |
225 | 255 | analyseAudio(stream); |
226 | 256 | }; |
|
333 | 363 | speechRecognition.stop(); |
334 | 364 | } |
335 | 365 |
|
| 366 | + await releaseWakeLock(); |
| 367 | +
|
336 | 368 | stopDurationCounter(); |
337 | 369 | audioChunks = []; |
338 | 370 | visualizerData = Array(VISUALIZER_BUFFER_LENGTH).fill(0); |
|
354 | 386 | } |
355 | 387 | clearInterval(durationCounter); |
356 | 388 |
|
| 389 | + await releaseWakeLock(); |
| 390 | +
|
357 | 391 | if (stream) { |
358 | 392 | const tracks = stream.getTracks(); |
359 | 393 | tracks.forEach((track) => track.stop()); |
|
376 | 410 | } |
377 | 411 | }; |
378 | 412 |
|
| 413 | + const handleVisibilityChange = async () => { |
| 414 | + if (recording && document.visibilityState === 'visible') { |
| 415 | + await requestWakeLock(); |
| 416 | + } |
| 417 | + }; |
| 418 | +
|
379 | 419 | onMount(() => { |
380 | 420 | window.addEventListener('keydown', handleKeyDown); |
| 421 | + document.addEventListener('visibilitychange', handleVisibilityChange); |
381 | 422 |
|
382 | 423 | // listen to width changes |
383 | 424 | resizeObserver = new ResizeObserver(() => { |
|
396 | 437 |
|
397 | 438 | onDestroy(() => { |
398 | 439 | window.removeEventListener('keydown', handleKeyDown); |
| 440 | + document.removeEventListener('visibilitychange', handleVisibilityChange); |
| 441 | + releaseWakeLock(); |
399 | 442 | // remove resize observer |
400 | 443 | resizeObserver.disconnect(); |
401 | 444 | }); |
|
0 commit comments