mirror of
https://github.com/pion/mediadevices.git
synced 2026-04-22 15:57:27 +08:00
Add driver.FilterAnd/Not
Simplify the logical operations in driver selection.
This commit is contained in:
committed by
Lukas Herman
parent
9917591ef4
commit
c501f06326
+8
-18
@@ -207,13 +207,11 @@ func selectBestDriver(filter driver.FilterFn, constraints MediaTrackConstraints)
|
||||
}
|
||||
|
||||
func (m *mediaDevices) selectAudio(constraints MediaTrackConstraints) (Tracker, error) {
|
||||
filter := driver.FilterAudioRecorder()
|
||||
typeFilter := driver.FilterAudioRecorder()
|
||||
filter := typeFilter
|
||||
if constraints.DeviceID != "" {
|
||||
typeFilter := driver.FilterAudioRecorder()
|
||||
idFilter := driver.FilterID(constraints.DeviceID)
|
||||
filter = func(d driver.Driver) bool {
|
||||
return typeFilter(d) && idFilter(d)
|
||||
}
|
||||
filter = driver.FilterAnd(typeFilter, idFilter)
|
||||
}
|
||||
|
||||
d, c, err := selectBestDriver(filter, constraints)
|
||||
@@ -225,15 +223,11 @@ func (m *mediaDevices) selectAudio(constraints MediaTrackConstraints) (Tracker,
|
||||
}
|
||||
func (m *mediaDevices) selectVideo(constraints MediaTrackConstraints) (Tracker, error) {
|
||||
typeFilter := driver.FilterVideoRecorder()
|
||||
screenFilter := driver.FilterDeviceType(driver.Screen)
|
||||
filter := func(d driver.Driver) bool {
|
||||
return typeFilter(d) && !screenFilter(d)
|
||||
}
|
||||
notScreenFilter := driver.FilterNot(driver.FilterDeviceType(driver.Screen))
|
||||
filter := driver.FilterAnd(typeFilter, notScreenFilter)
|
||||
if constraints.DeviceID != "" {
|
||||
idFilter := driver.FilterID(constraints.DeviceID)
|
||||
filter = func(d driver.Driver) bool {
|
||||
return typeFilter(d) && !screenFilter(d) && idFilter(d)
|
||||
}
|
||||
filter = driver.FilterAnd(typeFilter, notScreenFilter, idFilter)
|
||||
}
|
||||
|
||||
d, c, err := selectBestDriver(filter, constraints)
|
||||
@@ -247,14 +241,10 @@ func (m *mediaDevices) selectVideo(constraints MediaTrackConstraints) (Tracker,
|
||||
func (m *mediaDevices) selectScreen(constraints MediaTrackConstraints) (Tracker, error) {
|
||||
typeFilter := driver.FilterVideoRecorder()
|
||||
screenFilter := driver.FilterDeviceType(driver.Screen)
|
||||
filter := func(d driver.Driver) bool {
|
||||
return typeFilter(d) && screenFilter(d)
|
||||
}
|
||||
filter := driver.FilterAnd(typeFilter, screenFilter)
|
||||
if constraints.DeviceID != "" {
|
||||
idFilter := driver.FilterID(constraints.DeviceID)
|
||||
filter = func(d driver.Driver) bool {
|
||||
return typeFilter(d) && screenFilter(d) && idFilter(d)
|
||||
}
|
||||
filter = driver.FilterAnd(typeFilter, screenFilter, idFilter)
|
||||
}
|
||||
|
||||
d, c, err := selectBestDriver(filter, constraints)
|
||||
|
||||
@@ -34,6 +34,25 @@ func FilterDeviceType(t DeviceType) FilterFn {
|
||||
}
|
||||
}
|
||||
|
||||
// FilterAnd returns a filter function to take logical conjunction of given filters.
|
||||
func FilterAnd(filters ...FilterFn) FilterFn {
|
||||
return func(d Driver) bool {
|
||||
for _, f := range filters {
|
||||
if !f(d) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// FilterNot returns a filter function to take logical inverse of the given filter.
|
||||
func FilterNot(filter FilterFn) FilterFn {
|
||||
return func(d Driver) bool {
|
||||
return !filter(d)
|
||||
}
|
||||
}
|
||||
|
||||
// Manager is a singleton to manage multiple drivers and their states
|
||||
type Manager struct {
|
||||
drivers map[string]Driver
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package driver
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func filterTrue(d Driver) bool {
|
||||
return true
|
||||
}
|
||||
func filterFalse(d Driver) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func TestFilterNot(t *testing.T) {
|
||||
if FilterNot(filterTrue)(nil) != false {
|
||||
t.Error("FilterNot(filterTrue)() must be false")
|
||||
}
|
||||
if FilterNot(filterFalse)(nil) != true {
|
||||
t.Error("FilterNot(filterFalse)() must be true")
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterAnd(t *testing.T) {
|
||||
if FilterAnd(filterTrue, filterTrue)(nil) != true {
|
||||
t.Error("FilterAnd(filterTrue, filterTrue)() must be true")
|
||||
}
|
||||
if FilterAnd(filterTrue, filterFalse)(nil) != false {
|
||||
t.Error("FilterAnd(filterTrue, filterFalse)() must be false")
|
||||
}
|
||||
if FilterAnd(filterFalse, filterTrue)(nil) != false {
|
||||
t.Error("FilterAnd(filterFalse, filterTrue)() must be false")
|
||||
}
|
||||
if FilterAnd(filterFalse, filterFalse)(nil) != false {
|
||||
t.Error("FilterAnd(filterFalse, filterFalse)() must be false")
|
||||
}
|
||||
if FilterAnd(filterFalse, filterTrue, filterTrue)(nil) != false {
|
||||
t.Error("FilterAnd(filterFalse, filterTrue, filterTrue)() must be false")
|
||||
}
|
||||
if FilterAnd(filterTrue, filterTrue, filterTrue)(nil) != true {
|
||||
t.Error("FilterAnd(filterTrue, filterTrue, filterTrue)() must be true")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user