Files
mediadevices/pkg/driver/wrapper.go
2020-01-05 22:12:44 -08:00

114 lines
2.0 KiB
Go

package driver
import uuid "github.com/satori/go.uuid"
import "fmt"
func wrapAdapter(a Adapter) Driver {
var d Driver
id := uuid.NewV4().String()
switch v := a.(type) {
case VideoAdapter:
d = &videoAdapterWrapper{
VideoAdapter: v,
id: id,
}
case AudioAdapter:
d = &audioAdapterWrapper{
AudioAdapter: v,
id: id,
}
}
return d
}
// TODO: Add state validation
type videoAdapterWrapper struct {
VideoAdapter
id string
state State
}
func (w *videoAdapterWrapper) ID() string {
return w.id
}
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
id string
state State
}
func (w *audioAdapterWrapper) ID() string {
return w.id
}
func (w *audioAdapterWrapper) Status() State {
return w.state
}