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
70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
package dbus
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
)
|
|
|
|
var errSignature = errors.New("dbus: mismatched signature")
|
|
|
|
// Call represents a pending or completed method call.
|
|
type Call struct {
|
|
Destination string
|
|
Path ObjectPath
|
|
Method string
|
|
Args []interface{}
|
|
|
|
// Strobes when the call is complete.
|
|
Done chan *Call
|
|
|
|
// After completion, the error status. If this is non-nil, it may be an
|
|
// error message from the peer (with Error as its type) or some other error.
|
|
Err error
|
|
|
|
// Holds the response once the call is done.
|
|
Body []interface{}
|
|
|
|
// ResponseSequence stores the sequence number of the DBus message containing
|
|
// the call response (or error). This can be compared to the sequence number
|
|
// of other call responses and signals on this connection to determine their
|
|
// relative ordering on the underlying DBus connection.
|
|
// For errors, ResponseSequence is populated only if the error came from a
|
|
// DBusMessage that was received or if there was an error receiving. In case of
|
|
// failure to make the call, ResponseSequence will be NoSequence.
|
|
ResponseSequence Sequence
|
|
|
|
// tracks context and canceler
|
|
ctx context.Context
|
|
ctxCanceler context.CancelFunc
|
|
}
|
|
|
|
func (c *Call) Context() context.Context {
|
|
if c.ctx == nil {
|
|
return context.Background()
|
|
}
|
|
|
|
return c.ctx
|
|
}
|
|
|
|
func (c *Call) ContextCancel() {
|
|
if c.ctxCanceler != nil {
|
|
c.ctxCanceler()
|
|
}
|
|
}
|
|
|
|
// Store stores the body of the reply into the provided pointers. It returns
|
|
// an error if the signatures of the body and retvalues don't match, or if
|
|
// the error status is not nil.
|
|
func (c *Call) Store(retvalues ...interface{}) error {
|
|
if c.Err != nil {
|
|
return c.Err
|
|
}
|
|
|
|
return Store(c.Body, retvalues...)
|
|
}
|
|
|
|
func (c *Call) done() {
|
|
c.Done <- c
|
|
c.ContextCancel()
|
|
}
|