SQA devlog - week 7
This is the eighth of a series of posts about SQA, my pet audio project. I’m rebuilding it from the ground up, for reasons explained here.
Commit log
- 7802b09 on 2017-05-06: backend: respect volume values, allow live updating
- 4b827d7 on 2017-05-06: ui: make properties expand
- 94c7ae6 on 2017-05-06: ui: add sidebar window for editing, preserve selections
- 898781f on 2017-05-06: ui, backend: add defs as default audio chans, fix window hiding & labels
- 626df70 on 2017-05-06: ui: add drag & drop support for files
- e8f095e on 2017-05-06: ui, core: update all deps, add statusbar
- 27fcc8e on 2017-05-06: ui: use menubars to make things nicer
- 785c69a on 2017-05-06: backend, ui: factor out UI boilerplate, add mixer widget!
- 35fa52e on 2017-04-29: backend: remove obsolete parser code
- ed09850 on 2017-04-29: backend, ui: implement rudimentary action editing, make API more typed
- 1d73e2b on 2017-04-28: backend, ui: switch to OpaqueAction type, rudimentary action list
- ebdfb97 on 2017-04-28: backend, custom-derive: start preparing for actions
- f5f6718 on 2017-04-23: backend: add oscpath for /pong, whoops
- edc2076 on 2017-04-23: backend: use new OscSerde stuff, handle more errors
- 16e3c3d on 2017-04-22: osc-custom-derive: add Default impl for non-annotated fields
- a26e929 on 2017-04-22: backend, osc-custom-derive: introduce new custom derive system
- 2dfde20 on 2017-04-15: ui: add FallibleEntry and PropertyWindow widgets, allow sending to UI
- 917fbf7 on 2017-04-14: ui: let’s add some UI to this project
- cd7a8f5 on 2017-04-12: core: add sqa-ui crate
- 9f1ba71 on 2017-04-12: backend: add reset, duration, pause methods for actions
- ef305ba on 2017-04-11: engine: allow fading the volume linearly
Changes in detail
Yes, I haven’t made a post about this project in quiiiite a long time. My bad. (To be honest, I told you last time that I was bad at this.) However, I do have some pretty exciting improvements & news to make up for that with:
SQA now has a user interface! (again).
So yeah, that’s pretty useful and something we sort of need to make this whole thing work. It uses GTK+ (just like SQAv1), because I couldn’t find anything better, but this time, it’s actually user-friendly:
- we take advantage of normal UI features like menus (gasp) and keyboard shortcuts (scream)
- we have a cool sidebar thing, rather like QLab, where you can edit stuff with pretty sliders and text boxes (instead of a weird command line)
- if they so desire, users can edit multiple actions at once by using the ‘edit separately’ function (wow, an improvement over QLab!)
The code has been kept in a relatively reasonable state this time - last time in SQAv1, we used lots of
Rc<RefCell<T>>
s to share state around, which ended up being ugly and error prone. Now, we just pass messages
around! Yay for message-passing! There isn’t a single RefCell
in sight (there is one Cell
, for the mixer
widget, but that’s it).
It’s important to note, however, that not everything is message-passed - we do employ shared state for things like widgets, where it’s easier to do that than to pass a message. (This sets SQA’s design apart from libraries like relm, which are message-passing-only.)
The addition of a UI to edit stuff (as opposed to, err, sending OSC commands in a terminal) meant that we
had to write a whole bunch of parser code to serialise and deserialise commands & replies into/from OSC
messages. About halfway through that effort, I gave up and automated it using Rust’s new custom derive stuff:
basically, you now pepper your message struct with a whole bunch of #[oscpath="/path/here"]
and similar
annotations, and it’s done.
That’s it for this week; tune in in a few weeks’ time for the next edition!