66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
package playback
|
|
|
|
import "sync"
|
|
|
|
type StatusStore struct {
|
|
mu sync.RWMutex
|
|
generation uint64
|
|
statuses map[Unit]Status
|
|
}
|
|
|
|
type PlaybackStatusSnapshot struct {
|
|
Generation uint64
|
|
|
|
Video Status
|
|
HasVideo bool
|
|
|
|
Audio Status
|
|
HasAudio bool
|
|
|
|
Sync Status
|
|
HasSync bool
|
|
}
|
|
|
|
func NewStatusStore() *StatusStore {
|
|
return &StatusStore{
|
|
statuses: make(map[Unit]Status),
|
|
}
|
|
}
|
|
|
|
func (s *StatusStore) Observe(status Status) {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
if status.Generation < s.generation {
|
|
return
|
|
}
|
|
if status.Generation > s.generation {
|
|
clear(s.statuses)
|
|
s.generation = status.Generation
|
|
}
|
|
s.statuses[status.Unit] = status
|
|
}
|
|
|
|
func (s *StatusStore) Snapshot(unit Unit) (Status, bool) {
|
|
s.mu.RLock()
|
|
status, ok := s.statuses[unit]
|
|
s.mu.RUnlock()
|
|
return status, ok
|
|
}
|
|
|
|
func (s *StatusStore) SnapshotAll() PlaybackStatusSnapshot {
|
|
s.mu.RLock()
|
|
defer s.mu.RUnlock()
|
|
|
|
snapshot := PlaybackStatusSnapshot{Generation: s.generation}
|
|
snapshot.Video, snapshot.HasVideo = s.statuses[UnitVideo]
|
|
snapshot.Audio, snapshot.HasAudio = s.statuses[UnitAudio]
|
|
snapshot.Sync, snapshot.HasSync = s.statuses[UnitSync]
|
|
return snapshot
|
|
}
|
|
|
|
func (s *StatusStore) Clear(unit Unit) {
|
|
s.mu.Lock()
|
|
delete(s.statuses, unit)
|
|
s.mu.Unlock()
|
|
}
|