mirror of
https://github.com/pion/mediadevices.git
synced 2025-10-04 16:22:46 +08:00
114 lines
2.0 KiB
Go
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
|
|
}
|