dev24 foundation: implement state manager, CRF/VBR modes, unified player integration
This commit is contained in:
parent
895c696b88
commit
3edb956fdf
|
|
@ -1,117 +0,0 @@
|
|||
package state
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// ConvertManager centralizes convert UI state and change notifications.
|
||||
// It is intentionally UI-agnostic; widgets should subscribe via callbacks.
|
||||
type ConvertManager struct {
|
||||
mu sync.RWMutex
|
||||
quality string
|
||||
bitrateMode string
|
||||
manualQualityOption string
|
||||
onQualityChange []func(string)
|
||||
onBitrateModeChange []func(string)
|
||||
}
|
||||
|
||||
func NewConvertManager(quality, bitrateMode, manualQualityOption string) *ConvertManager {
|
||||
if strings.TrimSpace(manualQualityOption) == "" {
|
||||
manualQualityOption = "Manual (CRF)"
|
||||
}
|
||||
return &ConvertManager{
|
||||
quality: quality,
|
||||
bitrateMode: bitrateMode,
|
||||
manualQualityOption: manualQualityOption,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *ConvertManager) Quality() string {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
return m.quality
|
||||
}
|
||||
|
||||
func (m *ConvertManager) BitrateMode() string {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
return m.bitrateMode
|
||||
}
|
||||
|
||||
func (m *ConvertManager) ManualQualityOption() string {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
return m.manualQualityOption
|
||||
}
|
||||
|
||||
func (m *ConvertManager) SetQuality(val string) bool {
|
||||
m.mu.Lock()
|
||||
if m.quality == val {
|
||||
m.mu.Unlock()
|
||||
return false
|
||||
}
|
||||
m.quality = val
|
||||
callbacks := append([]func(string){}, m.onQualityChange...)
|
||||
m.mu.Unlock()
|
||||
|
||||
for _, cb := range callbacks {
|
||||
cb(val)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *ConvertManager) SetBitrateMode(val string) bool {
|
||||
m.mu.Lock()
|
||||
if m.bitrateMode == val {
|
||||
m.mu.Unlock()
|
||||
return false
|
||||
}
|
||||
m.bitrateMode = val
|
||||
callbacks := append([]func(string){}, m.onBitrateModeChange...)
|
||||
m.mu.Unlock()
|
||||
|
||||
for _, cb := range callbacks {
|
||||
cb(val)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *ConvertManager) OnQualityChange(fn func(string)) {
|
||||
if fn == nil {
|
||||
return
|
||||
}
|
||||
m.mu.Lock()
|
||||
m.onQualityChange = append(m.onQualityChange, fn)
|
||||
m.mu.Unlock()
|
||||
}
|
||||
|
||||
func (m *ConvertManager) OnBitrateModeChange(fn func(string)) {
|
||||
if fn == nil {
|
||||
return
|
||||
}
|
||||
m.mu.Lock()
|
||||
m.onBitrateModeChange = append(m.onBitrateModeChange, fn)
|
||||
m.mu.Unlock()
|
||||
}
|
||||
|
||||
func (m *ConvertManager) IsManualQuality() bool {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
return m.quality == m.manualQualityOption
|
||||
}
|
||||
|
||||
func NormalizeBitrateMode(mode string) string {
|
||||
switch {
|
||||
case strings.HasPrefix(mode, "CRF"):
|
||||
return "CRF"
|
||||
case strings.HasPrefix(mode, "CBR"):
|
||||
return "CBR"
|
||||
case strings.HasPrefix(mode, "VBR"):
|
||||
return "VBR"
|
||||
case strings.HasPrefix(mode, "Target Size"):
|
||||
return "Target Size"
|
||||
default:
|
||||
return mode
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user