Skip to content

Instantly share code, notes, and snippets.

@erikh
Created March 22, 2020 14:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save erikh/49885a869ea610a82d57a8c1e8cf2b2c to your computer and use it in GitHub Desktop.
Save erikh/49885a869ea610a82d57a8c1e8cf2b2c to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"os"
"path/filepath"
"time"
"github.com/veandco/go-sdl2/sdl"
)
type WavFile struct {
as *sdl.AudioSpec
byt []byte
key string
}
var wavMap map[uint8]*WavFile = map[uint8]*WavFile{}
func init() {
fmt.Println("loading wav map...")
// this map is used to load the wavs and map them to buttons. Each value is
// also unique so they can be reverse-mapped.
for key, button := range map[string]uint8{
"a": sdl.CONTROLLER_BUTTON_A,
"b": sdl.CONTROLLER_BUTTON_B,
"x": sdl.CONTROLLER_BUTTON_X,
"y": sdl.CONTROLLER_BUTTON_Y,
"l1": sdl.CONTROLLER_BUTTON_LEFTSHOULDER,
"r1": sdl.CONTROLLER_BUTTON_RIGHTSHOULDER,
"d_up": 11,
"d_down": 12,
"d_left": 13,
"d_right": 14,
"back": sdl.CONTROLLER_BUTTON_BACK,
"home": sdl.CONTROLLER_BUTTON_GUIDE,
"start": sdl.CONTROLLER_BUTTON_START,
"l3": sdl.CONTROLLER_BUTTON_LEFTSTICK,
"r3": sdl.CONTROLLER_BUTTON_RIGHTSTICK,
} {
path := filepath.Join("sounds", key+".wav")
if _, err := os.Stat(path); err == nil {
byt, as := sdl.LoadWAV(path)
fmt.Printf("storing new wav %q (%q) as %d\n", key, path, button)
wavMap[button] = &WavFile{as: as, byt: byt, key: key}
}
}
}
func main() {
keyChan := make(chan sdl.Event)
sdl.Main(func() {
// Video must be initialized to do the rest of the work; without video SDL doesn't function.
sdl.Init(sdl.INIT_JOYSTICK | sdl.INIT_GAMECONTROLLER | sdl.INIT_AUDIO | sdl.INIT_EVENTS | sdl.INIT_VIDEO)
x, err := sdl.GetNumVideoDrivers()
if err != nil {
panic(err)
}
for i := 0; i < x; i++ {
driver := sdl.GetVideoDriver(i)
if err := sdl.VideoInit(driver); err == nil {
break
}
}
sdl.CreateWindow("project scarlett", 0, 0, 0, 0, 0)
go func() {
for {
time.Sleep(10 * time.Millisecond)
ev := sdl.PollEvent()
keyChan <- ev
}
}()
defer sdl.Quit()
if err := sdl.AudioInit("pulseaudio"); err != nil {
panic(err)
}
fmt.Println(sdl.GetCurrentAudioDriver())
defer sdl.AudioQuit()
as := &sdl.AudioSpec{}
id, err := sdl.OpenAudioDevice("", false, as, as, 0)
if err == nil {
sdl.CloseAudioDevice(id)
} else {
panic(err)
}
for i := 0; i < sdl.NumJoysticks(); i++ {
if sdl.IsGameController(i) {
sdl.GameControllerOpen(i)
}
}
sdl.GameControllerEventState(sdl.ENABLE)
for ev := range keyChan {
switch button := ev.(type) {
case *sdl.ControllerButtonEvent:
if button.State != sdl.PRESSED {
continue
}
fmt.Println(button.Button, "pressed")
sdl.PauseAudioDevice(id, true)
sdl.CloseAudioDevice(id)
wav, ok := wavMap[button.Button]
if ok {
fmt.Println("Dispatching", wav.key)
if wav.as != nil && wav.byt != nil {
var err error
id, err = sdl.OpenAudioDevice("", false, wav.as, wav.as, 0)
if err != nil {
fmt.Println(err)
continue
}
sdl.PauseAudioDevice(id, false)
if err := sdl.QueueAudio(id, wav.byt); err != nil {
fmt.Println(err)
}
}
}
}
}
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment