display video worker status
This commit is contained in:
+30
-3
@@ -397,6 +397,7 @@ func main() {
|
|||||||
// Reconnect requests from GUI or automatic retry
|
// Reconnect requests from GUI or automatic retry
|
||||||
control := make(chan reconnectParams, 1)
|
control := make(chan reconnectParams, 1)
|
||||||
videoBridge := playback.NewVideoBridge()
|
videoBridge := playback.NewVideoBridge()
|
||||||
|
statusStore := playback.NewStatusStore()
|
||||||
|
|
||||||
videoWorker, err := playback.NewVideoWorker(
|
videoWorker, err := playback.NewVideoWorker(
|
||||||
mxladapter.VideoFactory{},
|
mxladapter.VideoFactory{},
|
||||||
@@ -404,6 +405,7 @@ func main() {
|
|||||||
retryPolicy,
|
retryPolicy,
|
||||||
mxladapter.ShouldRetry,
|
mxladapter.ShouldRetry,
|
||||||
func(status playback.Status) {
|
func(status playback.Status) {
|
||||||
|
statusStore.Observe(status)
|
||||||
if status.Err != nil {
|
if status.Err != nil {
|
||||||
log.Printf(
|
log.Printf(
|
||||||
"video: state=%v attempt=%d failed=%d: %v",
|
"video: state=%v attempt=%d failed=%d: %v",
|
||||||
@@ -891,11 +893,36 @@ func main() {
|
|||||||
}
|
}
|
||||||
if useVideoSlot {
|
if useVideoSlot {
|
||||||
if videoActive {
|
if videoActive {
|
||||||
cimgui.Text("Video state: active")
|
cimgui.Text("Video desired: active")
|
||||||
} else if videoStr != "" {
|
} else if videoStr != "" {
|
||||||
cimgui.Text("Video state: stopped")
|
cimgui.Text("Video desired: stopped")
|
||||||
} else {
|
} else {
|
||||||
cimgui.Text("Video state: not configured")
|
cimgui.Text("Video desired: not configured")
|
||||||
|
}
|
||||||
|
|
||||||
|
if status, ok := statusStore.Snapshot(playback.UnitVideo); ok {
|
||||||
|
cimgui.Text(fmt.Sprintf(
|
||||||
|
"Video actual: %s",
|
||||||
|
status.State,
|
||||||
|
))
|
||||||
|
cimgui.Text(fmt.Sprintf(
|
||||||
|
"Attempt: %d, failed: %d",
|
||||||
|
status.Attempt,
|
||||||
|
status.FailedAttempts,
|
||||||
|
))
|
||||||
|
|
||||||
|
if status.RetryIn > 0 {
|
||||||
|
cimgui.Text(fmt.Sprintf(
|
||||||
|
"Retry in: %s",
|
||||||
|
status.RetryIn.Round(time.Millisecond),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
if status.Err != nil {
|
||||||
|
cimgui.TextWrapped(status.Err.Error())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cimgui.Text("Video actual: not started")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cimgui.End()
|
cimgui.End()
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Size=200,200
|
|||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][Connection]
|
[Window][Connection]
|
||||||
Pos=285,503
|
Pos=202,343
|
||||||
Size=681,205
|
Size=799,226
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
package playback
|
package playback
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type Unit uint8
|
type Unit uint8
|
||||||
|
|
||||||
@@ -31,3 +34,35 @@ type Status struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type StatusObserver func(Status)
|
type StatusObserver func(Status)
|
||||||
|
|
||||||
|
func (u Unit) String() string {
|
||||||
|
switch u {
|
||||||
|
case UnitVideo:
|
||||||
|
return "video"
|
||||||
|
case UnitAudio:
|
||||||
|
return "audio"
|
||||||
|
case UnitSync:
|
||||||
|
return "sync"
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("Unit(%d)", uint8(u))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s State) String() string {
|
||||||
|
switch s {
|
||||||
|
case StateIdle:
|
||||||
|
return "idle"
|
||||||
|
case StateConnecting:
|
||||||
|
return "connecting"
|
||||||
|
case StatePlaying:
|
||||||
|
return "playing"
|
||||||
|
case StateReconnecting:
|
||||||
|
return "reconnecting"
|
||||||
|
case StateFailed:
|
||||||
|
return "failed"
|
||||||
|
case StateStopping:
|
||||||
|
return "stopping"
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("State(%d)", uint8(s))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,3 +38,42 @@ func TestStatusPreservesValues(t *testing.T) {
|
|||||||
t.Errorf("RetryIn = %s, want %s", status.RetryIn, time.Second)
|
t.Errorf("RetryIn = %s, want %s", status.RetryIn, time.Second)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUnitString(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
unit Unit
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{unit: UnitVideo, want: "video"},
|
||||||
|
{unit: UnitAudio, want: "audio"},
|
||||||
|
{unit: UnitSync, want: "sync"},
|
||||||
|
{unit: Unit(255), want: "Unit(255)"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
if got := tt.unit.String(); got != tt.want {
|
||||||
|
t.Errorf("Unit(%d).String() = %q, want %q", tt.unit, got, tt.want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStateString(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
state State
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{state: StateIdle, want: "idle"},
|
||||||
|
{state: StateConnecting, want: "connecting"},
|
||||||
|
{state: StatePlaying, want: "playing"},
|
||||||
|
{state: StateReconnecting, want: "reconnecting"},
|
||||||
|
{state: StateFailed, want: "failed"},
|
||||||
|
{state: StateStopping, want: "stopping"},
|
||||||
|
{state: State(255), want: "State(255)"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
if got := tt.state.String(); got != tt.want {
|
||||||
|
t.Errorf("State(%d).String() = %q, want %q", tt.state, got, tt.want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user