From e34a7b6fe359509fa4cbcfcc5cfcfd43654b51c1 Mon Sep 17 00:00:00 2001 From: Lukas Herman Date: Wed, 1 Jan 2020 17:27:28 -0800 Subject: [PATCH] Add video driver state management --- pkg/driver/camera_linux.go | 8 +++-- pkg/driver/wrapper.go | 60 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/pkg/driver/camera_linux.go b/pkg/driver/camera_linux.go index e3cfce2..877b2d3 100644 --- a/pkg/driver/camera_linux.go +++ b/pkg/driver/camera_linux.go @@ -96,15 +96,17 @@ func (c *camera) Start(setting VideoSetting, cb DataCb) error { case *webcam.Timeout: continue default: - return err + // Camera has been stopped. We don't need to return an error. + return nil } frame, err := c.cam.ReadFrame() if err != nil { - // TODO: Add a better error handling - return err + // Camera has been stopped. We don't need to return an error. + return nil } + // Frame is not ready. if len(frame) == 0 { continue } diff --git a/pkg/driver/wrapper.go b/pkg/driver/wrapper.go index aa29d03..04c1d90 100644 --- a/pkg/driver/wrapper.go +++ b/pkg/driver/wrapper.go @@ -2,6 +2,8 @@ package driver import uuid "github.com/satori/go.uuid" +import "fmt" + func wrapAdapter(a Adapter) Driver { var d Driver id := uuid.NewV4().String() @@ -37,6 +39,64 @@ func (w *videoAdapterWrapper) Status() 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 type audioAdapterWrapper struct { AudioAdapter