86a9d344e6
Add the foundation for audio processing filters, mirroring the existing picture filter/postprocessing template system: - AudioFilter base class, AudioFilterRegistry, AudioFilterOptionDef - AudioProcessingTemplate dataclass + SQLite-backed store - audio_filter_template meta-filter with recursive resolution - Full REST API: CRUD templates + filter registry discovery - Dependency injection wired in dependencies.py and main.py
4.4 KiB
4.4 KiB
Phase 3: Processed Audio Source Model
Status: ⬜ Not Started Parent plan: PLAN.md Domain: backend
Objective
Add the ProcessedAudioSource type, rename MultichannelAudioSource to CaptureAudioSource, remove MonoAudioSource and BandExtractAudioSource, and update the store's resolution logic.
Tasks
- Task 1: Rename
MultichannelAudioSource→CaptureAudioSourceinstorage/audio_source.py- Change class name, update
source_typedefault to"capture" - Same fields:
device_index,is_loopback,audio_template_id
- Change class name, update
- Task 2: Add
ProcessedAudioSourcedataclass instorage/audio_source.py- Fields:
audio_source_id: str(input source),audio_processing_template_id: str source_type="processed"- Inherits standard base fields (id, name, description, tags, created_at, updated_at)
- Fields:
- Task 3: Remove
MonoAudioSourceclass entirely - Task 4: Remove
BandExtractAudioSourceclass entirely - Task 5: Update
create_audio_source()factory function to handle new types - Task 6: Update
AudioSourceStoreresolution logic:resolve_audio_source()now returns: device info (from CaptureAudioSource at chain end) + ordered list of filter chains (from AudioProcessingTemplates along the chain)- Walk chain: ProcessedAudioSource → ... → CaptureAudioSource
- Collect all audio_processing_template_ids in order
- Cycle detection for ProcessedAudioSource chains
- Task 7: Update
ResolvedAudioSourcedataclass:- Remove
channelandfreq_low/freq_highfields (handled by filters now) - Add
filter_instances: List[FilterInstance]— flattened, ordered list of all filters to apply - Or add
template_ids: List[str]and resolve at runtime
- Remove
- Task 8: Update reference validation in store:
ProcessedAudioSource.audio_source_idmust reference an existing audio sourceProcessedAudioSource.audio_processing_template_idmust reference an existing template- Delete checks: can't delete a source referenced by another ProcessedAudioSource
- Delete checks: can't delete a template referenced by a ProcessedAudioSource
- Task 9: Update API schemas in
api/schemas/audio_sources.py- Remove
MonoAudioSourceCreate/Update/Responseschemas - Remove
BandExtractAudioSourceCreate/Update/Responseschemas - Add
CaptureAudioSourceCreate/Update/Response(rename from Multichannel) - Add
ProcessedAudioSourceCreate/Update/Response - Update discriminated union to use new type literals
- Remove
- Task 10: Update API routes in
api/routes/audio_sources.py- Handle new source types in create/update endpoints
- Remove handling of old types
- Update WebSocket test endpoint to work with ProcessedAudioSource
- Task 11: Update any imports/references across the codebase that reference the old types
Files to Modify/Create
storage/audio_source.py— modify — rename, add, remove dataclassesstorage/audio_source_store.py— modify — new resolution logic, validationapi/schemas/audio_sources.py— modify — new schemasapi/routes/audio_sources.py— modify — handle new types- Any files importing
MultichannelAudioSource,MonoAudioSource,BandExtractAudioSource— modify
Acceptance Criteria
CaptureAudioSourcereplacesMultichannelAudioSource(same behavior, new name/type)ProcessedAudioSourcecan be created referencing a source + templateMonoAudioSourceandBandExtractAudioSourceare fully removed- Chain resolution walks ProcessedAudioSource → ... → CaptureAudioSource correctly
- Cycle detection prevents circular source references
- Reference validation prevents dangling references
- API accepts/returns new type discriminators
Notes
- Clean-slate: no migration of existing data. Old source type records will be lost.
- The
source_typestring changes from"multichannel"to"capture"— this is a breaking change but acceptable for clean-slate. ResolvedAudioSourceis consumed byAudioColorStripStreamandAudioValueStream— they will need updates in Phase 4.- Template reference checks in the store need coordination with
AudioProcessingTemplateStore— may need to pass it as a dependency.
Review Checklist
- All tasks completed
- Code follows project conventions
- No unintended side effects
- Build passes
- Tests pass (new + existing)