Files
2026-05-27 23:29:53 +01:00

3.0 KiB

Add @suaveplan/audio-ir-room-plugin-club

Package: @suaveplan/audio-ir-room-plugin-club Status: PROPOSED Type: new-package

Why

Genesis-original IR content package. Ships the club1.wav and club2.wav room impulse responses (from /mnt/c/Users/Administrator/Mountain Duck/74a17879-9780-426d-8bd9-7ed805f53d41/media/_/audio/ir/room/) as bundle-local assets resolved through the shipped @suaveplan/storage-uri-plugin-bundle. Serves as the canonical example of the bundle-only content-package pattern — every future audio-ir-{family}-plugin-<name> package that ships only local files follows this shape.

What changes

  • ADDED: manifest: IrManifest — { packageSlug: "club", family: "room", entries: [<club-club1>, <club-club2>] }.
  • ADDED: register(registry: IrRegistry, resolver: StorageUriResolver): void — registers the package-scoped bundleUriPlugin on the resolver AND calls registerManifest(registry, manifest).
  • ADDED: files/club1.wav AND files/club2.wav — bundled binary assets, package-included in tarball.
  • ADDED: entries ids club-club1 and club-club2, each with uri: "bundle://audio-ir-room-plugin-club/club1.wav" (and club2.wav).

Out of scope

  • Decoding — audio-ir-loader owns it. This package only registers manifest entries.
  • Any non-room IRs — separate packages per family per source.
  • Multi-source fallback — these IRs are bundle-only by design; the pool package demonstrates the fallback pattern.

Source mapping

Files copied from /mnt/c/Users/Administrator/Mountain Duck/74a17879-9780-426d-8bd9-7ed805f53d41/media/_/audio/ir/room/club{1,2}.wav (Mountain Duck media library). Cross-cutting model: openspec/changes/add-audio-ir-core/design.md.

Requirements with no source line

Requirement Justification
every spec requirement Genesis-original content package

Verification approach

  • src/manifest/manifest.test.ts — manifest parses successfully through IrManifestSchema; every entry's id matches the slug-prefix rule; both uri values parse as well-formed bundle:// URIs.
  • src/register/register.test.ts — register(registry, resolver) (a) adds a bundleUriPlugin for audio-ir-room-plugin-club to the resolver and (b) registers both manifest entries; double-call throws AUDIO_IR.DUPLICATE_ID (the registry's invariant).
  • tests/integration/end-to-end.test.ts — wire bundleUriPlugin into a real StorageUriResolver, register via register(...), pass to createIrLoader({ ..., decoders: { wav: decodeWav } }), call loader.load("club-club1"), assert non-empty Float32Array channels with the manifest-declared shape. Run identically for club-club2.
  • tests/integration/file-presence.test.ts — assert files/club1.wav and files/club2.wav exist on disk at build time and are non-empty.

Impact

Affected dependents

No dependents (brand new). Verified by bunx turbo ls --filter=...@suaveplan/audio-ir-room-plugin-club returning only the package itself.