Files
2026-09-01 20:05:00 +03:00

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()
}