- Run all audio in a single process.
- Instead of a main audio process connected to the backend and one process per opened project.
- Audio engine is composed of a tree of 'realms', with the top-level realm hooked up to the
backend, and each project creates a sub-realm.
- Run plugins in a separate process, isolated from the main audio engine.
- Turns out I really want to support the LV2 instance access feature, so UIs need to run in the
same process as the plugin itself.
- So plugins need to be isolated from each other, so they can use different UI toolkits without
linker symbol clashes. I.e. they can't all run in the main audio process.
- Separate audio processing from the project process.
- Instead of generating MIDI events from the project and route them to the audio pipeline, have
processors in the pipeline, which capture the full state of the project and emit events during
playback. Changes to the project update those processors to keep them in sync.
- Use protocol buffers for a lot of internal messages in non-realtime contexts.
- Very basic support for LV2 plugin UIs.
- Trying to get that working triggered all those changes above...
- And many, many more changes...
- All pylint messages are collected and emitted at the end.
- Always run pylint with default settings (unless the file is marked with 'skip-file').
Filtering the messages happens later.
- Files with lots of pylint issues are marked as 'pylint-unclean'
- pylint only complains about whitelisted issues for these files (unless --pedantic=false).
- fail the test if a file that is marked as unclean turns out to not have many issues after all.
- And finally: fix all issues reported in --pedantic=false mode.
There are probably issues, when the user tries to close the tab while the project is still loading.
Can't test this now, because opening more than one tab doesn't even work...
Now delegates all methods/properties to a context object. It's easier to inject a TestContext
object, than using a TestMixin (which needed those separate *Impl classes).
- EditorWindow geometry (again).
- Settings window state and geometry (again).
- SheetEditor scroll position and scale (y_offset not working for some reason).
- Don't use QGraphicsView anymore. It was convenient, but got very slow for large sheets.
- Use widgets with custom paint method, just painting what's on the screen.
- Split sheet view into three separate widgets:
- SheetEditor with the sheet itself
- Static TimeLine at the top.
- Static TrackList at the left (not yet used for much).
- Rendering of Score measures is somewhat degraded...
- Batching of updates has been removed, but doesn't seem to be needed right now (Qt's batching of widget updates seems to do the trick well enough).
- Created separate package for SheetView related classes.
- I'm a slacker re unittests :(
- Player is per sheet (to make playback state management easier later on).
- Pipeline changes are tunneled through the Sheet object to each connected player.
- SheetView in the UI creates and owns the server-side player.
Needs async setup/cleanup for some UI objects.
Fix/comment-out tests.