package Ġcom . open av t . core . hubs Ċ Ċ import Ġcom . open av t . core . O AV T Instrument Ċ import Ġcom . open av t . core . interfaces . O AV TH ub Interface Ċ import Ġcom . open av t . core . interfaces . O AV T Tracker Interface Ċ import Ġcom . open av t . core . models . O AV T Action Ċ import Ġcom . open av t . core . models . O AV T Attribute Ċ import Ġcom . open av t . core . models . O AV T Event Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠO AV T Ġhub Ġfor Ġgeneric Ġcontent Ġplayers . Ċ Ġ*/ Ċ open Ġclass ĠO AV TH ub Core Ġ: ĠO AV TH ub Interface Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcount Errors Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcount Starts Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġaccum Pause Time Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġaccum Seek Time Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġaccum Buffer Time Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġlast Buffer Begin In Pause Block Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġlast Buffer Begin In Seek Block Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġstream Id Ġ: ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġplayback Id Ġ: ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtimestamp Of Last Event On Playback Ġ: ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprotected Ġvar Ġinstrument : ĠO AV T Instrument ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Event ( event : ĠO AV T Event , Ġtracker : ĠO AV T Tracker Interface ): ĠO AV T Event ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tracker . state . did Finish ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . did Start Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . is Paused Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . is Buffer ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . is Seek ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . did Finish Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Playback Id ( event ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tracker . state . did Start Ġ&& ! tracker . state . is Paused Ġ&& Ġ! tracker . state . is Seek ing Ġ&& Ġ! tracker . state . is Buffer ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . delta Play Time ] Ġ= ĠSystem . currentTimeMillis () Ġ- Ġtimestamp Of Last Event On Playback ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! accept Or Reject Event ( event , Ġtracker )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOnce Ġwe Ġget Ġhere , Ġthe Ġevent Ġhas Ġbeen Ġaccepted Ġby Ġthe ĠHub ĊĊĠĠĠĠĠĠĠ Ġtimestamp Of Last Event On Playback Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . count Errors ] Ġ= Ġcount Errors ĊĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . count Starts ] Ġ= Ġcount Starts ĊĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . accum Pause Time ] Ġ= Ġaccum Pause Time ĊĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . accum Buffer Time ] Ġ= Ġaccum Buffer Time ĊĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . accum Seek Time ] Ġ= Ġaccum Seek Time ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġcase Ġthe ĠBUFFER _ BEGIN Ġhappens Ġinside Ġa Ġblock , Ġwe Ġwant Ġthe ĠBUFFER _ FIN ISH Ġbe Ġflag ged Ġas Ġbelong ing Ġto Ġthe Ġsame Ġblock , Ġeven Ġif Ġit Ġhappened Ġoutside Ġof Ġit ĊĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠO AV T Action . Buffer Finish ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . in Pause Block ] Ġ= Ġlast Buffer Begin In Pause Block ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . in Seek Block ] Ġ= Ġlast Buffer Begin In Seek Block ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . in Pause Block ] Ġ= Ġtracker . state . is Paused ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . in Seek Block ] Ġ= Ġtracker . state . is Seek ing ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . in Buffer Block ] Ġ= Ġtracker . state . is Buffer ing ĊĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . in Playback Block ] Ġ= Ġtracker . state . did Start Ġ&& Ġ! tracker . state . did Finish ĊĊĠĠĠĠĠĠĠ Ġstream Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . stream Id ] Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġplayback Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . attributes [ O AV T Attribute . playback Id ] Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Playback Id ( event ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġevent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinstrument Ready ( instrument : ĠO AV T Instrument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . instrument Ġ= Ġinstrument ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġend Of Service () Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSetup Ġping Ġtimer . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtracker ĠTracker Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġstart Ping ( tracker : ĠO AV T Tracker Interface ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . instrument ?. start Ping ( tracker . tracker Id !! , Ġ 3 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProcess Ġevent , Ġaccepting Ġor Ġreject ing , Ġand Ġmutate Ġstates Ġif Ġnecessary . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠEvent Ġobject . ĊĠĠĠĠ Ġ* Ġ@ param Ġtracker ĠTracker Ġinstance . ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġaccept , Ġfalse Ġif Ġreject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġaccept Or Reject Event ( event : ĠO AV T Event , Ġtracker : ĠO AV T Tracker Interface ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Media Request Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tracker . state . did Media Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . did Media Request Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Player Set Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tracker . state . did Player Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . did Player Set Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Stream Load Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tracker . state . did Stream Load ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . did Stream Load Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream Id Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Start Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tracker . state . did Start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ping ( tracker ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . did Start Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Starts Ġ= Ġcount Starts Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Pause Begin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracker . state . did Start Ġ&& Ġ! tracker . state . is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . is Paused Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Pause Finish Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracker . state . did Start Ġ&& Ġtracker . state . is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . is Paused Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Since Pause Begin Ġ= Ġevent . attributes [ O AV T Action . Pause Begin . time Attribute ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccum Pause Time Ġ= Ġaccum Pause Time Ġ+ Ġ( time Since Pause Begin Ġas ĠLong ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Buffer Begin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tracker . state . is Buffer ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . is Buffer ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Buffer Begin In Pause Block Ġ= Ġtracker . state . is Paused ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Buffer Begin In Seek Block Ġ= Ġtracker . state . is Seek ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Buffer Finish Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracker . state . is Buffer ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . is Buffer ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Since Buffer Begin Ġ= Ġevent . attributes [ O AV T Action . Buffer Begin . time Attribute ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccum Buffer Time Ġ= Ġaccum Buffer Time Ġ+ Ġ( time Since Buffer Begin Ġas ĠLong ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Seek Begin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tracker . state . is Seek ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . is Seek ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Seek Finish Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracker . state . is Seek ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . is Seek ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Since Seek Begin Ġ= Ġevent . attributes [ O AV T Action . Seek Begin . time Attribute ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccum Seek Time Ġ= Ġaccum Seek Time Ġ+ Ġ( time Since Seek Begin Ġas ĠLong ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . End , ĠO AV T Action . Stop , ĠO AV T Action . Next Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracker . state . did Start Ġ&& Ġ! tracker . state . did Finish ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . instrument ?. stop Ping ( tracker . tracker Id !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . state . did Finish Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO AV T Action . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Errors Ġ= Ġcount Errors Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Playback Id ( event : ĠO AV T Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠO AV T Action . Media Request Ġ|| Ġevent . action Ġ== ĠO AV T Action . Stream Load ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playback Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayback Id Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Playback Id ( event : ĠO AV T Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠO AV T Action . End Ġ|| Ġevent . action Ġ== ĠO AV T Action . Stop Ġ|| Ġevent . action Ġ== ĠO AV T Action . Next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayback Id Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }