46 lines
3.0 KiB
Markdown
46 lines
3.0 KiB
Markdown
# 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.
|