fix(stage-tamagotchi): move beat-sync code from preload to renderer

This commit is contained in:
Makito
2025-11-29 19:34:23 +09:00
parent a73c919514
commit bb23e7ca7e
3 changed files with 42 additions and 41 deletions
+2 -41
View File
@@ -1,42 +1,3 @@
import { electronAPI } from '@electron-toolkit/preload'
import { defineInvoke, defineInvokeHandler } from '@moeru/eventa'
import { createContext } from '@moeru/eventa/adapters/electron/renderer'
import { createDetector, StageEnvironment } from '@proj-airi/stage-shared'
import { ipcRenderer } from 'electron'
import { expose } from './shared'
import { beatSyncSignalBeat, beatSyncToggle } from '../shared/eventa'
import { exposeWithCustomAPI } from './shared'
const context = createContext(electronAPI.ipcRenderer).context
const signalBeat = defineInvoke(context, beatSyncSignalBeat)
function enableLoopbackAudio() {
return ipcRenderer.invoke('enable-loopback-audio')
}
function disableLoopbackAudio() {
return ipcRenderer.invoke('disable-loopback-audio')
}
const detector = createDetector({
env: StageEnvironment.Tamagotchi,
enableLoopbackAudio,
disableLoopbackAudio,
})
detector.on('beat', () => signalBeat())
defineInvokeHandler(context, beatSyncToggle, async (enabled) => {
if (enabled) {
detector.startScreenCapture()
}
else {
detector.stop()
}
})
exposeWithCustomAPI({
enableLoopbackAudio,
disableLoopbackAudio,
detector,
})
expose()
@@ -27,5 +27,6 @@
<body>
<div class="center">Open the DevTools to troubleshoot BeatSync</div>
<script type="module" src="/beat-sync.main.ts"></script>
</body>
</html>
@@ -0,0 +1,39 @@
import { defineInvoke, defineInvokeHandler } from '@moeru/eventa'
import { createContext } from '@moeru/eventa/adapters/electron/renderer'
import { createDetector, StageEnvironment } from '@proj-airi/stage-shared'
import { beatSyncSignalBeat, beatSyncToggle } from '../shared/eventa'
const { ipcRenderer } = window.electron
const context = createContext(ipcRenderer).context
const signalBeat = defineInvoke(context, beatSyncSignalBeat)
function enableLoopbackAudio() {
// electron-audio-loopback currently registers this handler internally
return ipcRenderer.invoke('enable-loopback-audio')
}
function disableLoopbackAudio() {
// electron-audio-loopback currently registers this handler internally
return ipcRenderer.invoke('disable-loopback-audio')
}
const detector = createDetector({
env: StageEnvironment.Tamagotchi,
enableLoopbackAudio,
disableLoopbackAudio,
})
detector.on('beat', () => signalBeat())
defineInvokeHandler(context, beatSyncToggle, async (enabled) => {
if (enabled) {
detector.startScreenCapture()
}
else {
detector.stop()
}
})
detector.startScreenCapture()