bindings for attaching/detaching mixed audio processor

This commit is contained in:
agrigoryan 2024-09-30 01:44:08 -04:00
parent 6bc3d79c96
commit c2c8150de9

View file

@ -16,13 +16,33 @@ static void audioStreamWrapperCallback(void *data, unsigned int frames) {
static void setAudioStreamCallbackWrapper(AudioStream stream) { static void setAudioStreamCallbackWrapper(AudioStream stream) {
SetAudioStreamCallback(stream, audioStreamWrapperCallback); SetAudioStreamCallback(stream, audioStreamWrapperCallback);
} }
extern void internalAudioMixedProcessorGo(void *, int);
static void audioMixedProcessorCallback(void *data, unsigned int frames) {
internalAudioMixedProcessorGo(data, frames);
}
static void setAudioMixedProcessorCallbackWrapper() {
AttachAudioMixedProcessor(audioMixedProcessorCallback);
}
static void unsetAudioMixedProcessorCallbackWrapper() {
DetachAudioMixedProcessor(audioMixedProcessorCallback);
}
*/ */
import "C" import "C"
import ( import (
"reflect"
"sync"
"unsafe" "unsafe"
) )
var internalAudioStreamCallback AudioCallback var (
internalAudioStreamCallback AudioCallback
audioMixedProcessorsMutex = sync.RWMutex{}
audioMixedProcessors = []AudioCallback{}
)
// SetAudioStreamCallback - Audio thread callback to request new data // SetAudioStreamCallback - Audio thread callback to request new data
func SetAudioStreamCallback(stream AudioStream, callback AudioCallback) { func SetAudioStreamCallback(stream AudioStream, callback AudioCallback) {
@ -37,6 +57,41 @@ func internalAudioStreamCallbackGo(data unsafe.Pointer, frames C.int) {
} }
} }
func AttachAudioMixedProcessor(callback AudioCallback) {
audioMixedProcessorsMutex.Lock()
defer audioMixedProcessorsMutex.Unlock()
if len(audioMixedProcessors) == 0 {
C.setAudioMixedProcessorCallbackWrapper()
}
audioMixedProcessors = append(audioMixedProcessors, callback)
}
func DetachAudioMixedProcessor(callback AudioCallback) {
audioMixedProcessorsMutex.Lock()
defer audioMixedProcessorsMutex.Unlock()
callbackPtr := reflect.ValueOf(callback).Pointer()
for i := len(audioMixedProcessors) - 1; i >= 0; i-- {
if reflect.ValueOf(audioMixedProcessors[i]).Pointer() == callbackPtr {
audioMixedProcessors = append(audioMixedProcessors[:i], audioMixedProcessors[i+1:]...)
break
}
}
if len(audioMixedProcessors) == 0 {
C.unsetAudioMixedProcessorCallbackWrapper()
}
}
//export internalAudioMixedProcessorGo
func internalAudioMixedProcessorGo(data unsafe.Pointer, frames C.int) {
for _, callback := range audioMixedProcessors {
callback(unsafe.Slice((*float32)(data), frames), int(frames))
}
}
// newWaveFromPointer - Returns new Wave from pointer // newWaveFromPointer - Returns new Wave from pointer
func newWaveFromPointer(ptr unsafe.Pointer) Wave { func newWaveFromPointer(ptr unsafe.Pointer) Wave {
return *(*Wave)(ptr) return *(*Wave)(ptr)