/
devices.go
95 lines (81 loc) · 1.54 KB
/
devices.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package main
// TODO:
// * keep device list up to date (handle inserting/removing new devices)
import (
"errors"
"log"
"sync"
"github.com/samuel/go-rtlsdr/rtl"
)
var (
ErrDeviceNotAvailable = errors.New("device not available")
)
type device struct {
name string
rtlIndex int
mutex sync.RWMutex
rtlDev *rtl.Device
inUse bool
sendCloseChan chan bool
}
var (
defaultDevice string
devicesMutex sync.RWMutex
devices map[string]*device
)
func init() {
devices = make(map[string]*device)
count := rtl.GetDeviceCount()
for i := 0; i < count; i++ {
name := rtl.GetDeviceName(i)
if name == "" {
log.Printf("RTL returned a blank name for index %d", i)
} else {
// TODO: handle non-unique device names
if defaultDevice == "" {
defaultDevice = name
}
devices[name] = &device{
name: name,
rtlIndex: i,
}
}
}
}
func deviceList() []*device {
devicesMutex.RLock()
defer devicesMutex.RUnlock()
devs := make([]*device, 0, len(devices))
for _, dev := range devices {
dev.mutex.Lock()
if !dev.inUse {
devs = append(devs, dev)
}
dev.mutex.Unlock()
}
return devs
}
func (dev *device) open() error {
dev.mutex.Lock()
defer dev.mutex.Unlock()
if dev.inUse {
return ErrDeviceNotAvailable
}
rdev, err := rtl.Open(dev.rtlIndex)
if err != nil {
return err
}
dev.inUse = true
dev.rtlDev = rdev
return nil
}
func (dev *device) close() {
dev.mutex.Lock()
defer dev.mutex.Unlock()
if dev.rtlDev == nil {
return
}
dev.rtlDev.Close()
dev.rtlDev = nil
dev.inUse = false
}