@@ -2,6 +2,8 @@ package input
22
33import (
44 "fmt"
5+ "os/exec"
6+ "runtime"
57
68 "github.com/pkg/errors"
79)
@@ -32,6 +34,55 @@ func RegisterBackend(name string, b Backend) {
3234 })
3335}
3436
37+ // Get all installed backend names.
38+ func GetAllBackendNames () []string {
39+ out := make ([]string , len (Backends ))
40+ for i , backend := range Backends {
41+ out [i ] = backend .Name
42+ }
43+ return out
44+ }
45+
46+ // Get the default backend depending on
47+ func DefaultBackend () string {
48+ switch runtime .GOOS {
49+ case "windows" :
50+ if HasBackend ("ffmpeg-dshow" ) {
51+ return "ffmpeg-dshow"
52+ }
53+
54+ case "darwin" :
55+ if backend := FindBackend ("portaudio" ); backend != nil {
56+ if HasBackend ("portaudio" ) {
57+ return "portaudio"
58+ }
59+ }
60+
61+ if HasBackend ("ffmpeg-avfoundation" ) {
62+ return "ffmpeg-avfoundation"
63+ }
64+
65+ case "linux" :
66+ if path , _ := exec .LookPath ("pw-cat" ); path != "" {
67+ if HasBackend ("pipewire" ) {
68+ return "pipewire"
69+ }
70+ }
71+
72+ if path , _ := exec .LookPath ("parec" ); path != "" {
73+ if HasBackend ("parec" ) {
74+ return "parec"
75+ }
76+ }
77+
78+ if HasBackend ("ffmpeg-alsa" ) {
79+ return "ffmpeg-alsa"
80+ }
81+ }
82+
83+ return ""
84+ }
85+
3586// FindBackend is a helper function that finds a backend. It returns nil if the
3687// backend is not found.
3788func FindBackend (name string ) Backend {
@@ -43,6 +94,15 @@ func FindBackend(name string) Backend {
4394 return nil
4495}
4596
97+ func HasBackend (name string ) bool {
98+ for _ , backend := range Backends {
99+ if backend .Name == name {
100+ return true
101+ }
102+ }
103+ return false
104+ }
105+
46106func InitBackend (bknd string ) (Backend , error ) {
47107 backend := FindBackend (bknd )
48108 if backend == nil {
0 commit comments