Created
March 22, 2020 14:51
-
-
Save erikh/49885a869ea610a82d57a8c1e8cf2b2c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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