Kirika/cgo/audio.go
2022-05-20 17:23:50 +02:00

80 lines
2.7 KiB
Go

//go:build cgo
package cgo
/*
#cgo CFLAGS: -march=native -Ofast -std=c99
#include "audio.h"
*/
import "C"
import "unsafe"
//MultipleChannelsToMono bring any number of channels to mono, equally weighted, reusing buffer backwards
func MultipleChannelsToMono(buffer []float32, channels int) (buf []float32) {
buf = make([]float32, len(buffer)/channels)
C.audio_multiple_channels_to_mono((*C.float)(&buffer[0]), C.size_t(len(buffer)), (*C.float)(&buf[0]), C.int(channels))
return
}
//MultipleChannelsToStereo bring any number of channels to stereo, using downmix formulas when necessary
func MultipleChannelsToStereo(buffer []float32, channels int) (buf []float32) {
buf = make([]float32, (len(buffer)/channels)*2)
C.audio_multiple_channels_to_stereo((*C.float)(&buffer[0]), C.size_t(len(buffer)), (*C.float)(&buf[0]), C.int(channels))
return
}
func BytesToInt32(data []byte, bitDepth int) (buf []int32) {
buf = make([]int32, len(data)/(bitDepth/8))
C.audio_bytes_to_int32((*C.int8_t)(unsafe.Pointer(&data[0])), C.size_t(len(data)), (*C.int32_t)(&buf[0]), C.int(bitDepth))
return
}
func Int32ToFloat32(data []int32, bitDepth int) (buf []float32) {
buf = make([]float32, len(data))
C.audio_int32_to_float32((*C.int32_t)(&data[0]), C.size_t(len(data)), (*C.float)(&buf[0]), C.int(bitDepth))
return
}
//Int24ToFloat32 special case
func Int24ToFloat32(data []byte, bitDepth int) (buf []float32) {
buf = make([]float32, len(data)/3)
C.audio_int24_to_float32((*C.int8_t)(unsafe.Pointer(&data[0])), C.size_t(len(data)), (*C.float)(&buf[0]), C.int(bitDepth))
return
}
func Int16ToFloat32(data []int16, bitDepth int) (buf []float32) {
buf = make([]float32, len(data))
C.audio_int16_to_float32((*C.int16_t)(&data[0]), C.size_t(len(data)), (*C.float)(&buf[0]), C.int(bitDepth))
return
}
func Int8ToFloat32(data []int8, bitDepth int) (buf []float32) {
buf = make([]float32, len(data))
C.audio_int8_to_float32((*C.int8_t)(&data[0]), C.size_t(len(data)), (*C.float)(&buf[0]), C.int(bitDepth))
return
}
func Float32ToInt32(data []float32, bitDepth int) (buf []int32) {
buf = make([]int32, len(data))
C.audio_float32_to_int32((*C.float)(&data[0]), C.size_t(len(data)), (*C.int32_t)(&buf[0]), C.int(bitDepth))
return
}
func Float32ToInt24(data []float32) (buf []byte) {
buf = make([]byte, len(data)*3)
C.audio_float32_to_int24((*C.float)(&data[0]), C.size_t(len(data)), (*C.int8_t)(unsafe.Pointer(&buf[0])))
return
}
func Float32ToInt16(data []float32) (buf []int16) {
buf = make([]int16, len(data))
C.audio_float32_to_int16((*C.float)(&data[0]), C.size_t(len(data)), (*C.int16_t)(&buf[0]))
return
}
func Float32ToInt8(data []float32) (buf []int8) {
buf = make([]int8, len(data))
C.audio_float32_to_int8((*C.float)(&data[0]), C.size_t(len(data)), (*C.int8_t)(&buf[0]))
return
}