Add configurable manifest-driven race audio system

This commit is contained in:
larssand
2026-08-28 13:29:27 +02:00
parent 3f3b410869
commit 5f79228941
22 changed files with 1133 additions and 109 deletions

View File

@@ -29,6 +29,7 @@ function createHarness() {
};
let saveCount = 0;
const overlayEvents = [];
const audioEvents = [];
const deps = {
state,
t: (key) => key,
@@ -42,6 +43,7 @@ function createHarness() {
buildLeaderboard: () => [],
formatLap: (ms) => `${ms}ms`,
announcePassing: () => {},
triggerRaceAudio: (key) => audioEvents.push(key),
saveState: () => { saveCount += 1; },
lastOverlayLeaderKeyBySession: {},
lastOverlayTop3BySession: {},
@@ -52,7 +54,7 @@ function createHarness() {
transponder,
rtc_time: new Date(timestamp).toISOString(),
}, deps, role);
return { state, session, passing, overlayEvents, getSaveCount: () => saveCount };
return { state, session, passing, overlayEvents, audioEvents, getSaveCount: () => saveCount };
}
test("split decoder records intermediate time without changing main lap state", () => {
@@ -93,6 +95,7 @@ test("pit entry and exit create one timed stop without adding laps", () => {
assert.equal(result.pitStops[0].transponder, "123");
assert.equal(result.pitStops[0].exitTransponder, "456");
assert.equal(result.passings.length, 1);
assert.deepEqual(harness.audioEvents, ["entering_pits", "leaving_pits"]);
});
test("connect decoder opens one websocket per enabled role", () => {