getActiveAnimations().controller.playbackRate = 7; // RIGHT
Brian's main concern: Intermediate object is confusing and MediaController already provides a precedent to deal with this situation.
How media controllers work:
-- children can be paused independently
-- unpausing a child makes it catch up to the group time
-- seeking a child throws an InvalidStateException
-- setting playbackRate on child (closest thing to reversing) is ignored and parent playbackRate is used instead
-- the controller itself can't be repeated or reversed
-- its playback rate can be set and governs all children
-- media controllers can block either by being paused or because a child is blocked (e.g. buffering)
-- then the time won't advance so effectively the children are blocked
How this might look like if we followed this pattern:
-- still have play(), pause() on all items but their behavior differs when they are not at the root (i.e. parent is not document time line)
-- setting currentTime on a slaved child throw InvalidStateException
-- setting playbackRate on a slaved child is ignored
-- reverse() == set playback rate so it's ignored
-- pause() -- defer to the ancestor
TimingGroups are different to MediaControllers in that they maintain strict synchronisation
It's more the blocking behaviour of media elements
Eliminate the need for locallyPaused (which is somewhat confusing)
(A is the PlaybackController proposal, B is the one without--i.e. pause/play on the TimedItem itself)
A: anim.currentTime // read-only
anim.controller.currentTime = 5; // seek
B: anim.currentTime // mutable but throws when not attached to documentTimeSource
A: var anim = new Animation();
anim.attach().play(); // anim.start() might do this (above)
B: var anim = new Animation();
Extended discussion about which is simpler. Some feel that adding a controller clarifies an existing concept and that having, e.g. seeking, behave differently when a TimedItem has a parent group vs when it doesn't is confusing. Others feel introducing the concept of a controller adds complexity since the concept doesn't already exist, and that aligning with MediaController provides intuitive behavior.
Further discussion about the following case:
var cont = anim.getController(); // Looks up the hierarchy to get the playback controller
// cont.pause() no longer has any effect
Discussed that the controller might still be re-used, e.g. to substitute in an alternative animation that picks up where the previous one left off.
Also, there was the suggestion that authors should be encouraged to interact primarily with controllers, and not the animations themselves.
Concern about this lead to the following action...
➙ Shane to write up yet another (BRAND NEW AND NEVER EVER EVER SEEN BEFORE) approach which uses the terms "Animation", "TimingGroup" and "TimedEffect".