Files
engine/track/data.go

46 lines
766 B
Go

package track
import (
"context"
"sync"
"time"
. "m7s.live/engine/v4/common"
"m7s.live/engine/v4/util"
)
type Data struct {
Base
LockRing[any]
sync.Locker // 写入锁,可选,单一协程写入可以不加锁
}
func (d *Data) ReadRing() *LockRing[any] {
return util.Clone(d.LockRing)
}
func (d *Data) LastWriteTime() time.Time {
return d.LockRing.RingBuffer.LastValue.Timestamp
}
func (dt *Data) Push(data any) {
if dt.Locker != nil {
dt.Lock()
defer dt.Unlock()
}
dt.Write(data)
}
func (d *Data) Play(ctx context.Context, onData func(any) error) error {
for r := d.ReadRing(); ctx.Err() == nil; r.MoveNext() {
p := r.Read()
if *r.Flag == 2 {
break
}
if err := onData(p); err != nil {
return err
}
}
return ctx.Err()
}