fix(stage-tamagotchi,stage-shared): correctly route beat-sync events

This commit is contained in:
Makito
2025-11-30 03:31:58 +09:00
parent 078e604795
commit c9d148f992
7 changed files with 64 additions and 35 deletions
+1
View File
@@ -23,6 +23,7 @@
},
"devDependencies": {
"@electron-toolkit/preload": "^3.0.2",
"@moeru/eventa": "^0.3.0",
"@nekopaw/tempora": "0.3.1-alpha.1"
}
}
+15 -10
View File
@@ -2,29 +2,30 @@ import type { Analyser, AnalyserBeatEvent, AnalyserWorkletParameters } from '@ne
import analyserWorklet from '@nekopaw/tempora/worklet?url'
import { defineInvokeEventa } from '@moeru/eventa'
import { startAnalyser as startTemporaAnalyser } from '@nekopaw/tempora'
import { StageEnvironment } from './environment'
export interface DetectorEventMap {
export interface BeatSyncDetectorEventMap {
stateChange: (isActive: boolean) => void
beat: (e: AnalyserBeatEvent) => void
}
export interface Detector {
export interface BeatSyncDetector {
start: (createSource: (context: AudioContext) => Promise<AudioNode>) => Promise<void>
updateParameters: (params: Partial<AnalyserWorkletParameters>) => void
startScreenCapture: () => Promise<void>
stop: () => void
on: <E extends keyof DetectorEventMap>(event: E, listener: DetectorEventMap[E]) => void
off: <E extends keyof DetectorEventMap>(event: E, listener: DetectorEventMap[E]) => void
on: <E extends keyof BeatSyncDetectorEventMap>(event: E, listener: BeatSyncDetectorEventMap[E]) => void
off: <E extends keyof BeatSyncDetectorEventMap>(event: E, listener: BeatSyncDetectorEventMap[E]) => void
readonly isActive: boolean
readonly context: AudioContext | undefined
readonly analyser: Analyser | undefined
readonly source: AudioNode | undefined
}
export type CreateDetectorOptions = |
export type CreateBeatSyncDetectorOptions = |
{
env: StageEnvironment.Tamagotchi
enableLoopbackAudio: () => Promise<any>
@@ -34,7 +35,7 @@ export type CreateDetectorOptions = |
env: StageEnvironment.Web
}
export function createDetector(options: CreateDetectorOptions): Detector {
export function createBeatSyncDetector(options: CreateBeatSyncDetectorOptions): BeatSyncDetector {
let context: AudioContext | undefined
let analyser: Analyser | undefined
let source: AudioNode | undefined
@@ -42,12 +43,12 @@ export function createDetector(options: CreateDetectorOptions): Detector {
let stopSource: (() => void) | undefined
const listeners: { [K in keyof DetectorEventMap]: Array<(...args: any) => void> } = {
const listeners: { [K in keyof BeatSyncDetectorEventMap]: Array<(...args: any) => void> } = {
stateChange: [],
beat: [],
}
const emit = <E extends keyof DetectorEventMap>(event: E, ...args: Parameters<DetectorEventMap[E]>) => {
const emit = <E extends keyof BeatSyncDetectorEventMap>(event: E, ...args: Parameters<BeatSyncDetectorEventMap[E]>) => {
listeners[event].forEach(listener => listener(...args))
}
@@ -161,7 +162,7 @@ export function createDetector(options: CreateDetectorOptions): Detector {
updateParameters,
startScreenCapture,
stop,
on: <E extends keyof DetectorEventMap>(event: E, listener: DetectorEventMap[E]) => {
on: <E extends keyof BeatSyncDetectorEventMap>(event: E, listener: BeatSyncDetectorEventMap[E]) => {
switch (event) {
case 'beat':
listeners.beat.push(listener)
@@ -170,7 +171,7 @@ export function createDetector(options: CreateDetectorOptions): Detector {
throw new Error(`Unknown event: ${event}`)
}
},
off: (event, listener) => {
off: <E extends keyof BeatSyncDetectorEventMap>(event: E, listener: BeatSyncDetectorEventMap[E]) => {
switch (event) {
case 'beat': {
const index = listeners.beat.indexOf(listener)
@@ -189,3 +190,7 @@ export function createDetector(options: CreateDetectorOptions): Detector {
get source() { return source },
}
}
export const beatSyncToggle = defineInvokeEventa<void, boolean>('eventa:event:electron:beat-sync:toggle')
export const beatSyncRequestSignalBeat = defineInvokeEventa<void, AnalyserBeatEvent>('eventa:event:electron:beat-sync:request-signal-beat')
export const beatSyncSignalBeat = defineInvokeEventa<void, AnalyserBeatEvent>('eventa:event:electron:beat-sync:signal-beat')