Refactoring #3

Merged
itten merged 87 commits from refactoring into main 2026-09-01 23:52:36 +03:00
4 changed files with 107 additions and 6 deletions
Showing only changes of commit 743e1680c1 - Show all commits
+30 -3
View File
@@ -397,6 +397,7 @@ func main() {
// Reconnect requests from GUI or automatic retry
control := make(chan reconnectParams, 1)
videoBridge := playback.NewVideoBridge()
statusStore := playback.NewStatusStore()
videoWorker, err := playback.NewVideoWorker(
mxladapter.VideoFactory{},
@@ -404,6 +405,7 @@ func main() {
retryPolicy,
mxladapter.ShouldRetry,
func(status playback.Status) {
statusStore.Observe(status)
if status.Err != nil {
log.Printf(
"video: state=%v attempt=%d failed=%d: %v",
@@ -891,11 +893,36 @@ func main() {
}
if useVideoSlot {
if videoActive {
cimgui.Text("Video state: active")
cimgui.Text("Video desired: active")
} else if videoStr != "" {
cimgui.Text("Video state: stopped")
cimgui.Text("Video desired: stopped")
} 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()
+2 -2
View File
@@ -14,7 +14,7 @@ Size=200,200
Collapsed=0
[Window][Connection]
Pos=285,503
Size=681,205
Pos=202,343
Size=799,226
Collapsed=0
+36 -1
View File
@@ -1,6 +1,9 @@
package playback
import "time"
import (
"fmt"
"time"
)
type Unit uint8
@@ -31,3 +34,35 @@ type Status struct {
}
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))
}
}
+39
View File
@@ -38,3 +38,42 @@ func TestStatusPreservesValues(t *testing.T) {
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)
}
}
}