-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcallbacks.go
More file actions
81 lines (68 loc) · 2.14 KB
/
callbacks.go
File metadata and controls
81 lines (68 loc) · 2.14 KB
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
package abletonlink
/*
#include "clink.h"
*/
import "C"
import "unsafe"
// Callback functions called from C - using registry to avoid CGO pointer issues
//export go_num_peers_callback
func go_num_peers_callback(numPeers C.uint64_t, context unsafe.Pointer) {
id := uintptr(context)
linkRegistryMu.RLock()
link, exists := linkRegistry[id]
linkRegistryMu.RUnlock()
if exists && link.numPeersCallback != nil {
link.numPeersCallback(uint64(numPeers))
}
}
//export go_tempo_callback
func go_tempo_callback(tempo C.double, context unsafe.Pointer) {
id := uintptr(context)
linkRegistryMu.RLock()
link, exists := linkRegistry[id]
linkRegistryMu.RUnlock()
if exists && link.tempoCallback != nil {
link.tempoCallback(float64(tempo))
}
}
//export go_start_stop_callback
func go_start_stop_callback(isPlaying C.bool, context unsafe.Pointer) {
id := uintptr(context)
linkRegistryMu.RLock()
link, exists := linkRegistry[id]
linkRegistryMu.RUnlock()
if exists && link.startStopCallback != nil {
link.startStopCallback(bool(isPlaying))
}
}
//export go_channels_changed_callback
func go_channels_changed_callback(context unsafe.Pointer) {
id := uintptr(context)
linkRegistryMu.RLock()
link, exists := linkRegistry[id]
linkRegistryMu.RUnlock()
if exists && link.channelsChangedCallback != nil {
link.channelsChangedCallback()
}
}
//export go_source_callback
func go_source_callback(samples *C.int16_t, info *C.clink_source_buffer_info, context unsafe.Pointer) {
id := uintptr(context)
sourceRegistryMu.RLock()
source, exists := sourceRegistry[id]
sourceRegistryMu.RUnlock()
if exists && source.callback != nil {
numSamples := uint64(info.num_frames) * uint64(info.num_channels)
samplesSlice := unsafe.Slice((*int16)(unsafe.Pointer(samples)), numSamples)
goInfo := SourceBufferInfo{
NumChannels: uint64(info.num_channels),
NumFrames: uint64(info.num_frames),
SampleRate: uint32(info.sample_rate),
Count: uint64(info.count),
SessionBeatTime: float64(info.session_beat_time),
SessionID: uint64(info.session_id),
Tempo: float64(info.tempo),
}
source.callback(samplesSlice, goInfo)
}
}