go-sdl2-examples/examples/audio/audio.go

58 lines
1.1 KiB
Go

package main
// typedef unsigned char Uint8;
// void SineWave(void *userdata, Uint8 *stream, int len);
import "C"
import (
"log"
"math"
"reflect"
"unsafe"
"github.com/veandco/go-sdl2/sdl"
)
const (
toneHz = 440
sampleHz = 48000
dPhase = 2 * math.Pi * toneHz / sampleHz
)
//export SineWave
func SineWave(userdata unsafe.Pointer, stream *C.Uint8, length C.int) {
n := int(length)
hdr := reflect.SliceHeader{Data: uintptr(unsafe.Pointer(stream)), Len: n, Cap: n}
buf := *(*[]C.Uint8)(unsafe.Pointer(&hdr))
var phase float64
for i := 0; i < n; i += 2 {
phase += dPhase
sample := C.Uint8((math.Sin(phase) + 0.999999) * 128)
buf[i] = sample
buf[i+1] = sample
}
}
func main() {
if err := sdl.Init(sdl.INIT_AUDIO); err != nil {
log.Println(err)
return
}
defer sdl.Quit()
spec := &sdl.AudioSpec{
Freq: sampleHz,
Format: sdl.AUDIO_U8,
Channels: 2,
Samples: sampleHz,
Callback: sdl.AudioCallback(C.SineWave),
}
if err := sdl.OpenAudio(spec, nil); err != nil {
log.Println(err)
return
}
sdl.PauseAudio(false)
sdl.Delay(5000) // play audio for long enough to understand whether it works
sdl.CloseAudio()
}