examples: add playing-audio examples

Signed-off-by: Lilis Iskandar <lilis@veand.co>
This commit is contained in:
Lilis Iskandar 2019-12-21 12:27:56 +08:00
parent 41bf1cc99f
commit ec04384a3b
1 changed files with 85 additions and 0 deletions

View File

@ -0,0 +1,85 @@
package main
// typedef unsigned char Uint8;
// void SineWave(void *userdata, Uint8 *stream, int len);
import "C"
import (
"log"
"math"
"os"
"os/signal"
"reflect"
"syscall"
"unsafe"
"github.com/veandco/go-sdl2/sdl"
)
const (
DefaultFrequency = 16000
DefaultFormat = sdl.AUDIO_S16
DefaultChannels = 2
DefaultSamples = 512
toneHz = 440
dPhase = 2 * math.Pi * toneHz / DefaultSamples
)
//export SineWave
func SineWave(userdata unsafe.Pointer, stream *C.Uint8, length C.int) {
n := int(length) / 2
hdr := reflect.SliceHeader{Data: uintptr(unsafe.Pointer(stream)), Len: n, Cap: n}
buf := *(*[]C.ushort)(unsafe.Pointer(&hdr))
var phase float64
for i := 0; i < n; i++ {
phase += dPhase
sample := C.ushort((math.Sin(phase) + 0.999999) * 32768)
buf[i] = sample
}
}
func main() {
var dev sdl.AudioDeviceID
var err error
// Initialize SDL2
if err := sdl.Init(sdl.INIT_AUDIO); err != nil {
log.Println(err)
return
}
defer sdl.Quit()
// Specify the configuration for our default playback device
spec := sdl.AudioSpec{
Freq: DefaultFrequency,
Format: DefaultFormat,
Channels: DefaultChannels,
Samples: DefaultSamples,
Callback: sdl.AudioCallback(C.SineWave),
}
// Open default playback device
if dev, err = sdl.OpenAudioDevice("", false, &spec, nil, 0); err != nil {
log.Println(err)
return
}
defer sdl.CloseAudioDevice(dev)
// Start playback audio
sdl.PauseAudioDevice(dev, false)
// Listen to OS signals
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
// Run infinite loop until we receive SIGINT or SIGTERM!
running := true
for running {
select {
case sig := <-c:
log.Printf("Received signal %v. Exiting.\n", sig)
running = false
}
}
}