Files
engine/wait-tracks.go

90 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package engine
import (
. "m7s.live/engine/v4/common"
"m7s.live/engine/v4/track"
"m7s.live/engine/v4/util"
)
type waitTrackNames []string
// Waiting是否正在等待
func (w waitTrackNames) Waiting() bool {
return w != nil
}
// Waitany 是否等待任意的
func (w waitTrackNames) Waitany() bool {
return len(w) == 0
}
// Wait 设置需要等待的名称,空数组为等待任意的
func (w *waitTrackNames) Wait(names ...string) {
if names == nil {
*w = make([]string, 0)
} else {
*w = names
}
}
// StopWait 不再需要等待了
func (w *waitTrackNames) StopWait() {
*w = nil
}
// Accept 检查名称是否在等待候选项中
func (w *waitTrackNames) Accept(name string) bool {
if !w.Waiting() {
return false
}
if w.Waitany() {
w.StopWait()
return true
} else {
for _, n := range *w {
if n == name {
w.StopWait()
return true
}
}
}
return false
}
type waitTracks struct {
*util.Promise[ISubscriber] // 等待中的Promise
audio waitTrackNames
video waitTrackNames
data waitTrackNames
}
// NeedWait 是否需要等待Track
func (w *waitTracks) NeedWait() bool {
return w.audio.Waiting() || w.video.Waiting() || w.data.Waiting()
}
// Accept 有新的Track来到检查是否可以不再需要等待了
func (w *waitTracks) Accept(t Track) bool {
suber := w.Promise.Value
switch t.(type) {
case *track.Audio:
if w.audio.Accept(t.GetBase().Name) {
suber.OnEvent(t)
}
case *track.Video:
if w.video.Accept(t.GetBase().Name) {
suber.OnEvent(t)
}
case *track.Data:
if w.data.Accept(t.GetBase().Name) {
suber.OnEvent(t)
}
}
if w.NeedWait() {
return false
} else {
w.Resolve()
return true
}
}