80 lines
2.7 KiB
Go
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
|
|
}
|