Major improvements to UnifiedPlayer: 1. GetFrameImage() now works when paused for responsive UI updates 2. Play() method properly starts FFmpeg process 3. Frame display loop runs continuously for smooth video display 4. Disabled audio temporarily to fix video playback fundamentals 5. Simplified FFmpeg command to focus on video stream only Player now: - Generates video frames correctly - Shows video when paused - Has responsive progress tracking - Starts playback properly Next steps: Re-enable audio playback once video is stable
119 lines
2.3 KiB
Go
119 lines
2.3 KiB
Go
package binding
|
|
|
|
type not struct {
|
|
Bool
|
|
}
|
|
|
|
var _ Bool = (*not)(nil)
|
|
|
|
// Not returns a Bool binding that invert the value of the given data binding.
|
|
// This is providing the logical Not boolean operation as a data binding.
|
|
//
|
|
// Since 2.4
|
|
func Not(data Bool) Bool {
|
|
return ¬{Bool: data}
|
|
}
|
|
|
|
func (n *not) Get() (bool, error) {
|
|
v, err := n.Bool.Get()
|
|
return !v, err
|
|
}
|
|
|
|
func (n *not) Set(value bool) error {
|
|
return n.Bool.Set(!value)
|
|
}
|
|
|
|
type and struct {
|
|
booleans
|
|
}
|
|
|
|
var _ Bool = (*and)(nil)
|
|
|
|
// And returns a Bool binding that return true when all the passed Bool binding are
|
|
// true and false otherwise. It does apply a logical and boolean operation on all passed
|
|
// Bool bindings. This binding is two way. In case of a Set, it will propagate the value
|
|
// identically to all the Bool bindings used for its construction.
|
|
//
|
|
// Since 2.4
|
|
func And(data ...Bool) Bool {
|
|
return &and{booleans: booleans{data: data}}
|
|
}
|
|
|
|
func (a *and) Get() (bool, error) {
|
|
for _, d := range a.data {
|
|
v, err := d.Get()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
if !v {
|
|
return false, nil
|
|
}
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func (a *and) Set(value bool) error {
|
|
for _, d := range a.data {
|
|
err := d.Set(value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type or struct {
|
|
booleans
|
|
}
|
|
|
|
var _ Bool = (*or)(nil)
|
|
|
|
// Or returns a Bool binding that return true when at least one of the passed Bool binding
|
|
// is true and false otherwise. It does apply a logical or boolean operation on all passed
|
|
// Bool bindings. This binding is two way. In case of a Set, it will propagate the value
|
|
// identically to all the Bool bindings used for its construction.
|
|
//
|
|
// Since 2.4
|
|
func Or(data ...Bool) Bool {
|
|
return &or{booleans: booleans{data: data}}
|
|
}
|
|
|
|
func (o *or) Get() (bool, error) {
|
|
for _, d := range o.data {
|
|
v, err := d.Get()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
if v {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
func (o *or) Set(value bool) error {
|
|
for _, d := range o.data {
|
|
err := d.Set(value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type booleans struct {
|
|
data []Bool
|
|
}
|
|
|
|
func (g *booleans) AddListener(listener DataListener) {
|
|
for _, d := range g.data {
|
|
d.AddListener(listener)
|
|
}
|
|
}
|
|
|
|
func (g *booleans) RemoveListener(listener DataListener) {
|
|
for _, d := range g.data {
|
|
d.RemoveListener(listener)
|
|
}
|
|
}
|