mirror of
https://github.com/pion/mediadevices.git
synced 2025-10-06 17:16:56 +08:00
Add video driver state management
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user