@startuml header DashPlaylistLoader sequences title DashPlaylistLoader sequences: Main Manifest with Alternate Audio Participant "PlaylistController" as PC #red Participant "MainDashPlaylistLoader" as MPL #blue Participant "mainSegmentLoader" as SL #blue Participant "AudioDashPlaylistLoader" as APL #green Participant "audioSegmentLoader" as ASL #green Participant "external server" as ext #brown Participant "mpdParser" as parser #orange Participant "mediaGroups" as MG #purple Participant Tech #lightblue == Initialization == PC -> MPL : construct MainPlaylistLoader PC -> MPL: load() == Requesting Main Manifest == MPL -> MPL : start() MPL -> ext: xhr request for main manifest ext -> MPL : response with main manifest MPL -> parser: parse manifest parser -> MPL: object representing manifest note over MPL #lightblue: trigger 'loadedplaylist' == Requesting Video Manifest == note over MPL #lightblue: handling loadedplaylist MPL -> MPL: media(x) alt if no sidx note over MPL #lightgray: zero delay to fake network request else if sidx break MPL -> ext: request sidx end end note over MPL #lightblue: trigger 'loadedmetadata' on main loader [T1] note over MPL #lightblue: handling 'loadedmetadata' opt vod and preload !== 'none' MPL -> SL: playlist() MPL -> SL: load() end == Initializing Media Groups, Choosing Active Tracks == MPL -> MG: setupMediaGroups() MG -> MG: initialize() == Initializing Alternate Audio Loader == MG -> APL: create child playlist loader for alt audio MG -> MG: activeGroup and audio variant selected MG -> MG: enable activeTrack, onTrackChanged() MG -> ASL: reset audio segment loader == Requesting Alternate Audio Manifest == MG -> MG: startLoaders() MG -> APL: load() APL -> APL: start() APL -> APL: zero delay to fake network request break finish pending tasks MG -> Tech: add audioTrack MPL -> PC: setupSourceBuffers_() MPL -> PC: setupFirstPlay() loop mainSegmentLoader.monitorBufferTick_() SL -> ext: requests media segments ext -> SL: response with media segment bytes end end APL -> APL: zero delay over APL -> APL: media(x) alt if no sidx note over APL #lightgray: zero delay to fake network request else if sidx break MPL -> ext: request sidx end end == Requesting Alternate Audio Segments == note over APL #lightblue: trigger 'loadedplaylist' note over APL #lightblue: handling 'loadedplaylist' APL -> ASL: playlist() note over ASL #lightblue: trigger 'loadedmetadata' [T2] note over APL #lightblue: handling 'loadedmetadata' APL -> ASL: playlist() APL -> ASL: load() loop audioSegmentLoader.monitorBufferTick_() ASL -> ext: requests media segments ext -> ASL: response with media segment bytes end @enduml