novolis-governance / imports-todo/gameengine-audio.md
Import: `Frank.GameEngine.Audio` → Novolis
Policies that keep the org coherent
dotnetgovernancenovolis
Source: D:\frankrepos\Frank.GameEngine\src\Frank.GameEngine.Audio
What
| Area | Types |
|---|---|
| Contract | `IAudioEngine`, `IAudioLibrary`, `IAudioPlayer`, `IAudioPlayer2` |
| Ogg | `Audio.Ogg` — NAudio looping clips |
| MIDI | `Audio.Midi` — `MidiSong`, `SongPlayer`, `TuneLibrary` |
| Console | `Audio.Console` — beep/tone fallback |
Embedded samples ship from Frank.GameEngine.Assets (Audio/Midi/Songs); decouple or duplicate minimal test clips on port.
Why
- No Novolis audio package exists; dogfood apps are silent or ad-hoc.
- Self-contained vertical (NAudio stack); no conflict with math/physics/simulation boundaries.
- Frank
GameEnginedocs requireShutdown()to stop looping audio — pattern worth preserving.
How
Target (choose one)
| Option | Pros |
|---|---|
| **A. `novolis-audio` (new repo)** | Clean dependency island; Raylib + apps consume |
| **B. `novolis-raylib` facet** | Fewer repos; couples audio to graphics host |
Recommendation: A if multiple hosts (Avalonia apps, headless tools) need sound; B if only Raylib games for next 12 months.
Port steps
- Create
Novolis.Audio.Abstractions+Novolis.Audio.NAudio(or single package initially). - Port interfaces and Ogg player first; MIDI second; Console fallback for CI.
- Native/content: pack minimal
.oggundercontentFilesor skip MIDI in v1. - Lifecycle:
IAudioEngine.Start/Stopdocumented for host loop (mirrorGameEngine.Shutdown). - Tests: mock
IAudioPlayer; one integration test optional (skip on headless CI).
Skip
- Tight coupling to
Frank.GameEngine.Corescene loop — apps call audio explicitly.
Acceptance
- At least Ogg play/loop API on GPR.
- No Frank.* package references in Novolis production code.