Add video driver state management

This commit is contained in:
Lukas Herman
2020-01-01 17:27:28 -08:00
parent 9268d78ef9
commit e34a7b6fe3
2 changed files with 65 additions and 3 deletions

View File

@@ -96,15 +96,17 @@ func (c *camera) Start(setting VideoSetting, cb DataCb) error {
case *webcam.Timeout: case *webcam.Timeout:
continue continue
default: default:
return err // Camera has been stopped. We don't need to return an error.
return nil
} }
frame, err := c.cam.ReadFrame() frame, err := c.cam.ReadFrame()
if err != nil { if err != nil {
// TODO: Add a better error handling // Camera has been stopped. We don't need to return an error.
return err return nil
} }
// Frame is not ready.
if len(frame) == 0 { if len(frame) == 0 {
continue continue
} }

View File

@@ -2,6 +2,8 @@ package driver
import uuid "github.com/satori/go.uuid" import uuid "github.com/satori/go.uuid"
import "fmt"
func wrapAdapter(a Adapter) Driver { func wrapAdapter(a Adapter) Driver {
var d Driver var d Driver
id := uuid.NewV4().String() id := uuid.NewV4().String()
@@ -37,6 +39,64 @@ func (w *videoAdapterWrapper) Status() State {
return w.state return w.state
} }
func (w *videoAdapterWrapper) Open() error {
if w.state != StateClosed {
return fmt.Errorf("invalid state: driver is already opened")
}
err := w.VideoAdapter.Open()
if err == nil {
w.state = StateOpened
}
return err
}
func (w *videoAdapterWrapper) Close() error {
err := w.VideoAdapter.Close()
if err == nil {
w.state = StateClosed
}
return err
}
func (w *videoAdapterWrapper) Start(setting VideoSetting, cb DataCb) error {
if w.state == StateClosed {
return fmt.Errorf("invalid state: driver hasn't been opened")
}
if w.state == StateStarted {
return fmt.Errorf("invalid state: driver has been started")
}
prevState := w.state
w.state = StateOpened
err := w.VideoAdapter.Start(setting, cb)
if err != nil {
w.state = prevState
}
return err
}
func (w *videoAdapterWrapper) Stop() error {
if w.state != StateStarted {
return fmt.Errorf("invalid state: driver hasn't been started")
}
err := w.VideoAdapter.Stop()
if err == nil {
w.state = StateStopped
}
return err
}
func (w *videoAdapterWrapper) Settings() []VideoSetting {
if w.state == StateClosed {
return nil
}
return w.VideoAdapter.Settings()
}
// TODO: Add state validation // TODO: Add state validation
type audioAdapterWrapper struct { type audioAdapterWrapper struct {
AudioAdapter AudioAdapter